歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
Elasticsearch作為當前主流的全文檢索引擎,除了強大的全文檢索能力和高擴充套件性之外,對多種資料來源的相容能力也是其成功的祕訣之一。而Elasticsearch強大的資料來源相容能力,主要來源於其核心元件之一的Logstash, Logstash通過外掛的形式實現了對多種資料來源的輸入和輸出。Kafka是一種高吞吐量的分散式釋出訂閱訊息系統,是一種常見的資料來源,也是Logstash支援的眾多輸入輸出源的其中一個。本文將從實踐的角度,研究使用Logstash Kafka Input外掛實現將Kafka中資料匯入到Elasticsearch的過程。
使用Logstash Kafka外掛連線Kafka和Elasticsearch1 Logstash Kafka input外掛簡介
Logstash Kafka Input外掛使用Kafka API從Kafka topic中讀取資料資訊,使用時需要注意Kafka的版本及對應的外掛版本是否一致。該外掛支援通過SSL和Kerveros SASL方式連線Kafka。另外該外掛提供了group管理,並使用預設的offset管理策略來操作Kafka topic。
Logstash預設情況下會使用一個單獨的group來訂閱Kafka訊息,每個Logstash Kafka Consumer會使用多個執行緒來增加吞吐量。當然也可以多個Logstash例項使用同一個group_id,來均衡負載。另外建議把Consumer的個數設定為Kafka分割槽的大小,以提供更好的效能。
2 測試環境準備
2.1 建立Elasticsearch叢集
為了簡化搭建過程,本文使用了騰訊雲Elasticsearch service。騰訊雲Elasticsearch service不僅可以實現Elasticsearch叢集的快速搭建,還提供了內建Kibana,叢集監控,專用主節點,Ik分詞外掛等功能,極大的簡化了Elasticsearch叢集的建立和管理工作。
2.2 建立Kafka服務
Kafka服務的搭建採用騰訊雲CKafka來完成。與Elasticsearch Service一樣,騰訊雲CKafka可以實現Kafka服務的快速建立,100%相容開源Kafka API(0.9版本)。
2.3 伺服器
除了準備Elasticsearch和Kafka,另外還需要準備一臺伺服器,用於執行Logstash以連線Elasticsearch和Kafka。本文采用騰訊雲CVM伺服器
2.4 注意事項
-
需要將Elasticsearch、Kafka和伺服器建立在同一個網路下,以便實現網路互通。由於本文采用的是騰訊雲相關的技術服務,因此只需要將Elasticsearch service,CKafka和CVM建立在同一個私有網路(VPC)下即可。
-
注意獲取Elasticsearch serivce,CKafka和CVM的內網地址和埠,以便後續服務使用
本次測試中:
服務 | ip | port |
---|---|---|
Elasticsearch service | 192.168.0.8 | 9200 |
Ckafka | 192.168.13.10 | 9092 |
CVM | 192.168.0.13 | - |
3 使用Logstash連線Elasticsearch和Kafka
3.1 Kafka準備
可以參考[CKafka 使用入門]
按照上面的教程
-
建立名為kafka_es_test的topic
-
安裝JDK
-
安裝Kafka工具包
-
建立producer和consumer驗證kafka功能
3.2 安裝Logstash
Logstash的安裝和使用可以參考[一文快速上手Logstash]
3.3 配置Logstash Kafka input外掛
建立kafka_test_pipeline.conf檔案內容如下:
input{
kafka{
bootstrap_servers=>"192.168.13.10:9092"
topics=>["kafka_es_test"]
group_id=>"logstash_kafka_test"
}
}
output{
elasticsearch{
hosts=>["192.168.0.8:9200"]
}
}
複製程式碼
其中定義了一個kafka的input和一個elasticsearch的output
對於Kafka input外掛上述三個引數為必填引數,除此之外還有一些對外掛行為進行調整的一些引數如:
auto_commit_interval_ms 用於設定Consumer提交offset給Kafka的時間間隔
consumer_threads 用於設定Consumer的執行緒數,預設為1,實際中應設定與Kafka Topic分割槽數一致
fetch_max_wait_ms 用於指定Consumer等待一個fetch請求達到fetch_min_bytes的最長時間
fetch_min_bytes 用於指定Consumer fetch請求應返回的最小資料量
topics_pattern 用於通過正則訂閱符合某一規則的一組topic
更多引數參考:[Kafka Input Configuration Options]
3.4 啟動Logstash
以下操作在Logstash根目錄中進行
- 驗證配置
./bin/logstash -f kafka_test_pipeline.conf --config.test_and_exit
複製程式碼
如有錯誤,根據提示修改配置檔案。若配置正確會得到如下結果
Sending Logstash's logs to /root/logstash-5.6.13/logs which is now configured via log4j2.properties
[2018-11-11T15:24:01,598][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"netflow", :directory=>"/root/logstash-5.6.13/modules/netflow/configuration"}
[2018-11-11T15:24:01,603][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"fb_apache", :directory=>"/root/logstash-5.6.13/modules/fb_apache/configuration"}
Configuration OK
[2018-11-11T15:24:01,746][INFO ][logstash.runner ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
複製程式碼
- 啟動Logstash
./bin/logstash -f kafka_test_pipeline.conf --config.reload.automatic
複製程式碼
觀察日誌是否有錯誤提示,並及時處理
3.4 啟動Kafka Producer
以下操作在Kafka工具包根目錄下進行
./bin/kafka-console-producer.sh --broker-list 192.168.13.10:9092 --topic kafka_es_test
複製程式碼
寫入測試資料
This is a message
複製程式碼
3.5 Kibana驗證結果
登入Elasticsearch對應Kibana, 在Dev Tools中進行如下操作
- 檢視索引
GET _cat/indices
複製程式碼
可以看到一個名為logstash-xxx.xx.xx的索引被建立成功
green open .kibana QUw45tN0SHqeHbF9-QVU6A 1 1 1 0 5.5kb 2.7kb
green open logstash-2018.11.11 DejRdNJVQ1e1MwbyJjJjLw 5 1 1 0 8.7kb 4.3kb
複製程式碼
- 檢視寫入的資料
GET logstash-2018.11.11/_search
複製程式碼
可以看到資料已經被成功寫入
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "logstash-2018.11.11",
"_type": "logs",
"_id": "AWcBsEegMu-Dkjm1ap3H",
"_score": 1,
"_source": {
"message": "This is a message",
"@version": "1",
"@timestamp": "2018-11-11T07:33:09.079Z"
}
}
]
}
}
複製程式碼
4 總結
Logstash作為Elastic Stack中資料採集和處理的核心元件,為Elasticsearch提供了強大的資料來源相容能力。從測試過程可以看出,使用Logstash實現kafka和Elaticsearch的連線過程相當簡單方便。另外Logstash的資料處理功能,也使得采用該架構的系統對資料對映和處理有天然的優勢。
然而,使用Logstash實現Kafka和Elasticsearch的連線,並不是連線Kafka和Elasticsearch的唯一方案,另一種常見的方案是使用Kafka Connect, 可以參考“當Elasticsearch遇見Kafka--Kafka Connect”
此文已由作者授權騰訊雲+社群釋出,更多原文請點選
搜尋關注公眾號「雲加社群」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社群!