筆記內容:搭建ELK日誌分析平臺(上)—— ELK介紹及搭建 Elasticsearch 分佈式集羣
筆記日期:2018-03-02html
需求背景:java
爲何要用到ELK:node
通常咱們須要進行日誌分析場景:直接在日誌文件中 grep、awk 就能夠得到本身想要的信息。但在規模較大也就是日誌量多而複雜的場景中,此方法效率低下,面臨問題包括日誌量太大如何歸檔、文本搜索太慢怎麼辦、如何多維度查詢。須要集中化的日誌管理,全部服務器上的日誌收集彙總。常看法決思路是創建集中式日誌收集系統,將全部節點上的日誌統一收集,管理,訪問。git
大型系統一般都是一個分佈式部署的架構,不一樣的服務模塊部署在不一樣的服務器上,問題出現時,大部分狀況須要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日誌系統,能夠提升定位問題的效率。bootstrap
一個完整的集中式日誌系統,須要包含如下幾個主要特色:vim
而ELK則提供了一整套解決方案,而且都是開源軟件,之間互相配合使用,完美銜接,高效的知足了不少場合的應用。是目前主流的一種日誌系統。windows
ELK簡介:瀏覽器
ELK是三個開源軟件的縮寫,分別爲:Elasticsearch 、 Logstash以及Kibana , 它們都是開源軟件。不過如今還新增了一個Beats,它是一個輕量級的日誌收集處理工具(Agent),Beats佔用資源少,適合於在各個服務器上搜集日誌後傳輸給Logstash,官方也推薦此工具,目前因爲本來的ELK Stack成員中加入了 Beats 工具因此已更名爲Elastic Stack。安全
Elastic Stack包含:bash
Elasticsearch是個開源分佈式搜索引擎,提供蒐集、分析、存儲數據三大功能。它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。詳細可參考Elasticsearch權威指南
Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支持大量的數據獲取方式。通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。
Kibana 也是一個開源和免費的工具,Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助彙總、分析和搜索重要數據日誌。
ELK Stack (5.0版本以後)--> Elastic Stack == (ELK Stack + Beats)。目前Beats包含六種工具:
關於x-pack工具:
ELK官網:
中文指南:
https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details
ELK架構圖:
準備3臺機器,這樣才能完成分佈式集羣的實驗,固然能有更多機器更好:
角色劃分:
ELK版本信息:
配置三臺機器的hosts文件內容以下:
$ vim /etc/hosts 192.168.77.128 master-node 192.168.77.130 data-node1 192.168.77.134 data-node2
而後三臺機器都得關閉防火牆或清空防火牆規則。
先上官方的安裝文檔:
https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html
我這裏也是經過官方給的源進行安裝,如下操做3臺機器上都要執行,由於三臺機器都須要安裝es:
[root@master-node ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch [root@master-node ~]# vim /etc/yum.repos.d/elastic.repo # 增長如下內容 [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md [root@master-node ~]# yum install -y elasticsearch
若是使用官方的源下載實在太慢的話,也能夠直接下載rpm包進行安裝:
[root@master-node ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm [root@master-node ~]# rpm -ivh elasticsearch-6.0.0.rpm
elasticsearch配置文件在這兩個地方,有兩個配置文件:
[root@master-node ~]# ll /etc/elasticsearch 總用量 16 -rw-rw---- 1 root elasticsearch 2869 2月 17 03:03 elasticsearch.yml -rw-rw---- 1 root elasticsearch 2809 2月 17 03:03 jvm.options -rw-rw---- 1 root elasticsearch 5091 2月 17 03:03 log4j2.properties [root@local ~]# ll /etc/sysconfig/elasticsearch -rw-rw---- 1 root elasticsearch 1613 2月 17 03:03 /etc/sysconfig/elasticsearch [root@master-node ~]#
elasticsearch.yml
文件用於配置集羣節點等相關信息的,elasticsearch
文件則是配置服務自己相關的配置,例如某個配置文件的路徑以及java的一些路徑配置什麼的。
官方的配置文檔:
https://www.elastic.co/guide/en/elasticsearch/reference/6.0/rpm.html
開始配置集羣節點,在 192.168.77.128 上編輯配置文件:
[root@master-node ~]# vim /etc/elasticsearch/elasticsearch.yml # 增長或更改如下內容 cluster.name: master-node # 集羣中的名稱 node.name: master # 該節點名稱 node.master: true # 意思是該節點爲主節點 node.data: false # 表示這不是數據節點 network.host: 0.0.0.0 # 監聽所有ip,在實際環境中應設置爲一個安全的ip http.port: 9200 # es服務的端口號 discovery.zen.ping.unicast.hosts: ["192.168.77.128", "192.168.77.130", "192.168.77.134"] # 配置自動發現 [root@master-node ~]#
而後將配置文件發送到另外兩臺機器上去:
[root@master-node ~]# scp /etc/elasticsearch/elasticsearch.yml data-node1:/tmp/ [root@master-node ~]# scp /etc/elasticsearch/elasticsearch.yml data-node2:/tmp/
到兩臺機器上去更改該文件,修改如下幾處地方:
192.168.77.130:
[root@data-node1 ~]# vim /tmp/elasticsearch.yml node.name: data-node1 node.master: false node.data: true [root@data-node1 ~]# cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml cp: overwrite ‘/etc/elasticsearch/elasticsearch.yml’? yes [root@data-node1 ~]#
192.168.77.134:
[root@data-node2 ~]# vim /tmp/elasticsearch.yml node.name: data-node2 node.master: false node.data: true [root@data-node2 ~]# cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml cp: overwrite ‘/etc/elasticsearch/elasticsearch.yml’? yes [root@data-node2 ~]#
完成以上的配置以後,到主節點上,啓動es服務:
systemctl start elasticsearch.service
主節點啓動完成以後,再啓動其餘節點的es服務。
排錯記錄:
我這裏啓動主節點的時候沒有啓動成功,因而查看es的日誌,可是卻並無生成,那就只能去看系統日誌了:
[root@master-node ~]# ls /var/log/elasticsearch/ [root@master-node ~]# tail -n50 /var/log/messages
錯誤日誌以下:
如圖,能夠看到是JDK的路徑配置得不對,無法在PATH裏找到相應的目錄。
因而查看JAVA_HOME環境變量的值指向哪裏:
[root@master-node ~]# echo $JAVA_HOME /usr/local/jdk1.8/ [root@master-node ~]# ls /usr/local/jdk1.8/ bin db javafx-src.zip lib man release THIRDPARTYLICENSEREADME-JAVAFX.txt COPYRIGHT include jre LICENSE README.html src.zip THIRDPARTYLICENSEREADME.txt [root@master-node ~]#
發現指向的路徑並無錯,那就多是忘記在profile裏寫export了,因而在profile的末尾加上了這一句:
export JAVA_HOME JAVA_BIN JRE_HOME PATH CLASSPATH
使用source命令從新加載了profile以後,從新啓動es服務,可是依舊啓動不起來,因而我發現我忽略了一條錯誤日誌:
這是沒法在環境變量中找到java可執行文件,那就好辦了,作一個軟連接過去便可:
[root@master-node ~]# ln -s /usr/local/jdk1.8/bin/java /usr/bin/
再次啓動es服務,此次就終於啓動成功了:
[root@master-node ~]# systemctl restart elasticsearch.service [root@master-node ~]# ps aux |grep elasticsearch elastic+ 2655 9.4 31.8 3621592 1231396 ? Ssl 15:42 0:14 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/tmp/elasticsearch.4M9NarAc -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/var/log/elasticsearch/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet root 2735 0.0 0.0 112660 968 pts/0 S+ 15:44 0:00 grep --color=auto elasticsearch [root@master-node ~]# netstat -lntp |grep java # es服務會監聽兩個端口 tcp6 0 0 :::9200 :::* LISTEN 2655/java tcp6 0 0 :::9300 :::* LISTEN 2655/java [root@master-node ~]#
9300端口是集羣通訊用的,9200則是數據傳輸時用的。
主節點啓動成功後,依次啓動其餘節點便可,我這裏其餘節點都是啓動正常的。
集羣的健康檢查:
[root@master-node ~]# curl '192.168.77.128:9200/_cluster/health?pretty' { "cluster_name" : "master-node", "status" : "green", # 爲green則表明健康沒問題,若是是yellow或者red則是集羣有問題 "timed_out" : false, # 是否有超時 "number_of_nodes" : 3, # 集羣中的節點數量 "number_of_data_nodes" : 2, # 集羣中data節點的數量 "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 } [root@master-node ~]#
查看集羣的詳細信息:
[root@master-node ~]# curl '192.168.77.128:9200/_cluster/state?pretty' { "cluster_name" : "master-node", "compressed_size_in_bytes" : 354, "version" : 4, "state_uuid" : "QkECzZHVQJOXB7K_9CgXYQ", "master_node" : "SGez5oKUTa2eIijLp8MsLQ", "blocks" : { }, "nodes" : { "4sJURH6cTsykgLberJ6pVw" : { "name" : "data-node1", "ephemeral_id" : "t16_uw92T5ajJqp2HWodrg", "transport_address" : "192.168.56.128:9300", "attributes" : { } }, "SGez5oKUTa2eIijLp8MsLQ" : { "name" : "master", "ephemeral_id" : "eJZX20tpSNyJCHgBIC4x4Q", "transport_address" : "192.168.77.128:9300", "attributes" : { } }, "nZ4L5-KwSdirnluhJTGn7Q" : { "name" : "data-node2", "ephemeral_id" : "pQENcoUcRY6fTs7SamX2KQ", "transport_address" : "192.168.77.134:9300", "attributes" : { } } }, "metadata" : { "cluster_uuid" : "jZPv-awrQDe163Nu3y2hHw", "templates" : { }, "indices" : { }, "index-graveyard" : { "tombstones" : [ ] } }, "routing_table" : { "indices" : { } }, "routing_nodes" : { "unassigned" : [ ], "nodes" : { "nZ4L5-KwSdirnluhJTGn7Q" : [ ], "4sJURH6cTsykgLberJ6pVw" : [ ] } }, "restore" : { "snapshots" : [ ] }, "snapshot_deletions" : { "snapshot_deletions" : [ ] }, "snapshots" : { "snapshots" : [ ] } } [root@master-node ~]#
檢查沒有問題後,咱們的es集羣就搭建完成了,很簡單。
這個集羣的狀態信息也能夠經過瀏覽器查看:
可是顯示出來的也是一堆字符串,咱們但願這些信息能以圖形化的方式顯示出來,那就須要安裝kibana來爲咱們展現這些數據了。
更多使用curl命令操做elasticsearch的內容,可參考如下文章: