Kafka用了挺長(zhǎng)時(shí)間了畅姊,最早時(shí)官方文檔也看得挺細(xì)的咒钟,但結(jié)果大半年沒(méi)用,最近在做一些部署調(diào)整的時(shí)候有些細(xì)節(jié)居然遺忘了若未,擺了個(gè)烏龍朱嘴。在這里總結(jié)一下,以免再忘粗合。
1. 給Kafka加負(fù)載均衡的問(wèn)題
Kafka producer上傳數(shù)據(jù)的工作原理:
- producer先通過(guò)配置的broker列表中的其中一臺(tái)萍嬉,獲取到整個(gè)Kafka集群的metadata,其中包含brokers,topics,partitions包括ISR的信息隙疚。定期update壤追。
- 根據(jù)以上的metadata,以及由配置的message_key決定的partitioner策略(默認(rèn)不配message_key的話(huà)就是簡(jiǎn)單的round robin)供屉,producer決定將數(shù)據(jù)分批發(fā)送到某個(gè)broker的partition中行冰。
- producer直接發(fā)送數(shù)據(jù)溺蕉,不再經(jīng)過(guò)producer配置中的broker轉(zhuǎn)發(fā)。
因此悼做,加負(fù)載均衡是對(duì)獲取metadata的請(qǐng)求提供了高可用疯特,但不是對(duì)實(shí)際數(shù)據(jù)發(fā)送做負(fù)載均衡。所以流量很小肛走,不需要考慮負(fù)載均衡服務(wù)器的帶寬漓雅。
2. host.name與advertised.host.name的設(shè)置
host.name
:按配置文件說(shuō)明,是Kafka綁定的interface朽色。其實(shí)這個(gè)說(shuō)明有點(diǎn)誤導(dǎo)邻吞,下面會(huì)見(jiàn)到。
advertised.host.name
:是注冊(cè)到zookeeper葫男,client要訪問(wèn)的broker地址抱冷。(可能producer也是拿這個(gè)值,沒(méi)有驗(yàn)證)
如果advertised.host.name沒(méi)有設(shè)梢褐,會(huì)用host.name的值注冊(cè)到zookeeper徘层,如果host.name也沒(méi)有設(shè),則會(huì)使用JVM拿到的本機(jī)hostname注冊(cè)到zk利职。
這里有兩個(gè)坑要注意:
如果advertised.host.name沒(méi)有設(shè),host.name不能設(shè)為0.0.0.0瘦癌,否則client通過(guò)zk拿到的broker地址就是0.0.0.0猪贪。
如果指定要bind到所有interface,host.name不設(shè)就可以讯私。如果host.name和advertised.host.name都不設(shè)热押,client通過(guò)zk拿到的就是JVM返回的本機(jī)hostname,如果這個(gè)hostname是client無(wú)法訪問(wèn)到的斤寇,client就會(huì)連不上broker桶癣。
所以如果要bind到所有interface,client又能訪問(wèn)娘锁,解決的辦法是host.name不設(shè)或設(shè)置0.0.0.0牙寞,advertised.host.name一定要設(shè)置為一個(gè)client可以訪問(wèn)的地址,如直接設(shè)IP地址莫秆。
如果不需要bind到所有interface间雀,也可以只在host.name設(shè)置IP地址。
簡(jiǎn)單的檢查broker是否可以被client訪問(wèn)到的辦法镊屎,就是在zookeeper中看broker信息惹挟,上面顯示的hostname是否是client可以訪問(wèn)到的地址。
在zkCli中執(zhí)行get /brokers/<id>
【擴(kuò)展】為何producer是配置broker地址而consumer中是配置zookeeper地址
區(qū)別的原因是consumer要把consumer group和consumer的信息(主要是分配了哪些topic/partition)注冊(cè)到zookeeper中缝驳,被各個(gè)consumer watch连锯,以實(shí)現(xiàn)consumer之間的自動(dòng)均衡归苍。
至于consumer的offset雖然也可能保存在zookeeper上,但不是區(qū)別的原因运怖。因?yàn)樵?.9版本以上拼弃,offset也是可以保存到Kafka本身的。
</br>