慶云網(wǎng)站建設(shè)ihuibestseo外包網(wǎng)站
可以在短時(shí)間內(nèi)搜索和分析大量數(shù)據(jù)。
Elasticsearch 不僅僅是一個(gè)全文搜索引擎,它還提供了分布式的多用戶能力,實(shí)時(shí)的分析,以及對(duì)復(fù)雜搜索語(yǔ)句的處理能力,使其在眾多場(chǎng)景下,如企業(yè)搜索,日志和事件數(shù)據(jù)分析等,都有廣泛的應(yīng)用。
本文將介紹 ELK+Kafka+Beats 對(duì)日志收集平臺(tái)的實(shí)現(xiàn)。
文章目錄
- 1、關(guān)于ELK與BKELK
- 1.1、ELK架構(gòu)及其影響
- 1.2、基于BKLEK架構(gòu)的日志分析系統(tǒng)實(shí)現(xiàn)
- 2、利用ELK+Kafka+Beats來(lái)實(shí)現(xiàn)一個(gè)統(tǒng)一日志平臺(tái)
- 2.1、應(yīng)用場(chǎng)景
- 2.2、環(huán)境準(zhǔn)備
- 2.3、基于Docker的ES部署
- 2.4、基于Docker的kibana部署
- 2.5、基于Docker的Zookeeper部署
- 2.6、基于Docker的Kafka部署
- 2.7、基于Docker的Logstash部署
- 2.8、基于Docker的Filebeat部署
1、關(guān)于ELK與BKELK
1.1、ELK架構(gòu)及其影響
當(dāng)我們?cè)陂_(kāi)源日志分析系統(tǒng)的領(lǐng)域,談及 ELK 架構(gòu)可謂是家喻戶曉。然而,這個(gè)生態(tài)系統(tǒng)并非 Elastic 有意為之,畢竟 Elasticsearch 的初衷是作為一個(gè)分布式搜索引擎。其廣泛應(yīng)用于日志系統(tǒng),實(shí)則是一種意料之外,這是社區(qū)用戶的推動(dòng)所致。如今,眾多云服務(wù)廠商在推廣自己的日志服務(wù)時(shí),往往以 ELK 作為參照標(biāo)準(zhǔn),由此可見(jiàn),ELK 的影響力之深遠(yuǎn)。
ELK 是 Elasticsearch、Logstash 和 Kibana 的首字母縮寫(xiě),這三個(gè)產(chǎn)品都是 Elastic 公司的開(kāi)源項(xiàng)目,通常一起使用以實(shí)現(xiàn)數(shù)據(jù)的搜索、分析和可視化。
-
Elasticsearch:一個(gè)基于 Lucene 的搜索服務(wù)器。它提供了一個(gè)分布式、多租戶的全文搜索引擎,具有 HTTP 網(wǎng)絡(luò)接口和無(wú)模式 JSON 文檔。
-
Logstash:是一個(gè)服務(wù)器端數(shù)據(jù)處理管道,它可以同時(shí)從多個(gè)來(lái)源接收數(shù)據(jù),轉(zhuǎn)換數(shù)據(jù),然后將數(shù)據(jù)發(fā)送到你選擇的地方。
-
Kibana:是一個(gè)用于 Elasticsearch 的開(kāi)源數(shù)據(jù)可視化插件。它提供了查找、查看和交互存儲(chǔ)在 Elasticsearch 索引中的數(shù)據(jù)的方式。你可以使用它進(jìn)行高級(jí)數(shù)據(jù)分析和可視化你的數(shù)據(jù)等。
這三個(gè)工具通常一起使用,以便從各種來(lái)源收集、搜索、分析和可視化數(shù)據(jù)。
1.2、基于BKLEK架構(gòu)的日志分析系統(tǒng)實(shí)現(xiàn)
實(shí)際上,在流行的架構(gòu)中并非只有 ELKB。當(dāng)我們利用 ELKB 構(gòu)建一套日志系統(tǒng)時(shí),除了 Elasticsearch、Logstash、Kibana、beats 之外,還有一個(gè)被廣泛應(yīng)用的工具 —— Kafka。在這個(gè)體系中,Kafka 的角色尤為重要。作為一個(gè)中間件和緩沖區(qū),它能夠提升吞吐量,隔離峰值影響,緩存日志數(shù)據(jù),快速落盤(pán)。同時(shí),通過(guò) producer/consumer 模式,使得 Logstash 能夠進(jìn)行橫向擴(kuò)展,還能用于數(shù)據(jù)的多路分發(fā)。因此,大多數(shù)情況下,我們看到的實(shí)際架構(gòu),按照數(shù)據(jù)流轉(zhuǎn)的順序排列,應(yīng)該是 BKLEK 架構(gòu)。
BKLEK 架構(gòu)即 ELK+Kafka+Beats ,這是一種常見(jiàn)的大數(shù)據(jù)處理和分析架構(gòu)。在這個(gè)架構(gòu)中:
-
Beats:是一種輕量級(jí)的數(shù)據(jù)采集器,用于從各種源(如系統(tǒng)日志、網(wǎng)絡(luò)流量等)收集數(shù)據(jù),并將數(shù)據(jù)發(fā)送到 Kafka 或 Logstash。
-
Kafka:是一個(gè)分布式流處理平臺(tái),用于處理和存儲(chǔ)實(shí)時(shí)數(shù)據(jù)。在這個(gè)架構(gòu)中,Kafka 主要用于作為一個(gè)緩沖區(qū),接收來(lái)自 Beats 的數(shù)據(jù),并將數(shù)據(jù)傳輸?shù)?Logstash。
-
Logstash:是一個(gè)強(qiáng)大的日志管理工具,可以從 Kafka 中接收數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行過(guò)濾和轉(zhuǎn)換,然后將數(shù)據(jù)發(fā)送到 Elasticsearch。
-
Elasticsearch:是一個(gè)分布式的搜索和分析引擎,用于存儲(chǔ)、搜索和分析大量數(shù)據(jù)。
-
Kibana:是一個(gè)數(shù)據(jù)可視化工具,用于在 Elasticsearch 中搜索和查看存儲(chǔ)的數(shù)據(jù)。
這種架構(gòu)的優(yōu)點(diǎn)是:
- 可以處理大量的實(shí)時(shí)數(shù)據(jù)。
- Kafka 提供了一個(gè)強(qiáng)大的緩沖區(qū),可以處理高速流入的數(shù)據(jù),保證數(shù)據(jù)的完整性。
- Logstash 提供了強(qiáng)大的數(shù)據(jù)處理能力,可以對(duì)數(shù)據(jù)進(jìn)行各種復(fù)雜的過(guò)濾和轉(zhuǎn)換。
- Elasticsearch 提供了強(qiáng)大的數(shù)據(jù)搜索和分析能力。
- Kibana 提供了直觀的數(shù)據(jù)可視化界面。
這種架構(gòu)通常用于日志分析、實(shí)時(shí)數(shù)據(jù)處理和分析、系統(tǒng)監(jiān)控等場(chǎng)景。
2、利用ELK+Kafka+Beats來(lái)實(shí)現(xiàn)一個(gè)統(tǒng)一日志平臺(tái)
2.1、應(yīng)用場(chǎng)景
利用 ELK+Kafka+Beats 來(lái)實(shí)現(xiàn)一個(gè)統(tǒng)一日志平臺(tái),這是一個(gè)專(zhuān)門(mén)針對(duì)大規(guī)模分布式系統(tǒng)日志進(jìn)行統(tǒng)一采集、存儲(chǔ)和分析的 APM 工具。在分布式系統(tǒng)中,眾多服務(wù)部署在不同的服務(wù)器上,一個(gè)客戶端的請(qǐng)求可能會(huì)觸發(fā)后端多個(gè)服務(wù)的調(diào)用,這些服務(wù)可能會(huì)互相調(diào)用或者一個(gè)服務(wù)會(huì)調(diào)用其他服務(wù),最終將請(qǐng)求結(jié)果返回并在前端頁(yè)面上展示。如果在這個(gè)過(guò)程中的任何環(huán)節(jié)出現(xiàn)異常,開(kāi)發(fā)和運(yùn)維人員可能會(huì)很難準(zhǔn)確地確定問(wèn)題是由哪個(gè)服務(wù)調(diào)用引起的。統(tǒng)一日志平臺(tái)的作用就在于追蹤每個(gè)請(qǐng)求的完整調(diào)用鏈路,收集鏈路上每個(gè)服務(wù)的性能和日志數(shù)據(jù),從而使開(kāi)發(fā)和運(yùn)維人員能夠快速發(fā)現(xiàn)并定位問(wèn)題。
統(tǒng)一日志平臺(tái)通過(guò)采集模塊、傳輸模塊、存儲(chǔ)模塊、分析模塊實(shí)現(xiàn)日志數(shù)據(jù)的統(tǒng)一采集、存儲(chǔ)和分析,結(jié)構(gòu)圖如下:

