Kafka使用中的兩個問題總結

Kafka用了挺長時間了,最早時官方文檔也看得挺細的,但結果大半年沒用,最近在做一些部署調整的時候有些細節居然遺忘了,擺了個烏龍。在這裏總結一下,以免再忘。

1. 給Kafka加負載均衡的問題

Kafka producer上傳數據的工作原理:

  1. producer先通過配置的broker列表中的其中一臺,獲取到整個Kafka集羣的metadata,其中包含brokers,topics,partitions包括ISR的信息。定期update。
  2. 根據以上的metadata,以及由配置的message_key決定的partitioner策略(默認不配message_key的話就是簡單的round robin),producer決定將數據分批發送到某個broker的partition中。
  3. producer直接發送數據,不再經過producer配置中的broker轉發。

因此,加負載均衡是對獲取metadata的請求提供了高可用,但不是對實際數據發送做負載均衡。所以流量很小,不需要考慮負載均衡服務器的帶寬。

2. host.name與advertised.host.name的設置

host.name:按配置文件說明,是Kafka綁定的interface。其實這個說明有點誤導,下面會見到。

advertised.host.name:是註冊到zookeeper,client要訪問的broker地址。(可能producer也是拿這個值,沒有驗證)

如果advertised.host.name沒有設,會用host.name的值註冊到zookeeper,如果host.name也沒有設,則會使用JVM拿到的本機hostname註冊到zk。

這裏有兩個坑要注意:

  1. 如果advertised.host.name沒有設,host.name不能設爲0.0.0.0,否則client通過zk拿到的broker地址就是0.0.0.0。
    如果指定要bind到所有interface,host.name不設就可以。

  2. 如果host.name和advertised.host.name都不設,client通過zk拿到的就是JVM返回的本機hostname,如果這個hostname是client無法訪問到的,client就會連不上broker
    所以如果要bind到所有interface,client又能訪問,解決的辦法是host.name不設或設置0.0.0.0,advertised.host.name一定要設置爲一個client可以訪問的地址,如直接設IP地址。
    如果不需要bind到所有interface,也可以只在host.name設置IP地址。

簡單的檢查broker是否可以被client訪問到的辦法,就是在zookeeper中看broker信息,上面顯示的hostname是否是client可以訪問到的地址。
在zkCli中執行get /brokers/<id>

【擴展】爲何producer是配置broker地址而consumer中是配置zookeeper地址

區別的原因是consumer要把consumer group和consumer的信息(主要是分配了哪些topic/partition)註冊到zookeeper中,被各個consumer watch,以實現consumer之間的自動均衡。

至於consumer的offset雖然也可能保存在zookeeper上,但不是區別的原因。因爲在0.9版本以上,offset也是可以保存到Kafka本身的。
</br>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章