ELK基本信息
ELK是三個開源軟件的縮寫嬉荆,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟件。
Elasticsearch是個開源分布式搜索引擎酷含,提供搜集鄙早、分析汪茧、存儲數據三大功能。它的特點有:分布式蝶锋,零配置陆爽,自動發(fā)現(xiàn),索引自動分片扳缕,索引副本機制慌闭,restful風格接口,多數據源躯舔,自動搜索負載等驴剔。
Logstash 主要是用來日志的搜集、分析粥庄、過濾日志的工具丧失,支持大量的數據獲取方式。一般工作方式為c/s架構惜互,client端安裝在需要收集日志的主機上布讹,server端負責將收到的各節(jié)點日志進行過濾、修改等操作在一并發(fā)往elasticsearch上去训堆。
Kibana 也是一個開源和免費的工具描验,Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助匯總坑鱼、分析和搜索重要數據日志膘流。
官方文檔
Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/current/index.html
Kibana:
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/current/index.html
Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
elasticsearch中文社區(qū):
https://elasticsearch.cn/
Elasticsearch
Near Realtime (NRT)
Elasticsearch是一個近乎實時的搜索平臺。這意味著從索引文檔到可以搜索的時間只有輕微的延遲(通常是1秒)鲁沥。
Cluster
集群是一個或多個節(jié)點(服務器)的集合呼股,它們共同保存你的整個數據,并提供跨所有節(jié)點的聯(lián)合索引和搜索功能画恰。一個集群由一個唯一的名稱標識彭谁,默認這個唯一標識的名稱是"elasticsearch"。這個名稱很重要允扇,因為如果節(jié)點被設置為按其名稱加入集群缠局,那么節(jié)點只能是集群的一部分。
確保不要在不同的環(huán)境中用相同的集群名稱蔼两,否則可能導致節(jié)點加入到錯誤的集群中。例如逞度,你可以使用"logging-dev", "logging-test", "logging-prod"分別用于開發(fā)额划、測試和正式集群的名字。
Node
節(jié)點是一個單獨的服務器档泽,它是集群的一部分俊戳,存儲數據揖赴,并參與集群的索引和搜索功能。就像集群一樣抑胎,節(jié)點由一個名稱來標識燥滑,默認情況下,該名稱是在啟動時分配給節(jié)點的隨機通用唯一標識符(UUID)阿逃。如果不想用默認的節(jié)點名铭拧,可以定義任何想要的節(jié)點名。這個名稱對于管理來說很重要恃锉,因為你希望識別網絡中的哪些服務器對應于你的Elasticsearch集群中的哪些節(jié)點搀菩。
一個節(jié)點可以通過配置集群名稱來加入到一個特定的集群中。默認情況下破托,每個節(jié)點都被設置加入到一個名字叫"elasticsearch"的集群中肪跋,這就意味著如果你啟動了很多個節(jié)點,并且假設它們彼此可以互相發(fā)現(xiàn)土砂,那么它們將自動形成并加入到一個名為"elasticsearch"的集群中州既。
一個集群可以有任意數量的節(jié)點。此外萝映,如果在你的網絡上當前沒有運行任何節(jié)點吴叶,那么此時啟動一個節(jié)點將默認形成一個單節(jié)點的名字叫"elasticsearch"的集群。
Index
索引是具有某種相似特征的文檔的集合锌俱。例如晤郑,你可以有一個顧客數據索引,產品目錄索引和訂單數據索引贸宏。索引有一個名稱(必須是小寫的)標識造寝,該名稱用于在對其中的文檔執(zhí)行索引、搜索吭练、更新和刪除操作時引用索引诫龙。
Document
文檔是可以被索引的基本信息單元。文檔用JSON表示鲫咽。
Shards & Replicas
一個索引可能存儲大量數據签赃,這些數據可以超過單個節(jié)點的硬件限制。例如分尸,一個包含10億條文檔占用1TB磁盤空間的索引可能不適合在單個節(jié)點上锦聊,或者可能太慢而不能單獨處理來自單個節(jié)點的搜索請求。
為了解決這個問題箩绍,Elasticsearch提供了將你的索引細分為多個碎片(或者叫分片)的能力孔庭。在創(chuàng)建索引時,可以簡單地定義所需的分片數量。每個分片本身就是一個功能完全獨立的“索引”圆到,可以駐留在集群中的任何節(jié)點上怎抛。
分片之所以重要,主要有兩個原因:
它允許你水平地分割/擴展內容卷
它允許你跨分片(可能在多個節(jié)點上)分布和并行操作芽淡,從而提高性能和吞吐量
在一個網絡/云環(huán)境中隨時都有可能出現(xiàn)故障马绝,強烈推薦你有一個容災機制。Elasticsearch允許你將一個或者多個索引分片復制到其它地方挣菲,這被稱之為副本富稻。
復制之所以重要,有兩個主要原因:
它提供了在一個shard/node失敗是的高可用性己单。出于這個原因唉窃,很重要的一個點是一個副本從來不會被分配到與它復制的原始分片相同節(jié)點上。也就是說纹笼,副本是放到另外的節(jié)點上的纹份。
它允許擴展搜索量/吞吐量,因為搜索可以在所有副本上并行執(zhí)行廷痘。
總而言之蔓涧,每個索引都可以分割成多個分片。索引也可以被復制零(意味著沒有副本)或更多次笋额。一旦被復制元暴,每個索引都將具有主分片(被復制的原始分片)和副本分片(主分片的副本)。在創(chuàng)建索引時兄猩,可以為每個索引定義分片和副本的數量茉盏。創(chuàng)建索引后,您可以隨時動態(tài)地更改副本的數量枢冤,但不能更改事后分片的數量鸠姨。
在默認情況下,Elasticsearch中的每個索引都分配了5個主分片和1個副本淹真,這意味著如果集群中至少有兩個節(jié)點讶迁,那么索引將有5個主分片和另外5個副本分片(PS:這5個副本分片組成1個完整副本),每個索引總共有10個分片核蘸。
Kibana
Kibana是一個Web應用程序巍糯,你可以通過5601來訪問它。例如:localhost:5601 或者 http://YOURDOMAIN.com:5601
當訪問Kibana時客扎,默認情況下祟峦,Discover頁面加載時選擇了默認索引模式。時間過濾器設置為最近15分鐘徙鱼,搜索查詢設置為match-all(*)
Logstash
Logstash是一個開源的服務器端數據處理管道宅楞,可以同時從多個數據源獲取數據,并對其進行轉換,然后將其發(fā)送到你最喜歡的“存儲”咱筛。(當然,我們最喜歡的是Elasticsearch)
輸入:采集各種樣式杆故、大小和來源的數據
過濾器:實時解析和轉換數據
數據從源傳輸到存儲庫的過程中迅箩,Logstash 過濾器能夠解析各個事件,識別已命名的字段以構建結構处铛,并將它們轉換成通用格式饲趋,以便更輕松、更快速地分析和實現(xiàn)商業(yè)價值撤蟆。
Logstash 能夠動態(tài)地轉換和解析數據奕塑,不受格式或復雜度的影響:
- 利用 Grok 從非結構化數據中派生出結構
- 從 IP 地址破譯出地理坐標
- 將 PII 數據匿名化,完全排除敏感字段
- 整體處理不受數據源家肯、格式或架構的影響
輸出:選擇你的存儲龄砰,導出你的數據
盡管 Elasticsearch 是我們的首選輸出方向,能夠為我們的搜索和分析帶來無限可能讨衣,但它并非唯一選擇换棚。Logstash 提供眾多輸出選擇,您可以將數據發(fā)送到您要指定的地方反镇,并且能夠靈活地解鎖眾多下游用例固蚤。
安裝Logstash
可以直接從官網上下載安裝包(Java環(huán)境需要JDK),也可以使用docker鏡像
首先歹茶,讓我們通過最基本的Logstash管道來測試一下剛才安裝的Logstash
Logstash管道有兩個必需的元素夕玩,輸入和輸出,以及一個可選元素過濾器惊豺。輸入插件從數據源那里消費數據燎孟,過濾器插件根據你的期望修改數據,輸出插件將數據寫入目的地扮叨。
我們可以通過命令行的形式進行測試缤弦,也可以配置配置文件
./bin/logstash -e 'input { stdin {} } output { stdout {} }'
或者新建一個配置文件,然后讀取配置文件
./bin/logstash -f ./config/newconfig.conf
Logstash 解析日志
在上一小節(jié)中彻磁,你已經創(chuàng)建了一個基本的Logstash管道來測試你的Logstash設置碍沐。在現(xiàn)實世界中,一個Logstash管理會稍微復雜一些:它通常有一個或多個input, filter 和 output 插件衷蜓。
在這一小節(jié)中累提,你將創(chuàng)建一個Logstash管道,并且使用Filebeat將Apache Web日志作為input磁浇,解析這些日志斋陪,然后將解析的數據寫到一個Elasticsearch集群中。你將在配置文件中定義管道,而不是在命令行中定義管道配置无虚。
(在GitHub上有一些案例可以供我們進行練習)https://github.com/elastic/examples
1.安裝并配置filebeat,在filebeat安裝目錄下新建.yml文件
filebeat.inputs:
- type: log
paths:
- /var/log/*.log
output.logstash:
hosts: ["localhost:5048"]
paths的可以進行調整缔赠,放置將要進行解析的日志文件
2.在logstash目錄下新建一個文件first-pipeline.conf(不一定在安裝目錄下)具體配置如下:
3.檢查配置并啟動Logstash
./bin/logstash -f ./config/myconfig.conf --config.test_and_exit
./bin/logstash -f ./config/myconfig.conf --config.reload.automatic
(
--config.test_and_exit選項的意思是解析配置文件并報告任何錯誤
--config.reload.automatic選項的意思是啟用自動配置加載,以至于每次你修改完配置文件以后無需停止然后重啟Logstash
)
4.啟動filebeat
./filebeat -e -c filebeat-new1.yml -d "publish"
./filebeat -c filebeat-new1.yml
在Logstash控制臺上會出現(xiàn)
用Grok過濾器插件解析日志
現(xiàn)在你有了一個工作管道友题,可以從Filebeat讀取日志行嗤堰。但是你可能已經注意到日志消息的格式并不理想。你想要解析日志消息度宦,以便從日志中創(chuàng)建特定的踢匣、命名的字段。為此戈抄,您將使用grok filter插件离唬。
grok 過濾器插件是Logstash中默認可用的幾個插件之一。
grok 過濾器插件允許你將非結構化日志數據解析為結構化和可查詢的數據划鸽。
因為 grok 過濾器插件在傳入的日志數據中查找模式
為了解析數據输莺,你可以用 %{COMBINEDAPACHELOG} grok pattern ,這種模式(或者說格式)的schema如下
修改Logstash下的newconfig.conf 配置如下:
input {
beats {
port => "5048"
}
}
filter {
grok {
match => {"message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
locale => en
}
geoip {
source => "clientip"
}
}
output {
stdout { codec => rubydebug }
}
清理filebeat目錄下的data/data/registry/下的filebeat,刪除即可裸诽,重啟filebeat
./filebeat -e -c filebeat-new1.yml -d "publish"
會有以下的結果:
"message" => "3.149.9.216 - - [17/May/2015:10:05:12 +0000] \"GET /presentations/logstash-monitorama-2013/plugin/zoom-js/zoom.js HTTP/1.1\" 200 7697 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
"clientip" => "3.149.9.216",
"referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
"geoip" => {
"country_code3" => "US",
"continent_code" => "NA",
"location" => {
"lat" => 37.751,
"lon" => -97.822
},
"latitude" => 37.751,
"longitude" => -97.822,
"country_name" => "United States",
"country_code2" => "US",
"ip" => "3.149.9.216"
之后我們可以利用Elasticsearch和Kibana進行demo的演示
所需要的log文件在GitHub上有地址
新建Logstash下的apache_logstash.conf 配置如下:
input {
beats {
port=>"5048"
}
}
filter {
grok {
match => {
"message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}'
}
}
date {
match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
locale => en
}
geoip {
source => "clientip"
}
# useragent {
# # source => "agent"
# # target => "useragent"
# }
}
output {
stdout {
codec => dots {}
}
elasticsearch {
index => "my_test3"
template => "./apache_template.json"
template_name => "my_test3"
template_overwrite => true
}
}
啟動Logstash
./bin/logstash -f ./config/apache_logstash.conf --config.reload.automatic
清理filebeat目錄下的data/data/registry/下的filebeat,刪除即可模闲,重啟filebeat
./filebeat -e -c filebeat-new2.yml -d "publish"
之后就可以通過Elasticsearch和Kinana 進行可視化的展示了。
Logstash 導入數據
可以在Kibana下的Management/Saved objects進行模板導入(這里是模版)
Logstash 配置監(jiān)控
在Logstash安裝目錄下的logstash.yml文件中輸入(具體詳細可以參考這里)
xpack.monitoring.elasticsearch.hosts: ["http://localhost:9200"]
之后可以在Kibana進行監(jiān)控崭捍,這需要重新錄入以下數據尸折,
然后在Stack Monitor 中可以看到之前的數據了