集群環境:
CenterOS 1台
Kafka:0.10.2.1版本。
今天在測試環境下,我們的Kafka集群工作不正常,具體現象為,使用confulentkafka向kafka集群生產消息失敗,且並沒有任何異常。
檢查server配置、broker日志、程序異常日志等等都沒有發現,網上搜索資料,並沒有類似的現象出現,這就很令人絕望。
沒辦法,自己寫測試程序,注冊confluentkafka的producer error事件一點點打印日志。
發現一個有規律的現象:
- 發送每經過一段時間之后,producer的報告會打印Local:Mesasge Time out的異常,
經過簡單分析,得出基本結論:該異常並不是引發消息發送不過去的誘因,而是結果。精力不能放到這個異常上面。
但是好歹也算是給我一個方向:producer在生產數據時,消息發送超時,並沒有發送過去,超時了。
有了初步的方向,首先就要先確定
- producer-client與broker的網絡連接健康狀態,(這個不用多說,聯系運維同事,各種測驗,甚至內網ip都換了過,初步排除。)
- topic是否自動創建
- 發送消息時消息體有沒有限制。
- 其他等
網絡問題初步排除后,我們去檢查auto.create.topics.enable的配置,默認為true,理論上來講topic應該會自動創建。
且其他環境的topic都可以完美的自動創建。好吧,抱着試試看的態度,手動創建topic,然后發消息。不多說,上圖
竟然發送過去了。
昨天各種測驗各種排查甚至連神器windbg也沒放過,都沒找到問題,抱着試試看的態度一試,竟然找到了原因:因為Topic沒有自動創建,導致消息發送失敗。
好吧,接下來的問題就簡單了,排查為啥Topic沒有自動創建成功
繼續注冊日志事件跟進
上邊那個異常有誤導我很長時間,暫且略過不表,跟他關系不大。
主要原因在下邊:Topic Partition Count is Zero,should refresh metadata。
我們知道,metadata的信息是存在zookeeper中的,有可能是broker和zookeeper的信息同步不及時或者有問題導致topic創建問題失敗。
去檢查server.properties(又來檢查了):zookeeper.connect的配置是內網的配置10.x.x.46:2181。
鑒於zookeeper和kafka都在同一台機器上,把zookeeper的地址改成127.0.0.1,做嘗試,果不其然:
Topic可以自動創建,消息生成成功,問題解決。至此,這次kafka的排障就告一段路。
結論:生產發送失敗時,主要從以下幾個方向入手檢查
1、要檢查網絡連通性
2、topic是否正常創建
3、kafka和zookeeper的連通性,重要的事情要重點標注。