快速搭建日誌系統——ELK STACK
什麼是ELK STACK
ELK Stack是Elasticserach、Logstash、Kibana三種工具組合而成的一個日誌解決方案。ELK可以將我們的系統日誌、訪問日誌、執行日誌、錯誤日誌等進行統一收集、儲存分析和搜尋以及圖形展現。相比傳統的CTRL+F或者資料庫語句來進行資料查詢,ELK支援分散式搜搜,資料量可達PB級別,檢索速度更快速,接近實時處理,並且更智慧,可以去掉一些沒有特殊含義的詞彙,比如“這,的,是”,還可以進行搜尋補全與搜尋糾錯。
LogStash:
負責日誌的收集,並且可以輸出到指定位置,如Redis、kafka、以及最主要的ElasticSearch中,通常會在所有需要收集日誌的伺服器上安裝Logstash,然後由Logstash agent端傳送到Logstash的Server端
ElasticSearch:
使用JAVA開發、基於Lucene搜尋引擎庫的全文搜尋工具,通過RESTful API(一種介面設計規範,讓介面更易懂)隱藏了Lucene原本的複雜性。實現了日誌資料的分散式、實時分析,並且可以進行搜尋補全與糾錯等功能,是ELK最核心的元件。相比MySQL庫和表的概念,在ES中把庫叫做索引。
Kibana:
負責資料的展示與統計,是一個圖形化的管理系統。
下面一一介紹這幾個系統的安裝搭建。
一、安裝Elasticsearch:
1、ElasticSearch預設工作在叢集模式下,擴充套件性很強,並且支援自動發現。所以在實驗環境中需要至少2臺伺服器來搭建,但是為了防止腦裂,建立使用基數臺伺服器。在部署ElasticSearch前需要先部署JAVA環境,所以第一步是安裝JDK,這裡偷懶使用yum安裝了openjdk,生產環境還是建議用JDK的原始碼包(暫時不支援JDK 9)。
1 yum install java-1.8.0-openjdk.x86_64
2、下載ElasticSearch,官網地址是www.elastic.co(不是com),其每個Products下都有專門的文件用於參考。
下載tar包解壓,然後進入config目錄,該目錄下除了有一個主配置檔案elasticsearch.yml需要配置外,還有一個jvm.options檔案用於JVM的調優
1 tar zxf elasticsearch-6.3.tar.gz 2 3 cd elasticsearch-6.3/config
jvm.options檔案主要是JVM優化相關,關於垃圾回收這塊使用預設配置就可以了,我們要調整的就是最大記憶體和最小記憶體的設定。通常設定為一樣大小,具體的值可以設定為系統最大記憶體的一半或三分之二
1 -Xms1g #程式啟動時佔用記憶體的大小 2 3 -Xmx1g #程式啟動後最大可佔用記憶體的大小
3、修改ElasticSearch的配置,編輯elasticsearch.yml
1 cluster.name: my-application #叢集名稱,相同叢集名稱的節點會自動加入到該叢集 2 3 node.name: r1 #節點名稱,兩個節點不能重複 4 5 path.data: /path/to/data #指定資料儲存目錄 6 7 path.logs: /path/to/logs #指定日誌儲存目錄 8 9 network.host: 0.0.0.0 #本機地址或者4個0 10 11 http.port: 9200 #指定埠 12 13 discovery.zen.ping.unicast.hosts: ["192.168.44.130"] #叢集中master節點初始化列表,通過列表中的機器來自動發現其他節點
3、執行bin/elasticsearch 啟動服務(加-d是在後臺執行)。啟動後服務會監聽在9200埠,還有個9300埠用於叢集間通訊。如果配置檔案中監聽的埠是外網地址,在執行Elasticsearch時會遇到一些核心報錯,具體報錯和解決方法如下(做好配置後,需要登出使用者重新登入才會生效):
(1)don't run elasticsearch as root:
解決辦法:Elasticsearch是不允許使用root使用者來執行的,所以需要把ElasticSearch目錄所有者修改為其他使用者,並切換到該使用者去執行。用瀏覽器開啟能看到如下資訊代表安裝成功:
(2)Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12):
解決辦法:記憶體不足,升級記憶體
(3)Exception in thread "main" java.nio.file.AccessDeniedException
解決辦法:執行Elasticsearch程式的使用者許可權不夠,把Elasticsearch目錄許可權修改下即可
(4)max virtual memory areas vm.max_map_count [65530] is too low解決辦法:修改/etc/sysctl.conf,增加一行vm.max_map_count= 262144。然後執行sysctl -p使其生效
(5)max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]解決辦法:修改/etc/security/limits.conf,做以下配置
1 * soft nproc 65536 2 * hard nproc 65536 3 * soft nofile 65536 4 * hard nofile 65536
(6)max number of threads [3812] for user [elkuser] is too low, increase to at least [4096]
解決辦法:修改/etc/security/limits.d/20-nproc.conf,做以下配置
1 * soft nproc 4096 2 * hard nproc 4096
Elasticsearch介面說明:
ES啟動後如何驗證節點是否在叢集中呢?ES是使用RESTful形式的介面對外提供訪問,所以我們要訪問ES介面的話可以使用curl命令。ES有四類API,作用大概如下:
1、用來檢查叢集節點、索引當前狀態
2、管理叢集節點、索引及元資料
3、執行增刪改查操作
4、執行高階操作,例如paging,filtering
Elasticsearch 常用API有cat、cluster等,下面是一些簡單介紹:
通過curl可以看到cat這個API下有很多子功能
1、Elasticsearch叢集健康檢查:
通過cat、cluster兩個API都可以進行叢集健康檢查,green代表叢集完全正常;yellow代表叢集正常,部分副本分片不正常;red代表叢集故障,資料可能會丟失
1 http://localhost:9200/_cat/health 2 3 http://localhost:9200/_cat/health?v #顯示資訊更詳盡 4 5 http://localhost:9200/_cluster/health 6 7 http://localhost:9200/_cluster/health?pretty(加上pretty會將內容格式化再輸出,更美觀)
2、查詢所有節點列表
1 http://localhost:9200/_cat/nodes?v
3、查詢所有索引
1 http://localhost:9200/_cat/indices?v
curl命令在Elasticsearch中的使用
使用curl可以通過模擬http請求的方式去建立和管理索引,常用選項如下:
-X:指定http的請求方法,如HEAD,POST,PUT,DELETE
-d:指定要傳輸的資料
-H:指定http請求頭資訊
1、使用curl新增索引
1 curl -XPUT "localhost:9200/blog_test?pretty" #新增一個blog_test索引
2、刪除索引
1 curl -X DELETE "localhost:9200/bolg_test?pretty"
3、查詢建立的索引
1 http://localhost:9200/_cat/indices?v
下面是更貼近實際操作的curl命令,插入了兩條資料
1 #為blog索引新增兩條記錄,指定type為article,ID為2和3 2 3 curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/2?pretty' -d ' 4 5 { 6 7 "title": "test", 8 9 "content":"testsfsdfdsfdsf", 10 11 "PV":10 12 13 }' 14 15 16 17 curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/3?pretty' -d ' 18 19 { 20 21 "title": "test", 22 23 "content":"testsfsdfdsfdsf", 24 25 "PV":23 26 27 }'
查詢索引和資料搜尋
1 #通過ID來查詢 2 3 curl -XGET 'localhost:9200/blog/article/2?pretty' 4 5 #指定具體的索引和type進行搜尋 6 7 curl -XGET 'http://localhost:9200/blog/article/_search?q=title:test'
二、Logstash安裝步驟
1、下載Logstash 6.3
依然是在ELK的官方網站www.elastic.co,本文以原始碼包形式進行Logstash的安裝。其實Logstash的安裝很簡單,只要保證JDK正常執行(目前只支援JDK8),然後直接解壓Logstash即可。這裡我們解壓到了/usr/local/logstash下,並且建立一個軟連線
1 tar zxf logstash-6.3.tar.gz 2 3 mv logstash-6.3 /usr/local/ 4 5 ln -s logstash-6.3.logstash
2、配置與命令列啟動Logstash
在Logstash目錄下有很多子目錄,但是大多數是不用去關注和修改的(僅有2個配置檔案可能需要略微修改,一個是config/logstash.yml,可能需要修改啟動程序數以及日誌資訊;一個是jvm.options,這個和Elasticsearch是一樣的,主要是優化記憶體)。bin目錄下有啟動服務需要的指令碼,現在可以用命令列來啟動Logstash測試是否正常(執行後多等一會兒才有反應):
1 cd logstash-6.3 2 3 bin/logstash -e 'input{ stdin{} } output{ stdout{} }' #-e選項是直接用命令列模式,採用標準輸入,標準輸出 4 5 Settings: Default pipeline workers: 1 6 7 Pipeline main started 8 9 hello world #這裡手動輸入的hello world,作為標準輸入 10 11 2016-05-19T01:59:03.797Z 0.0.0.0 hello world #標準輸出的結果顯示在螢幕 12 13 nihao 14 15 2016-05-19T02:00:20.013Z 0.0.0.0 nihao
使用codec指定輸出格式(codec是一種解碼編碼的工具)
1 [[email protected] bin]# ./logstash -e 'input{ stdin{} } output{ stdout{codec => rubydebug} }' # -e選項是直接用命令列模式,輸入採用標準輸入,輸出採用的codec風格 2 3 Settings: Default pipeline workers: 1 4 5 Pipeline main started 6 7 hello world 8 9 { 10 11 "message" => "hello world", #輸入的內容 12 13 "@version" => "1", #版本號 14 15 "@timestamp" => "2016-05-19T02:09:43.921Z", #自動生成時間戳 16 17 "host" => "0.0.0.0" #資料是由哪個節點發過來的
3、自定義Logstash配置檔案
生產環境中需要用到的規則更為複雜,使用命令列顯然不可取。所以可以自定義規則檔案,然後讓Logstash根據規則進行工作。下面是通過配置檔案指定Logstash的資料輸入輸出的示例,配置檔案裡主要是寫明input、output規則,filter規則是需要過濾內容時才會有:
1 input{ 2 3 stdin {} 4 5 } 6 7 8 9 output{ 10 11 stdout{ 12 13 codec => rubydebug 14 15 } 16 17 }
啟動服務時加上-t選項可以檢查配置檔案是否正確,-f選項就是配置檔案的路徑
1 logstash -t -f /etc/logstash.conf
啟動成功後會看到Pipeline main started這樣的資訊出來,這個時候我們就可以輸入資訊給Logstash了,我們輸入的資訊會通過標準輸出顯示到螢幕上,如圖:
在Logstash中輸入的資料我們可以通過日誌檔案來獲取,當然輸出的資料我們也可以指定到自己需要的容器中,如Elasticsearch裡。要通過日誌檔案來獲取輸入資訊的話就需要用到最常用的input外掛——file(官方文件裡有詳細介紹每個input外掛的使用方式,output外掛同理)。下面是一個使用file外掛的簡單案例,由於output依然是標準輸出,所以會有瘋狂刷屏的情況出現:
1 vi etc/logstash.conf 2 3 input { 4 5 file { 6 7 path => [ "/var/log/secure" ] #檔案路徑 8 9 type => "system" #類似打個標記,自定義 10 11 start_position => "beginning" #從檔案頭部讀取,相反還有end 12 13 } 14 15 } 16 17 18 output { 19 20 stdout { 21 22 codec => rubydebug 23 24 } 25 26 }
file外掛使用了一個sincedb檔案來記錄當前檔案讀區位置,即使重新啟動服務也不會丟失檔案的讀取位置。預設情況下sincedb檔案放在執行Logstash的使用者的主目錄中,可以用sincedb_path選項自定義存放路徑。
總結:在實際工作中Logstash資料收集的一個流程大概是:資料來源→通過input外掛(如file、redis、stdin)→output外掛→寫到Elasticsearch。在官網文件中可以看到有很多其他input外掛,如圖:
下面看看如何將Logstash收集到的資料提交給Elasticsearch。這裡需要使用一個output外掛——elasticsearch。使用方法也很簡單,只需要在配置檔案裡指定外掛就可以了,如下:
1 [[email protected] ~]# cat /etc/logstash.conf 2 3 input{ 4 5 file{ 6 7 path=> "/var/log/audit/audit.log" 8 9 type=> "system" 10 11 start_position=> "beginning" 12 13 } 14 15 } 16 17 output{ 18 19 elasticsearch{ #輸出到es 20 21 hosts=> ["192.168.44.129:9200","192.168.44.130:9200"] 22 23 } 24 25 }
檔案設定好了後執行logstash的程式,再到Elasticsearch就可以檢視到資料了
1 [[email protected] ~]# /usr/local/logstash/bin/logstash -f /etc/logstash.conf
在生產環境中啟動Logstash都是放後臺執行,我們可以一次執行多個程式,因為Logstash不會佔用埠,加-w選項可以啟動多個執行緒,提高效率,預設是2,例:
1 nohup /logstash/bin/logstash agent -f /logstash/conf/indexer-xire.conf -w 4 &
三、Kibana安裝步驟
繼Elasticsearch和Logstash之後,輪到了Kibana。Kibana是為Elasticsearch提供的視覺化平臺,負責資料的美觀展示。Kibana的安裝和Logstash一樣極其簡單,而且不需要在每個客戶端都安裝,通常想讓哪臺伺服器作為展示就用哪臺安裝一個kibana,Kibana是從Elasticsearch中獲取資料的,即使安裝在Elasticsearch叢集之外的節點也是沒有問題的。
1 tar zxf kibana-6.3-linux-x64.tar.gz 2 3 mv kibana-6.3-linux-x64 /usr/local/ 4 5 ln -s /usr/local/kibana-6.3-linux-x64 /usr/local/kibana
配置很簡單,修改配置檔案config/kibana.yml裡的以下資訊即可:
1 vi config/kibana.yml 2 3 server.port: 5601 #服務埠 4 5 server.host: "0.0.0.0" #修改為本機地址 6 7 elasticsearch.url: "http://192.168.44.129:9200" #ES的地址與埠 8 9 kibana.index: ".kibana"
執行bin/kibana可以直接啟動服務,但是通常是放後臺執行,所以加上nohup吧(從2.x到6.x都是這個方式)
1 nohup kibana &
Kibana服務預設監控在5601埠,瀏覽器訪問http://IP:5601可以開啟Kibana的介面(不要用IE核心訪問)。第一次訪問Kibana會提示配置索引,輸入在ES中存在的索引名字後Kibana會自動進行正則匹配(通常用Logstash傳送的資料索引名是以logstash打頭,用filebeat就是filebeat打頭,當然也可以在Logstash配置檔案的output段使用index選項自定義索引)
1 output { 2 3 elasticsearh { 4 5 hosts => ["http://127.0.0.1:9200"] 6 7 index => "nginx-%{+YYYY.MM.dd}" 8 9 } 10 11 }
左側導航欄有很多選項,Discover用於和Elasticsearch互動和展示搜尋結果;Visualize用於報表生成,比如有一個銀行系統,裡面有很多使用者,現在想統計每個存錢區間的人數,存款在1萬以下有多少人,5萬以下有多少人等,用這個報表系統就可以方便的進行操作。
右上角有個時間過濾器,預設是logstash索引最後15分鐘的資料,沒有的話就會顯示No results found。點選過濾器後可以在左側選擇過濾條件,分為了快速查詢(Quick)、相對時間(Relative)、絕對時間(Absolute)。
在中間部分有綠色的直方圖,點選綠色區域會跳轉到對應時間的資料,並且顯示該時間內產生了多少資料,如圖:
在頁面左側可以選擇索引以及欄位:
通過kibana進行全文搜尋也很簡單,只需要在搜尋框裡輸入關鍵詞,然後就會自動把匹配的日誌給展示出來:
Kibana的監控頁
和Nginx一樣,Kibana也有一個監控頁用於檢視伺服器當前狀況,當然在生產中最好也使用Nginx做好許可權稽核,不要讓任何人都可以登入,Kibana監控頁訪問地址是http://URL/status!
至此一個高效多功能的日誌系統就初步完成了。