為了實(shí)現(xiàn)海量日志數(shù)據(jù)的收集和分析,首先需要解決的是如何處理大量的數(shù)據(jù)信息。在這個(gè)案例中,我們使用 Kafka、Beats 和 Logstash 構(gòu)建了一個(gè)分布式消息隊(duì)列平臺(tái)。具體來(lái)說(shuō),我們使用 Beats 采集日志數(shù)據(jù),這相當(dāng)于在 Kafka 消息隊(duì)列中扮演生產(chǎn)者的角色,生成消息并發(fā)送到 Kafka。然后,這些日志數(shù)據(jù)被發(fā)送到 Logstash 進(jìn)行分析和過(guò)濾,Logstash 在這里扮演消費(fèi)者的角色。處理后的數(shù)據(jù)被存儲(chǔ)在 Elasticsearch 中,最后我們使用 Kibana 對(duì)日志數(shù)據(jù)進(jìn)行可視化展示。
2.2、環(huán)境準(zhǔn)備
本地
- Kafka
- ES
- Kibana
- filebeat
- Java Demo 項(xiàng)目
我們使用 Docker 創(chuàng)建以一個(gè) 名為 es-net 的網(wǎng)絡(luò)
在 Docker 中,網(wǎng)絡(luò)是連接和隔離 Docker 容器的方式。當(dāng)你創(chuàng)建一個(gè)網(wǎng)絡(luò),我們定義一個(gè)可以相互通信的容器的網(wǎng)絡(luò)環(huán)境。
docker network create es-net
docker network create
是 Docker 命令行界面的一個(gè)命令,用于創(chuàng)建一個(gè)新的網(wǎng)絡(luò)。在這個(gè)命令后面,你需要指定你想要?jiǎng)?chuàng)建的網(wǎng)絡(luò)的名稱(chēng),在這個(gè)例子中,網(wǎng)絡(luò)的名稱(chēng)是 “es-net”。
所以,docker network create es-net
這句命令的意思就是創(chuàng)建一個(gè)名為 “es-net” 的 Docker 網(wǎng)絡(luò)。
2.3、基于Docker的ES部署
加載鏡像:
docker pull elasticsearch:7.12.1
運(yùn)行容器:
docker run -d \--name es \-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \-e "discovery.type=single-node" \--privileged \--network es-net \-p 9200:9200 \-p 9300:9300 \elasticsearch:7.12.1-v es-data:/Users/lizhengi/elasticsearch/data \-v es-plugins:/Users/lizhengi/elasticsearch/plugins \
這個(gè)命令是使用 Docker 運(yùn)行一個(gè)名為 “es” 的 Elasticsearch 容器。具體參數(shù)的含義如下:
-
docker run -d
:使用 Docker 運(yùn)行一個(gè)新的容器,并且在后臺(tái)模式(detached mode)下運(yùn)行。 -
--name es
:設(shè)置容器的名稱(chēng)為 “es”。 -
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"
:設(shè)置環(huán)境變量ES_JAVA_OPTS
,這是 JVM 的參數(shù),用于控制 Elasticsearch 使用的最小和最大內(nèi)存。這里設(shè)置的是最小和最大內(nèi)存都為 512MB。 -
-e "discovery.type=single-node"
:設(shè)置環(huán)境變量discovery.type
,這是 Elasticsearch 的參數(shù),用于設(shè)置集群發(fā)現(xiàn)類(lèi)型。這里設(shè)置的是單節(jié)點(diǎn)模式。 -
-v es-data:/Users/lizhengi/elasticsearch/data
和-v es-plugins:/Users/lizhengi/elasticsearch/plugins
:掛載卷(volume)。這兩個(gè)參數(shù)將主機(jī)上的es-data
和es-plugins
目錄掛載到容器的/Users/lizhengi/elasticsearch/data
和/Users/lizhengi/elasticsearch/plugins
目錄。 -
--privileged
:以特權(quán)模式運(yùn)行容器。這將允許容器訪問(wèn)宿主機(jī)的所有設(shè)備,并且容器中的進(jìn)程可以獲取任何 AppArmor 或 SELinux 的權(quán)限。 -
--network es-net
:將容器連接到es-net
網(wǎng)絡(luò)。 -
-p 9200:9200
和-p 9300:9300
:端口映射。這兩個(gè)參數(shù)將容器的 9200 和 9300 端口映射到主機(jī)的 9200 和 9300 端口。 -
elasticsearch:7.12.1
:要運(yùn)行的 Docker 鏡像的名稱(chēng)和標(biāo)簽。這里使用的是版本為 7.12.1 的 Elasticsearch 鏡像。
運(yùn)行結(jié)果驗(yàn)證:隨后便可以去訪問(wèn) IP:9200,結(jié)果如圖:
2.4、基于Docker的kibana部署
加載鏡像:
docker pull kibana:7.12.1
運(yùn)行容器:
docker run -d \--name kibana \-e ELASTICSEARCH_HOSTS=http://es:9200 \--network=es-net \-p 5601:5601 \
kibana:7.12.1
這是一個(gè) Docker 命令,用于運(yùn)行一個(gè) Kibana 容器。下面是每個(gè)參數(shù)的解釋:
-
docker run -d
:使用 Docker 運(yùn)行一個(gè)新的容器,并且在后臺(tái)模式(detached mode)下運(yùn)行。 -
--name kibana
:設(shè)置容器的名稱(chēng)為 “kibana”。 -
-e ELASTICSEARCH_HOSTS=http://es:9200
:設(shè)置環(huán)境變量ELASTICSEARCH_HOSTS
,這是 Kibana 的參數(shù),用于指定 Elasticsearch 服務(wù)的地址。這里設(shè)置的是http://es:9200
,表示 Kibana 將連接到同一 Docker 網(wǎng)絡(luò)中名為 “es” 的容器的 9200 端口。 -
--network=es-net
:將容器連接到es-net
網(wǎng)絡(luò)。 -
-p 5601:5601
:端口映射。這個(gè)參數(shù)將容器的 5601 端口映射到主機(jī)的 5601 端口。 -
kibana:7.12.1
:要運(yùn)行的 Docker 鏡像的名稱(chēng)和標(biāo)簽。這里使用的是版本為 7.12.1 的 Kibana 鏡像。
kibana啟動(dòng)一般比較慢,需要多等待一會(huì),可以通過(guò)命令:
docker logs -f kibana
查看運(yùn)行日志,當(dāng)查看到下面的日志,說(shuō)明成功:
運(yùn)行結(jié)果驗(yàn)證:隨后便可以去訪問(wèn) IP:9200,結(jié)果如圖:
也可以瀏覽器訪問(wèn):
2.5、基于Docker的Zookeeper部署
加載鏡像:
docker pull zookeeper:latest
運(yùn)行容器:
以下是一個(gè)基本的 Docker 命令,用于運(yùn)行一個(gè) Zookeeper 容器:
docker run -d \--name zookeeper \--network=es-net \-p 2181:2181 \
zookeeper:latest
這個(gè)命令的參數(shù)解釋如下:
docker run -d
:使用 Docker 運(yùn)行一個(gè)新的容器,并且在后臺(tái)模式(detached mode)下運(yùn)行。--name zookeeper
:設(shè)置容器的名稱(chēng)為 “zookeeper”。--network=es-net
:將容器連接到es-net
網(wǎng)絡(luò)。-p 2181:2181
:端口映射。這個(gè)參數(shù)將容器的 2181 端口映射到主機(jī)的 2181 端口。zookeeper:latest
:要運(yùn)行的 Docker 鏡像的名稱(chēng)和標(biāo)簽。這里使用的是最新版本的 Zookeeper 鏡像。
2.6、基于Docker的Kafka部署
加載鏡像:
docker pull confluentinc/cp-kafka:latest
運(yùn)行容器:
以下是一個(gè)基本的 Docker 命令,用于運(yùn)行一個(gè) Kafka 容器:
docker run -d \--name kafka \--network=es-net \-p 9092:9092 \-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 \
confluentinc/cp-kafka:latest
這個(gè)命令的參數(shù)解釋如下:
docker run -d
:使用 Docker 運(yùn)行一個(gè)新的容器,并且在后臺(tái)模式(detached mode)下運(yùn)行。--name kafka
:設(shè)置容器的名稱(chēng)為 “kafka”。--network=es-net
:將容器連接到es-net
網(wǎng)絡(luò)。-p 9092:9092
:端口映射。這個(gè)參數(shù)將容器的 9092 端口映射到主機(jī)的 9092 端口。-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
:設(shè)置環(huán)境變量KAFKA_ZOOKEEPER_CONNECT
,這是 Kafka 的參數(shù),用于指定 Zookeeper 服務(wù)的地址。這里設(shè)置的是zookeeper:2181
,表示 Kafka 將連接到同一 Docker 網(wǎng)絡(luò)中名為 “zookeeper” 的容器的 2181 端口。-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
:設(shè)置環(huán)境變量KAFKA_ADVERTISED_LISTENERS
,這是 Kafka 的參數(shù),用于指定 Kafka 服務(wù)對(duì)外公布的地址和端口。這里設(shè)置的是PLAINTEXT://localhost:9092
。confluentinc/cp-kafka:latest
:要運(yùn)行的 Docker 鏡像的名稱(chēng)和標(biāo)簽。這里使用的是最新版本的 Confluent 平臺(tái)的 Kafka 鏡像。
2.7、基于Docker的Logstash部署
加載鏡像:
docker pull docker.elastic.co/logstash/logstash:7.12.1
創(chuàng)建配置文件:
首先,你需要?jiǎng)?chuàng)建一個(gè) Logstash 配置文件,例如 logstash.conf
,內(nèi)容如下:
input {kafka {bootstrap_servers => "kafka:9092"topics => ["logs_topic"]}
}output {elasticsearch {hosts => ["es:9200"]index => "logs_index"}
}
這個(gè)配置文件定義了 Logstash 的輸入和輸出。輸入是 Kafka,連接到 kafka:9092
,訂閱的主題是 your_topic
。輸出是 Elasticsearch,地址是 es:9200
,索引名是 logs_index
。
運(yùn)行容器:
然后,我們使用以下命令運(yùn)行 Logstash 容器:
docker run -d \--name logstash \--network=es-net \-v /Users/lizhengi/test/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
docker.elastic.co/logstash/logstash:7.12.1
這個(gè)命令的參數(shù)解釋如下:
docker run -d
:使用 Docker 運(yùn)行一個(gè)新的容器,并且在后臺(tái)模式(detached mode)下運(yùn)行。--name logstash
:設(shè)置容器的名稱(chēng)為 “l(fā)ogstash”。--network=es-net
:將容器連接到es-net
網(wǎng)絡(luò)。-v /path/to/your/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
:掛載卷(volume)。這個(gè)參數(shù)將主機(jī)上的logstash.conf
文件掛載到容器的/usr/share/logstash/pipeline/logstash.conf
。docker.elastic.co/logstash/logstash:latest
:要運(yùn)行的 Docker 鏡像的名稱(chēng)和標(biāo)簽。這里使用的是最新版本的 Logstash 鏡像。
請(qǐng)注意,你需要將 /path/to/your/logstash.conf
替換為你的 logstash.conf
文件所在的實(shí)際路徑。
2.8、基于Docker的Filebeat部署
加載鏡像:
docker pull docker.elastic.co/beats/filebeat:7.12.1
運(yùn)行容器:
首先,你需要?jiǎng)?chuàng)建一個(gè) Filebeat 配置文件,例如 filebeat.yml
,內(nèi)容如下:
filebeat.inputs:
- type: logenabled: truepaths:- /usr/share/filebeat/logs/*.logoutput.kafka:enabled: truehosts: ["kafka:9092"]topic: "logs_topic"
這個(gè)配置文件定義了 Filebeat 的輸入和輸出。輸入是文件 /usr/share/filebeat/Javalog.log
,輸出是 Kafka,連接到 kafka:9092
,主題是 logs_topic
。
然后,你可以使用以下命令運(yùn)行 Filebeat 容器:
docker run -d \--name filebeat \--network=es-net \-v /Users/lizhengi/test/logs:/usr/share/filebeat/logs \-v /Users/lizhengi/test/filebeat.yml:/usr/share/filebeat/filebeat.yml \
docker.elastic.co/beats/filebeat:7.12.1
這個(gè)命令的參數(shù)解釋如下:
-
docker run -d
:使用 Docker 運(yùn)行一個(gè)新的容器,并且在后臺(tái)模式(detached mode)下運(yùn)行。 -
--name filebeat
:設(shè)置容器的名稱(chēng)為 “filebeat”。 -
--network=es-net
:將容器連接到es-net
網(wǎng)絡(luò)。 -
-v /Users/lizhengi/test/Javalog.log:/usr/share/filebeat/Javalog.log
:掛載卷(volume)。這個(gè)參數(shù)將主機(jī)上的/Users/lizhengi/test/Javalog.log
文件掛載到容器的/usr/share/filebeat/Javalog.log
。 -
-v /path/to/your/filebeat.yml:/usr/share/filebeat/filebeat.yml
:掛載卷(volume)。這個(gè)參數(shù)將主機(jī)上的filebeat.yml
文件掛載到容器的/usr/share/filebeat/filebeat.yml
。 -
docker.elastic.co/beats/filebeat:latest
:要運(yùn)行的 Docker 鏡像的名稱(chēng)和標(biāo)簽。這里使用的是最新版本的 Filebeat 鏡像。
請(qǐng)注意,你需要將 /path/to/your/filebeat.yml
替換為你的 filebeat.yml
文件所在的實(shí)際路徑。