背景
搭建好了6.2.4版本的ELK集群,從另外一個kafka集群中獲取topic中的數(shù)據(jù),寫入到ES中,出現(xiàn)了兩個問題,第一:從kafka集群獲取數(shù)據(jù)失??;第二:能夠獲取到數(shù)據(jù),但是寫入ES,一直報錯如下:
Attempted to send a bulk request to Elasticsearch configured at '["http://localhost:9200/"]', but an error occurred and it failed! Are you sure you can reach elasticsearch from this machine using the configuration provided? {:error_message=>"[406] {"error":"Content-Type header [text/plain; charset=ISO-8859-1] is not supported","status":406}", :error_class=>"Elasticsearch::Transport::Transport::Errors::NotAcceptable"
分析
問題1:從kafka集群獲取數(shù)據(jù)失敗
現(xiàn)象是:logstash啟動成功,控制臺沒有打印message的日志,去Kibana上查看index,發(fā)現(xiàn)index也沒有創(chuàng)建成功。排查方式如下:
- 配置項是參考kafka-input-plugin對應(yīng)版本配置的,check了下,沒有錯。
- 輸出改為控制臺輸出,仍沒有數(shù)據(jù),說明和ES無關(guān)。
- 修改bootstrap_servers從另外一個kafka集群獲取數(shù)據(jù),發(fā)現(xiàn)能夠正常獲取數(shù)據(jù),說明kafka兼容性問題。
- logstash查看插件版本 ./bin/logstash-plugin list --verbose,發(fā)現(xiàn)內(nèi)嵌的kafka插件是logstash-input-kafka (8.0.6) ,對應(yīng)的客戶端是1.0.0;而kafka集群的版本為0.9.0.1。<u>https://www.elastic.co/guide/en/logstash-versioned-plugins/current/v8.0.2-plugins-inputs-kafka.html</u>
logstash官網(wǎng)很明確的說明了,對于0.9的kafka集群,是不兼容的,因此沒法獲取到數(shù)據(jù)
image.png
<<既然是kafka插件不兼容的問題,查看了官網(wǎng),支持0.9的,下載了logstash2.4版本安裝,配置如下>>
input {
kafka {
zk_connect => "datastream0.lt.org:2181,datastream1.lt.org:2181,datastream2.lt.org:2181/kafka_online"
auto_offset_reset => "smallest"
group_id => "logstash23"
topic_id => "datastream.novel"
codec => "json"
reset_beginning => "true"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
geoip {
source => "clientip"
}
}
output {
stdout { }
elasticsearch {
hosts => "esIp:port"
index => "exception-%{YYYY.MM.dd}"
}
}
問題2:寫入ES,報錯406,NotAcceptable
現(xiàn)象是:使用了Logstash2.4的版本號,從0.9版本的kafka集群可以獲取到數(shù)據(jù),控制臺有打印,但是寫入ES一直報錯。注:本地ES是6.2.4的,已有業(yè)務(wù)運行其上。
出現(xiàn)這個錯誤的原因是因為Logstash2.4和ES6.2.4無法兼容。也曾嘗試將logstash6.2.4版本的kafka插件降為2.0.9(logstash2.4使用的kafka插件),但是因為在更新插件過程中,會和logstash-core-plugin-api不兼容,出現(xiàn)很多沖突,也不能解決這個問題。
綜上所述:
- 降低logstash2.4.0可以獲取到0.9kafka集群的數(shù)據(jù),但是寫入ES6.2.4有兼容性問題。
- 基于Logstash6.2.4,降低logstash-input-kafka插件為2.0.9,會出現(xiàn)API兼容性問題。
- 正如官網(wǎng)所說,ELK版本盡可能保持和kafka等輸入源版本一致。
解決方案:
- 升級kafka集群的版本
- 遷移kafka集群的數(shù)據(jù)至高版本kafka集群
- ELK全部降級為匹配到kafka0.9的版本
經(jīng)驗總結(jié):
- 搭建ELK首先需要確定數(shù)據(jù)來源有哪些,尤其是涉及到kafka這種組件的,需要提前了解kafka集群的版本信息,確定你需要下載的ELK版本。否則數(shù)據(jù)讀取不到。
- ELK這三個組件,版本盡可能一致,否則即使能夠讀取到輸入的數(shù)據(jù),但是寫入不到ES中,也是很蛋疼的。
- ELK的配置問題,對于不同的版本,配置項很多不一樣,不能僅僅在網(wǎng)上查到一個配置就填上去,需到官網(wǎng)查詢對應(yīng)的配置項。例如,kafka插件早期版本logstash的配置項是zk_connect,但是稍微新一點的版本都是bootstrap_servers;另外需要注意配置項的類型,有些是string的,有些是array的,不要亂填。
- Kibana的關(guān)鍵配置項
server.port: 5601
server.host: "10.171.xxx.yyy" //這個是外部瀏覽器訪問的地址
elasticsearch.url: "http://esIp:9200" //這個是集群內(nèi)部通信的
