搭建ELK日誌分析平臺(上)—— ELK介紹及搭建 Elasticsearch 分散式叢集
轉:http://blog.51cto.com/zero01/2079879
筆記內容:搭建ELK日誌分析平臺(上)—— ELK介紹及搭建 Elasticsearch 分散式叢集
筆記日期:2018-03-02
- 27.1 ELK介紹
- 27.2 ELK安裝準備工作
- 27.3 安裝es
- 27.4 配置es
- 27.5 curl檢視es叢集情況
ELK介紹
需求背景:
- 業務發展越來越龐大,伺服器越來越多
- 各種訪問日誌、應用日誌、錯誤日誌量越來越多,導致運維人員無法很好的去管理日誌
- 開發人員排查問題,需要到伺服器上查日誌,不方便
- 運營人員需要一些資料,需要我們運維到伺服器上分析日誌
為什麼要用到ELK:
一般我們需要進行日誌分析場景:直接在日誌檔案中 grep、awk 就可以獲得自己想要的資訊。但在規模較大也就是日誌量多而複雜的場景中,此方法效率低下,面臨問題包括日誌量太大如何歸檔、文字搜尋太慢怎麼辦、如何多維度查詢。需要集中化的日誌管理,所有伺服器上的日誌收集彙總。常見解決思路是建立集中式日誌收集系統,將所有節點上的日誌統一收集,管理,訪問。
大型系統通常都是一個分散式部署的架構,不同的服務模組部署在不同的伺服器上,問題出現時,大部分情況需要根據問題暴露的關鍵資訊,定位到具體的伺服器和服務模組,構建一套集中式日誌系統,可以提高定位問題的效率。
一個完整的集中式日誌系統,需要包含以下幾個主要特點:
- 收集-能夠採集多種來源的日誌資料
- 傳輸-能夠穩定的把日誌資料傳輸到中央系統
- 儲存-如何儲存日誌資料
- 分析-可以支援 UI 分析
- 警告-能夠提供錯誤報告,監控機制
而ELK則提供了一整套解決方案,並且都是開源軟體,之間互相配合使用,完美銜接,高效的滿足了很多場合的應用。是目前主流的一種日誌系統。
ELK簡介:
ELK是三個開源軟體的縮寫,分別為:Elasticsearch 、 Logstash以及Kibana , 它們都是開源軟體。不過現在還新增了一個Beats,它是一個輕量級的日誌收集處理工具(Agent),Beats佔用資源少,適合於在各個伺服器上搜集日誌後傳輸給Logstash,官方也推薦此工具,目前由於原本的ELK Stack成員中加入了 Beats 工具所以已改名為Elastic Stack。
Elastic Stack包含:
-
Elasticsearch是個開源分散式搜尋引擎,提供蒐集、分析、儲存資料三大功能。它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。詳細可參考Elasticsearch權威指南
-
Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支援大量的資料獲取方式。一般工作方式為c/s架構,client端安裝在需要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。
-
Kibana 也是一個開源和免費的工具,Kibana可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助彙總、分析和搜尋重要資料日誌。
- Beats在這裡是一個輕量級日誌採集器,其實Beats家族有6個成員,早期的ELK架構中使用Logstash收集、解析日誌,但是Logstash對記憶體、cpu、io等資源消耗比較高。相比 Logstash,Beats所佔系統的CPU和記憶體幾乎可以忽略不計
ELK Stack (5.0版本之後)--> Elastic Stack == (ELK Stack + Beats)。目前Beats包含六種工具:
- Packetbeat: 網路資料(收集網路流量資料)
- Metricbeat: 指標 (收集系統、程序和檔案系統級別的 CPU 和記憶體使用情況等資料)
- Filebeat: 日誌檔案(收集檔案資料)
- Winlogbeat: windows事件日誌(收集 Windows 事件日誌資料)
- Auditbeat:審計資料 (收集審計日誌)
- Heartbeat:執行時間監控 (收集系統執行時的資料)
關於x-pack工具:
- x-pack對Elastic Stack提供了安全、警報、監控、報表、圖表於一身的擴充套件包,是收費的,所以本文不涉及x-pack的安裝
ELK官網:
中文指南:
https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details
ELK架構圖:
ELK安裝準備工作
準備3臺機器,這樣才能完成分散式叢集的實驗,當然能有更多機器更好:
- 192.168.77.128
- 192.168.77.130
- 192.168.77.134
角色劃分:
- 3臺機器全部安裝jdk1.8,因為elasticsearch是java開發的
- 3臺全部安裝elasticsearch (後續都簡稱為es)
- 192.168.77.128作為主節點
- 192.168.77.130以及192.168.77.134作為資料節點
- 主節點上需要安裝kibana
- 在192.168.77.130上安裝 logstash
ELK版本資訊:
- Elasticsearch-6.0.0
- logstash-6.0.0
- kibana-6.0.0
- filebeat-6.0.0
配置三臺機器的hosts檔案內容如下:
$ vim /etc/hosts
192.168.77.128 master-node
192.168.77.130 data-node1
192.168.77.134 data-node2
然後三臺機器都得關閉防火牆或清空防火牆規則。
安裝es
先上官方的安裝文件:
https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html
我這裡也是通過官方給的源進行安裝,以下操作3臺機器上都要執行,因為三臺機器都需要安裝es:
[[email protected] ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
[[email protected] ~]# 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
[[email protected] ~]# yum install -y elasticsearch
如果使用官方的源下載實在太慢的話,也可以直接下載rpm包進行安裝:
[[email protected] ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm
[[email protected] ~]# rpm -ivh elasticsearch-6.0.0.rpm
配置es
elasticsearch配置檔案在這兩個地方,有兩個配置檔案:
[[email protected] ~]# 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
[[email protected] ~]# ll /etc/sysconfig/elasticsearch
-rw-rw---- 1 root elasticsearch 1613 2月 17 03:03 /etc/sysconfig/elasticsearch
[[email protected] ~]#
elasticsearch.yml
檔案用於配置叢集節點等相關資訊的,elasticsearch
檔案則是配置服務本身相關的配置,例如某個配置檔案的路徑以及java的一些路徑配置什麼的。
官方的配置文件:
https://www.elastic.co/guide/en/elasticsearch/reference/6.0/rpm.html
開始配置叢集節點,在 192.168.77.128 上編輯配置檔案:
[[email protected] ~]# 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"] # 配置自動發現
[[email protected] ~]#
然後將配置檔案傳送到另外兩臺機器上去:
[[email protected] ~]# scp /etc/elasticsearch/elasticsearch.yml data-node1:/tmp/
[[email protected] ~]# scp /etc/elasticsearch/elasticsearch.yml data-node2:/tmp/
到兩臺機器上去更改該檔案,修改以下幾處地方:
192.168.77.130:
[r[email protected] ~]# vim /tmp/elasticsearch.yml
node.name: data-node1
node.master: false
node.data: true
[[email protected] ~]# cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml
cp: overwrite ‘/etc/elasticsearch/elasticsearch.yml’? yes
[[email protected] ~]#
192.168.77.134:
[[email protected] ~]# vim /tmp/elasticsearch.yml
node.name: data-node2
node.master: false
node.data: true
[[email protected] ~]# cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml
cp: overwrite ‘/etc/elasticsearch/elasticsearch.yml’? yes
[[email protected] ~]#
完成以上的配置之後,到主節點上,啟動es服務:
systemctl start elasticsearch.service
主節點啟動完成之後,再啟動其他節點的es服務。
排錯記錄:
我這裡啟動主節點的時候沒有啟動成功,於是檢視es的日誌,但是卻並沒有生成,那就只能去看系統日誌了:
[[email protected] ~]# ls /var/log/elasticsearch/
[[email protected] ~]# tail -n50 /var/log/messages
錯誤日誌如下:
如圖,可以看到是JDK的路徑配置得不對,沒法在PATH裡找到相應的目錄。
於是檢視JAVA_HOME環境變數的值指向哪裡:
[[email protected] ~]# echo $JAVA_HOME
/usr/local/jdk1.8/
[[email protected] ~]# 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
[[email protected] ~]#
發現指向的路徑並沒有錯,那就可能是忘記在profile裡寫export了,於是在profile的末尾加上了這一句:
export JAVA_HOME JAVA_BIN JRE_HOME PATH CLASSPATH
使用source命令重新載入了profile之後,重新啟動es服務,但是依舊啟動不起來,於是我發現我忽略了一條錯誤日誌:
這是無法在環境變數中找到java可執行檔案,那就好辦了,做一個軟連結過去即可:
[[email protected] ~]# ln -s /usr/local/jdk1.8/bin/java /usr/bin/
再次啟動es服務,這次就終於啟動成功了:
[[email protected] ~]# systemctl restart elasticsearch.service
[[email protected] ~]# 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
[[email protected] ~]# netstat -lntp |grep java # es服務會監聽兩個埠
tcp6 0 0 :::9200 :::* LISTEN 2655/java
tcp6 0 0 :::9300 :::* LISTEN 2655/java
[[email protected] ~]#
9300埠是叢集通訊用的,9200則是資料傳輸時用的。
主節點啟動成功後,依次啟動其他節點即可,我這裡其他節點都是啟動正常的。
curl檢視es叢集情況
叢集的健康檢查:
[[email protected] ~]# 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
}
[[email protected] ~]#
檢視叢集的詳細資訊:
[[email protected] ~]# 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" : [ ]
}
}
[[email protected] ~]#
檢查沒有問題後,我們的es叢集就搭建完成了,很簡單。
這個叢集的狀態資訊也可以通過瀏覽器檢視:
但是顯示出來的也是一堆字串,我們希望這些資訊能以圖形化的方式顯示出來,那就需要安裝kibana來為我們展示這些資料了。
更多使用curl命令操作elasticsearch的內容,可參考以下文章: