
每個(gè)broker可以劃分為多個(gè)partition,partiton可以多于broker數(shù),每個(gè)partition有多個(gè)副本。為了更好的做負(fù)載均衡,Kafka盡量將所有的Partition均勻分配到整個(gè)集群上。Kafka分配副本的算法如下:
1)將所有Broker(假設(shè)共n個(gè)Broker)和待分配的Partition排序
2)將第i個(gè)Partition分配到第(i mod n)個(gè)Broker上
3)將第i個(gè)Partition的第j個(gè)Replica分配到第((i + j) mod n)個(gè)Broker上
在正常情況下,每個(gè)partition有一個(gè)leader和0到多個(gè)follower。leader處理對應(yīng)分區(qū)上所有的讀寫請求。leader也是分布式的。follower的日志和leader的日志是相同的,follower被動(dòng)的復(fù)制leader。如果leader掛了,其中一個(gè)follower會(huì)自動(dòng)變成新的leader。kafka采用ISR(In-SyncReplicas同步副本)來管理各副本
1)kafka動(dòng)態(tài)的維護(hù)了一組insync(ISR)的復(fù)本,表示已追上了leader,只有處于該狀態(tài)的成員組才是能被選擇為leader。這些ISR組會(huì)在發(fā)生變化時(shí)被持久化到zookeeper中。
2)如果follower掛掉或卡住或落得很遠(yuǎn),便會(huì)進(jìn)入到Out-of-SyncReplicas列表中,leader則會(huì)移除Out-of-SyncReplicas列表中的副本。至于落了多遠(yuǎn)才叫遠(yuǎn)由replica.lag.max.messages設(shè)置,而表示復(fù)本“卡住”由replica.lag.time.max.ms設(shè)置。(在$KAFKA_HOME/config/server.properties中配置)








暫無數(shù)據(jù)