技術分享 | ELK搭建

1。1 背景

一般我們需要進行日誌分析場景直接在日誌檔案中 grep、awk 就可以獲得自己想要的資訊。但在規模較大的場景中,此方法效率低下,面臨的問題包括日誌量太大如何歸檔、文字搜尋太慢怎麼辦、如何多維度查詢。需要集中化的日誌管理,所有伺服器上的日誌收集彙總。常見的解決思路是建立集中式日誌收集系統,將所有節點上的日誌統一收集,管理,訪問。

一般大型系統是一個分散式部署的架構,不同的服務模組部署在不同的伺服器上,問題出現時,大部分情況需要根據問題暴露的關鍵資訊,定位到具體的伺服器和服務模組,構建一套集中式日誌系統,可以提高定位問題的效率。

一個完整的集中式日誌系統,需要包含以下幾個主要特點:

收集-能夠採集多種來源的日誌資料

傳輸-能夠穩定地把日誌資料傳輸到中央系統

儲存-如何儲存日誌資料

分析-可以支援 UI 分析

警告-能夠提供錯誤的報告,監控機制

1。2 結構圖

此架構由Logstash分佈於各個節點上搜集相關日誌、資料,並經過分析、過濾後傳送給遠端伺服器上的Elasticsearch進行儲存。Elasticsearch將資料以分片的形式壓縮儲存並提供多種API供使用者查詢,操作。使用者亦可以更直觀的透過配置Kibana Web方便的對日誌查詢,並根據資料生成報表。

1。3 環境搭建

1。3。1目錄結構

1。3。2基於docker-compose搭建ELK

Docker-compose。yml配置

version: ‘3。7’

services:

elasticsearch:

image: elasticsearch:7。6。2

container_name: elasticsearch

privileged: true

user: root

environment:

#設定叢集名稱為elasticsearch

- cluster。name=elasticsearch

#以單一節點模式啟動

- discovery。type=single-node

#設定使用jvm記憶體大小

- ES_JAVA_OPTS=-Xms512m -Xmx512m

volumes:

- /opt/docker_elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins

- /opt/docker_elk/elasticsearch/data:/usr/share/elasticsearch/data

ports:

- 9200:9200

- 9300:9300

logstash:

image: logstash:7。6。2

container_name: logstash

ports:

- 4560:4560

privileged: true

environment:

- TZ=Asia/Shanghai

volumes:

#掛載logstash的配置檔案

- /opt/docker_elk/logstash/logstash。conf:/usr/share/logstash/pipeline/logstash。conf

- /opt/docker_elk/logstash/logstash。yml:/usr/share/logstash/config/logstash。yml

depends_on:

- elasticsearch

links:

#可以用es這個域名訪問elasticsearch服務

- elasticsearch:es

kibana:

image: kibana:7。6。2

container_name: kibana

ports:

- 5601:5601

privileged: true

links:

#可以用es這個域名訪問elasticsearch服務

- elasticsearch:es

depends_on:

- elasticsearch

environment:

#設定訪問elasticsearch的地址

- elasticsearch。hosts=http://es:9200

Logstash。conf配置

# ample Logstash configuration for creating a simple

# Beats -> Logstash -> Elasticsearch pipeline。

#

#

input {

tcp {

mode => “server”

host => “0。0。0。0”

port => 4560

codec => json_lines

}

kafka {

bootstrap_servers => “” #這裡可以是kafka叢集,如“192。168。149。101:9092,192。168。149。102:9092,192。168。149。103:9092”

group_id => “host_log”

client_id => “logstash1” #注意,多臺logstash例項消費同一個topics時,client_id需要指定不同的名字

auto_offset_reset => “latest”

topics => [“test_kafka”]

add_field => {“logs_type” => “host”}

codec => json { charset => “UTF-8” }

}

}

output {

elasticsearch {

hosts => “150。158。50。66:9200”

index => “logstash-%{+YYYY。MM。dd}”

}

stdout { codec => rubydebug }

}

Logstash。conf配置檔案有三部分組成,input、fliter、output;

Input:接收資料來源資料型別有tcp、kafka、redis、mysql、filebeat等等

Filter:做資料過濾

Output:透過過濾後的資料推送到Elasticsearch中

docker-compose指令碼操作:

啟動:Docker-compose up –d # -d 後臺操作

停止:docker-compose down

1。4 報文推送kafka

資料推送有微服務端啟動,並並設定指定的埋點資料推送到kafka中,並由logstash消費。

第一步:微服務推送資料到kafka

第二步:logstash消費kafka資料

1。5 Kibana客戶端

透過Kibana可以訪問到ES的資料

kibana訪問連線:

http://${ip}:${port:5601}

資料查詢可以透過Discover或者Dev Tool

Discover頁面

或者

Dev Tool頁面

附錄

https://www。cnblogs。com/niechen/p/10149962。html