【7.1.1】ELK日誌系統單體搭建

ELK是什麼?

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

ELK是全文本分佈式日誌搜索系統,包含Elasticsearch(索引庫)/Logstash (過濾日誌保存到索引庫)/ Kibana (查看日誌的前端工具)前端

本文內容說明

本文選用單體架構,多個組件都是單體形式進行部署,包含的組件有ELK(ElasticsearchLogstashKibana)、ZookeeperKafka 還有一個基於Kafka Client的客戶端(logback接口的實現),經過這些組件的整合完成單體日誌系統的搭建,這裏使用的是下載的tar.gz,而不是直接安裝的,配置部分可參考node

系統架構圖以下linux

這裏用Kafka作的緩衝層,防止日誌寫入量過大,logstash和elasticsearch二者寫入速率跟不上致使的數據丟失git

後續會給你們帶來點docker-compose版的demo級的elk集羣,敬請期待!github

環境準備

  • 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問題均已解決spring

Kafka外網沒法鏈接的問題請參考chrome

搭建過程

如下的相對位置均爲下載文件的目錄,請注意。另文中使用了nohup方式後臺,每次執行命令後使用ctrl +c 來結束不會影響進程,使用tail -f xxx.out查看日誌docker

配置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集羣之間通訊

當日志中提示npm

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進行限制,若是仍未能解決問題,請參考http://www.javashuo.com/article/p-rahqeszd-bz.html

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

可選用elasticsearch-head查看,github上最新版只到了5,我的維護版有6的,仍是沒有7,給官方提issue,官方人員表示暫時沒有意願升級,由於大致可用,除了每一個ES的分片等信息匹配不到了。。。看他們興趣缺缺的樣子,就不使用插件安裝到es中了,改用的google-chrome插件,如圖

已經給官方提issue了,官方迴應如今在github上最新代碼已經改了,若有須要,可使用npm啓動,支持es7.x

配置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放在同一臺機器上的。稍後我會整理下發上來,供你們借鑑。

原文出處:https://www.cnblogs.com/hellxz/p/11059360.html

相關文章
相關標籤/搜索