概念
- preferred replica
假設(shè)我們?yōu)橐粋€(gè)分區(qū)分配了3個(gè)副本,它們分別是 0、1、2,那么節(jié)點(diǎn)0就是該分區(qū)的 preferred replica,并且通常情況下是不會(huì)發(fā)生變更的,選擇節(jié)點(diǎn)0的原因僅僅是它是副本列表中的第一個(gè)副本。
- preferred leader 選舉
把指定分區(qū)的leader調(diào)整回它們的 preferred replica 的過程。
為什么需要 preferred leader 選舉
因?yàn)樵?kafka 集群長時(shí)間運(yùn)行中,broker 的宕機(jī)或崩潰是不可避免的,leader 就會(huì)發(fā)生轉(zhuǎn)移,即使 broker 重新回來,也不會(huì)是 leader 了。在眾多 leader 的轉(zhuǎn)移過程中,就會(huì)產(chǎn)生 leader 不均衡現(xiàn)象,可能一小部分 broker 上有大量的 leader,影響了整個(gè)集群的性能,所以就需要把 leader 調(diào)整會(huì)最初的 broker 上,這就需要 preferred leader 選舉。
實(shí)踐
需要搭建一個(gè)3節(jié)點(diǎn)的集群環(huán)境,為了方便測試,可以搭建簡單的單機(jī)集群(參考 http://www.itdecent.cn/p/eaac847ca193)。
創(chuàng)建測試 topic:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --partitions 3 --replication-factor 3 --topic test-topic03
查看 topic:
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test-topic03

由上面的輸出可知,當(dāng)前的3個(gè)分區(qū)的 leader 副本已經(jīng)是它們的 preferred replica 了。
現(xiàn)在我們依次關(guān)閉 broker2 和 broker3 來模擬集群服務(wù)器崩潰的場景。這樣做的目的是為了讓所有分區(qū)的leader都變更到broker1上,從而造成集群leader分布不均勻的情況出現(xiàn)。
再次查看 topic:
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test-topic03

3個(gè)分區(qū)的leader現(xiàn)在都變成了broker1。
下面來調(diào)整它們的leader,先創(chuàng)建配置文件:
echo '{"partitions":[{"topic":"test-topic03","partition":0},{"topic":"test-topic03","partition":1}]}' > preferred-leader-plan.json
由于分區(qū)2的leader已經(jīng)是 preferred replica 了,故真正需要調(diào)整的分區(qū)只有分區(qū)0和分區(qū)1。
重新啟動(dòng) broker2、broker3,然后執(zhí)行命令:
bin/kafka-preferred-replica-election.sh --zookeeper localhost:2181 --path-to-json-file <path>/preferred-leader-plan.json
輸出信息:
Created preferred replica election path with test-topic03-0,test-topic03-1
Successfully started preferred replica election for partitions Set(test-topic03-0, test-topic03-1)
再次查看 topic:
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test-topic03

所有分區(qū)都已經(jīng)調(diào)整成它們的preferred replica了。