ELK是什麼?
一般來說,為了提高服務可用性,伺服器需要部署多個執行個體,每個執行個體都是負載均衡轉發的後的,如果還用老辦法登入伺服器去tail -f xxx.log,有很大可能錯誤日志未出現在目前伺服器中,還需要重複這個過程直到找到日志才能進行問題定位。兩三台還好,成百上千個執行個體呢?人力有時窮。此時ELK閃亮登場了,那麼ELK是什麼?
ELK是全文本分布式日志搜尋系統,包含Elasticsearch(索引庫)/Logstash (過濾日志儲存到索引庫)/ Kibana (檢視日志的前端工具)
本文内容說明
本文選用單體架構,多個元件都是單體形式進行部署,包含的元件有ELK(
Elasticsearch
、
Logstash
Kibana
)、
Zookeeper
Kafka
還有一個基于Kafka Client的用戶端(logback接口的實作),通過這些元件的整合完成單體日志系統的搭建,這裡使用的是下載下傳的
tar.gz
,而不是直接安裝的,配置部分可參考
系統架構圖如下

這裡用Kafka做的緩沖層,防止日志寫入量過大,logstash和elasticsearch兩者寫入速率跟不上導緻的資料丢失
後續會給大家帶來點docker-compose版的demo級的elk叢集,敬請期待!
環境準備
- Ubuntu Server 18.04.2 (可替換為Centos 7, 因為都是Systemd的),請確定有足夠的記憶體與硬碟空間
- ELK 7.1.1
- Kafka_2.12-2.2.0
- Zookeeper使用Kafka自帶的
- 生成日志的demo,代碼見https://github.com/HellxZ/LogDemo
出現的問題彙總
問題彙總請參考ELK搭建過程中出現的問題與解決方法彙總,基本上我測試過程中的ELK問題均已解決
Kafka外網無法連接配接的問題請參考
搭建過程
以下的相對位置均為下載下傳檔案的目錄,請注意。另文中使用了nohup方式背景,每次執行指令後使用ctrl +c 來結束不會影響程序,使用tail -f xxx.out檢視日志
配置Elasticsearch
tar zxvf elasticsearch-7.1.1-linux-x86_64.tar.gz # 解壓
mkdir single-elk # 建立目錄改名移動
mv elasticsearch-7.1.1 single-elk/elasticsearch
cd single-elk/elasticsearch && vim config/elasticsearch.yml # 進入配置檔案夾,修改es配置檔案
# 要修改的内容有
# 1.放開node.name注釋,節點名可DIY
node.name: node-1
# 2.放開network.host,修改ip為目前伺服器ip或0.0.0.0,供外部通路
network.host: 0.0.0.0
# 3.放開cluster.initial_master_nodes,指定目前node.name名稱即可
cluster.initial_master_nodes: ["node-1"] #與node.name保持一緻
bootstrap.memory_lock: true #鎖記憶體,防止記憶體占用過大,官方推薦使用系統記憶體的一半,但不要達到32GB
# 儲存退出
ES_JAVA_OPTS="-Xms512m -Xmx512m" bin/elasticsearch -d # 背景啟動es,預設綁定端口号9200和9300,接口通路9200測試,9300為es叢集之間通信
當日志中提示如果目前主機可以配置設定給Es的超過1G,可以不設定ERROR: [1] bootstrap checks failed [1]: memory locking requested for elasticsearch process but memory is not locked
,這裡自然說的是測試環境;正式環境還是需要限制記憶體,如上方的-Xmx -Xms等,官方推薦是占用系統記憶體的50%,但不要超過32G。可以通過ES_JAVA_OPTS進行限制,如果仍未能解決問題,請參考https://www.cnblogs.com/hellxz/p/11009634.html
bootstrap.memory_lock: true
浏覽器通路http://192.168.87.133:9200/ (自行替換ip)
可選用elasticsearch-head檢視,github上最新版隻到了5,個人維護版有6的,還是沒有7,給官方提issue,官方人員表示暫時沒有意願更新,因為大體可用,除了每個ES的分片等資訊比對不到了。。。看他們興趣缺缺的樣子,就不使用插件安裝到es中了,改用的google-chrome插件,如圖已經給官方提issue了,官方回應現在在github上最新代碼已經改了,如有需要,可以使用npm啟動,支援es7.x![]()
【7.1.1】ELK日志系統單體搭建
配置Zookeeper與Kafka
tar -zxvf kafka_2.12-2.2.0.tgz
mv kafka_2.12-2.2.0 single-elk/kafka
cd single-elk/kafka; vim config/zookeeper.properties #修改下data-dir就可以了,儲存退出
vim config/server.properties #修改kafka配置
#需要修改内容如下
listeners=PLAINTEXT://kafka:9092
advertised.listeners=PLAINTEXT://kafka:9092
#儲存退出
#編輯/etc/hosts,在hosts檔案中追加kafka映射,注意是内網ip需要替換
192.168.87.133 kafka #其實寫127.0.0.1也行 ==
nohup bin/zookeeper-server-start.sh config/zookeeper.properties > zookeeper.out & #啟動zookeeper,出現綁定端口号即成功
nohup bin/kafka-server-start.sh config/server.properties > kafka.out & #啟動kafka
#日志中出現started即成功
這裡寫kafka是因為外網通路的時候需要去用域名換ip,注冊到zookeeper中的key包含了域名,是以本文中使用的是修改/etc/hosts的方式,我不知道其他人是怎麼解決這個問題的,如果您有更好的方式,歡迎下方評論!
配置Logstash
tar zxvf logstash-7.1.1.tar.gz # 解壓
mv logstash-7.1.1 single-elk/logstash
cd single-elk/logstash
vim config/logstash.conf # 建立配置檔案,設定參數可參考logstash.sample.conf,詳情見官網
使用自定義的配置檔案需要在啟動時指定。
# logstash.conf
# 本人配置的是使用kafka做了一層緩沖層,這個不用我多說了,請按需配置
input {
kafka {
bootstrap_servers => "192.168.87.133:9092"
topics => ["all_logs"]
group_id => "logstash"
codec => json
}
}
# 過濾器我沒有配置,目前隻是先看看效果
filter {
}
output {
elasticsearch {
hosts => ["192.168.87.133:9200"]
index => "all-logs-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
stdout {
codec => rubydebug
}
}
儲存退出
nohup bin/logstash -f config/logstash.conf > logstash.out & #背景啟動Logstash
看到日志中出現
Successfully started Logstash API endpoint {:port=>9600}
,即啟動成功
配置Kibana
# Kibana是基于node.js的前端項目,不過我測試伺服器沒裝node.js也正常啟動,看來ELK這些都自帶了依賴環境
tar zxvf kibana-7.1.1-linux-x86_64.tar.gz
mv kibana-7.1.1-linux-x86_64 single-elk/kibana
cd single-elk/kibana && vim config/kibana.yml
#kibana.yml 以下配置均為解開注釋,修改而成,使用搜尋修改
# 指定kibana占用端口号,如無其它端口需要,可以不開啟,預設5601
server.port: 5601
# 指定kibana綁定的ip位址,這裡寫kibana所在的ip即可
server.host: "192.168.87.133"
# es節點的ip位址
elasticsearch.hosts: ["http://192.168.87.133:9200"]
# kibana.index是kibana在es中建立的索引,會儲存搜尋記錄,無需改變
kibana.index: ".kibana"
# 設定查詢es逾時時間,機關為milliseconds必須為整數
elasticsearch.requestTimeout: 30000
# 其餘按需配置
# 中文化
i18n.locale: "zh-CN"
#儲存退出
nohup bin/kibana > kibana.out & # 背景啟動kibana
出現
Server running at http://192.168.87.133:5601"
類似字樣,啟動完成,通路看看
配置測試代碼
使用代碼的環境需要設定hosts檔案,映射到kafka為剛才的ip,我的是192.168.87.133 kafka
項目是springboot的直接啟動DemoApplication就好,還可以通過通路TestController中的方法來生産日志。
Connection to node -1 could not be established. Broker may not be available.
出現這個問題請參考【Kafka問題解決】Connection to xxx could not be established. Broker may not be available.檢查配置檔案。
如需修改kafka的映射名稱,記得修改logback-spring.xml中的
<producerConfig>bootstrap.servers=your-kafka-domain:kafka-port</producerConfig>
檢視效果
使用Elasticsearch-head
進入google-chrome的Elasticsearch-head插件,連接配接項目我們可以簡單看到多出了幾個綠色的0
當然了,由于這個插件官方沒有對Elasticsearch 7.X進行優化支援,顯示的圖并不準确,好在我們可以看到索引和資料浏覽
我的虛拟機沒記憶體了。。是以叢集狀态變成yellow了,僅為隻讀狀态,大家可以通過在配置檔案中限制es的記憶體,預設是1G的。官方建議設定記憶體為系統記憶體的一半,但不要超過32GB,且最大記憶體與最小記憶體最好相等防止經常GC,參考自config/elasticsearch.yml啟動es的時候就需要指定記憶體參數, 如![]()
【7.1.1】ELK日志系統單體搭建
ES_JAVA_OPTS="-Xms512m -Xmx512m" bin/elasticsearch -d
使用kibana
此時我已經修複了記憶體不夠的問題,配置檔案也在上邊更新了,大家可以放心測試
通路<你的kibana-ip:5601> 我的是<192.168.87.133:5061>
Kibana預設是不會給我們添加展示的索引的,需要我們去比對,這裡我們去添加
下一步,選擇@timestamp或者其它,我這裡選擇@timestamp,然後建立索引模式即可
索引建立完成,我們去儀表盤檢視下,點這個
Discover
結束
最近在做ELK日志系統這塊,還做了個demo級的docker-compose的ELK叢集,因為生産環境我們是不會将多個es和多個kafka放在同一台機器上的。稍後我會整理下發上來,供大家借鑒。