使用ELK搭建日誌集中平臺

1. 背景

如今越來越多的產品採用微服務架構,整個系統會被拆分成若干個服務,然後可被獨立部署到不同的服務器上,服務分散在不同的環境中給團隊開發和運維會帶來如下常見問題:

  1. 開發人員通常無生產環境服務器權限,當生產環境出現故障,開發人員很難及時查看到相應服務的日誌;
  2. 服務日誌分散在多個服務器上,查詢起來非常不方便;
  3. 日誌通常以文件的形式保存於各服務器上,缺乏快速檢索日誌的機制;
  4. 當系統越來越龐大,我們希望能夠對日誌文件進行分析處理,實現智能化運維,但是缺乏方便的日誌獲取機制。

ELK Stack是一套開源的集中式日誌解決方案,能夠以非常低成本的方式滿足我們上面的需求。ELK並不是一款軟件,而是一整套工具集,包含ElasticSearch,LogStash,Kibana,還有新加入的Beats。

  • ElasticSearch:分佈式搜索引擎,基於Apache Lucene構建,能對大規模的數據進行存儲、檢索以及分析。
  • Kibana:數據可視化平臺,通常與ElasticSearch集成,能夠對ElasticSearch中的數據進行檢索及可視化展示。
  • LogStash:作爲數據處理管道,支持對不同來源數據進行採集、過濾、分析處理等操作,然後輸出到多種不同的存儲介質中去實現持久化。
  • Beats:輕量級的專用數據收集器,其對宿主環境的資源消耗幾乎可忽略不計,支持對多種不同來源的數據進行採集,包含Filebeat,Metricbeat,Packetbeat,Heartbeat等。

2. ELK架構

最簡單的ELK架構使用LogStash,ElasticSearch,Kibana即可搭建,如下圖所示。
ELK架構1
該架構直接使用LogStash通過其輸入插件如Stdin或日誌文件等獲取數據,然後經過數據處理後寫入到ElasticSearch中進行存儲,最後通過Kibana進行數據展示。
此種架構需要將LogStash部署到環境中的各業務節點上,但是LogStash組件的運行本身需要佔用較多的CPU和內存資源,很容易對正常業務造成影響,因此出現了非常輕量級的數據採集器Beats,其相對於LogStash佔用的系統資源幾乎不計。Beats當前支持對多種數據進行採集,如Filebeat用於蒐集文件中的數據,Packetbeat用於蒐集網絡流中數據等。

引入Beats之後的架構如下,使用Beats組件對數據進行採集,對接LogStash流水線中的輸入插件,然後數據在經過分析過濾之後通過輸出插件寫入ElasticSearch,最後通過Kibana對數據進行展示。
ELK架構2

當系統業務負載突然變大時會產生大規模的日誌數據流,在LogStash流水線中的各分析過濾插件往往會形成瓶頸造成阻塞,此時我們可以在Beats和LogStash之間引入消息隊列,以達到削峯填谷的作用。

此時的ELK架構如下圖所示,分佈在各服務節點上的Beats採集數據之後寫入到消息隊列中,當前Beats支持的消息隊列包含常見的如Kafka,RabbitMQ,Redis等,然後LogStash通過輸入插件獲取到數據流,經過分析過濾插件處理之後寫入到ElasticSearch中進行存儲,最後再通過Kibana實現數據的可視化。
ELK架構3

3. 快速搭建

這裏我們使用Docker快速搭建一套ELK系統,用於蒐集位於各Linux系統上面的業務日誌。這裏爲了方便,消息隊列佔時不引入,具體引入方法可參考官方文檔在配置文件中引入相應的數據輸入輸出插件即可實現。ELK各組件官方均提供了Docker鏡像,可在這裏查看並使用docker pull下載,國內下載速度可能會比較慢。

ElasticSearch

在安裝ElasticSearch之前需要進行一下系統設置,在/etc/sysctl.conf文件末尾加上vm.max_map_count=655360,然後使用命令sysctl -p刷新一下,否則啓動ElasticSearch可能會出現max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]錯誤。

在系統目錄中創建/root/elasticsearch/data和/root/elasticsearch/logs文件夾,分別用於對ElasticSearch的數據和日誌進行持久化,另外使用命令chmod 775 /root/elasticsearch/*設置一下兩個文件夾的權限,最後運行如下命令啓動ElasticSearch服務。

# docker run -d --name elasticsearch --user root -p 9200:9200 -p 9300:9300 -v /root/elasticsearch/data/:/usr/share/elasticsearch/data/ -v /root/elasticsearch/logs/:/usr/share/elasticsearch/logs/ docker.elastic.co/elasticsearch/elasticsearch:6.5.2

ElasticSearch服務啓動之後我們可以訪問如下API驗證是否啓動成功。

# curl -XGET http://192.168.1.6:9200/_search
{"took":0,"timed_out":false,"_shards":{"total":0,"successful":0,"skipped":0,"failed":0},"hits":{"total":0,"max_score":0.0,"hits":[]}}
Kibana

服務啓動命令如下:

# docker run -d --name kibana -p 5601:5601 -e ELASTICSEARCH_URL=http://192.168.1.6:9200 docker.elastic.co/kibana/kibana:6.5.2

Kibana服務啓動之前需要先啓動ElasticSearch,啓動Kibana時需要配置ElasticSearch數據庫地址。啓動完成之後通過 http://192.168.1.6:5601 即可訪問Kibana界面。

LogStash

在啓動LogStash之前在目錄/root/logstash下創建logstash.conf文件作爲LogStash服務的配置文件,內容如下:

input {
    beats {
        port => "5044"
    }
}

#filter {
#}

output {
    elasticsearch {
        hosts => ["192.168.1.6:9200"]
    }
}

然後運行如下命令啓動LogStash。

# docker run -d --name logstash -p 5044:5044 -v /root/logstash/logstash.conf:/usr/share/logstash/config/logstash.conf docker.elastic.co/logstash/logstash:6.5.2
Filebeat

在/root/filebeat目錄下面創建/data文件夾和filebeat.yml文件,分別用於存儲filebeat數據採集狀態以及filebeat配置文件。在filebeat.yml文件中添加如下內容:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/test.log

output.logstash:
  hosts: ["192.168.1.8:5044"]

然後使用如下命令啓動Filebeat進行日誌數據採集。

# docker run -d --name filebeat --user root -v /root/filebeat/data/:/usr/share/filebeat/data/ -v /root/filebeat/filebeat.yaml:/usr/share/filebeat/config/filebeat.yml docker.elastic.co/beats/filebeat:6.5.2

4. 簡單使用

TODO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章