ELK Stack是Elasticserach、Logstash、Kibana三種工具組合而成的一個日誌解決方案。ELK能夠將咱們的系統日誌、訪問日誌、運行日誌、錯誤日誌等進行統一收集、存儲分析和搜索以及圖形展示。相比傳統的CTRL+F或者數據庫語句來進行數據查詢,ELK支持分佈式搜搜,數據量可達PB級別,檢索速度更快速,接近實時處理,而且更智能,能夠去掉一些沒有特殊含義的詞彙,好比「這,的,是」,還能夠進行搜索補全與搜索糾錯。java
LogStash:node
負責日誌的收集,而且能夠輸出到指定位置,如Redis、kafka、以及最主要的ElasticSearch中,一般會在全部須要收集日誌的服務器上安裝Logstash,而後由Logstash agent端發送到Logstash的Server端linux
ElasticSearch:nginx
使用JAVA開發、基於Lucene搜索引擎庫的全文搜索工具,經過RESTful API(一種接口設計規範,讓接口更易懂)隱藏了Lucene本來的複雜性。實現了日誌數據的分佈式、實時分析,而且能夠進行搜索補全與糾錯等功能,是ELK最核心的組件。相比MySQL庫和表的概念,在ES中把庫叫作索引。redis
Kibana:數據庫
負責數據的展現與統計,是一個圖形化的管理系統。json
下面一一介紹這幾個系統的安裝搭建。 瀏覽器
一、ElasticSearch默認工做在集羣模式下,擴展性很強,而且支持自動發現。因此在實驗環境中須要至少2臺服務器來搭建,可是爲了防止腦裂,創建使用基數臺服務器。在部署ElasticSearch前須要先部署JAVA環境,因此第一步是安裝JDK,這裏偷懶使用yum安裝了openjdk,生產環境仍是建議用JDK的源碼包(暫時不支持JDK 9)。ruby
1 yum install java-1.8.0-openjdk.x86_64
二、下載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 #程序啓動後最大可佔用內存的大小
三、修改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節點初始化列表,經過列表中的機器來自動發現其餘節點
三、運行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,做用大概以下:
一、用來檢查集羣節點、索引當前狀態
二、管理集羣節點、索引及元數據
三、執行增刪改查操做
四、執行高級操做,例如paging,filtering
Elasticsearch 經常使用API有cat、cluster等,下面是一些簡單介紹:
經過curl能夠看到cat這個API下有不少子功能
一、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會將內容格式化再輸出,更美觀)
二、查詢全部節點列表
1 http://localhost:9200/_cat/nodes?v
三、查詢全部索引
1 http://localhost:9200/_cat/indices?v
curl命令在Elasticsearch中的使用
使用curl能夠經過模擬http請求的方式去建立和管理索引,經常使用選項以下:
-X:指定http的請求方法,如HEAD,POST,PUT,DELETE
-d:指定要傳輸的數據
-H:指定http請求頭信息
一、使用curl新增索引
1 curl -XPUT "localhost:9200/blog_test?pretty" #新增一個blog_test索引
二、刪除索引
1 curl -X DELETE "localhost:9200/bolg_test?pretty"
三、查詢建立的索引
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 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
二、配置與命令行啓動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 [root@server 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" #數據是由哪一個節點發過來的
三、自定義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 [root@server ~]# 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 [root@server ~]# /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 &
繼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!
至此一個高效多功能的日誌系統就初步完成了。