1. 程式人生 > >ELK日誌系統單體搭建,基於7.1.1版本

ELK日誌系統單體搭建,基於7.1.1版本

ELK是什麼?

一般來說,為了提高服務可用性,伺服器需要部署多個例項,每個例項都是負載均衡轉發的後的,如果還用老辦法登入伺服器去tail -f xxx.log,有很大可能錯誤日誌未出現在當前伺服器中,還需要重複這個過程直到找到日誌才能進行問題定位。兩三臺還好,成百上千個例項呢?人力有時窮。此時ELK閃亮登場了,那麼ELK是什麼?

ELK是全文字分散式日誌搜尋系統,包含Elasticsearch(索引庫)/Logstash (過濾日誌儲存到索引庫)/ Kibana (檢視日誌的前端工具)

本文內容說明

本文選用單體架構,多個元件都是單體形式進行部署,包含的元件有ELK(ElasticsearchLogstash

Kibana)、ZookeeperKafka 還有一個基於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叢集之間通訊

當日志中提示

ERROR: [1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked

如果當前主機可以分配給Es的超過1G,可以不設定bootstrap.memory_lock: true,這裡自然說的是測試環境;正式環境還是需要限制記憶體,如上方的-Xmx -Xms等,官方推薦是佔用系統記憶體的50%,但不要超過32G。可以通過ES_JAVA_OPTS進行限制,如果仍未能解決問題,請參考https://www.cnblogs.com/hellxz/p/11009634.html

瀏覽器訪問http://192.168.87.133:9200/ (自行替換ip)

可選用elasticsearch-head檢視,github上最新版只到了5,個人維護版有6的,還是沒有7,給官方提issue,官方人員表示暫時沒有意願升級,因為大體可用,除了每個ES的分片等資訊匹配不到了。。。看他們興趣缺缺的樣子,就不使用外掛安裝到es中了,改用的google-chrome外掛,如圖

配置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的時候就需要指定記憶體引數, 如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放在同一臺機器上的。稍後我會整理下發上來,供大家借鑑。