在kafka集群中,其中一个broker server作为中央控制器,负责管理分区和副本状态并执行管理着这些分区的重新分配。下面说明如何通过中央控制器操作分区和副本的状态。
名词解释:
isr:同步副本组
OfflinePartitionLeaderSelector:分区下线后新的领导者选举
OAR:老的分配副本
PartitionStateChange:
其有效状态如下:
其有效的状态转移如下:
NonExistentPartition -> NewPartition
1.群集中央控制器根据计算规则,从zk中读取分区信息,创建新分区和副本。
NewPartition -> OnlinePartition
1.分配第一个活着的副本作为分区领导者,并且该分区所有副本作为一个同步复制组,写领导者和同步副本组数据到zk中。
2.对于这个分区,发送LeaderAndIsr请求给每一个副本分区和并发送UpdateMetadata请求到每个活者的broker server。
OnlinePartition,OfflinePartition -> OnlinePartition
1.对于这个分区,需要选择新的领导者和同步副本组,一个副本组要接受LeaderAndIsr请求,最后写领导者和同步副本组信息到zk中。
a.OfflinePartitionLeaderSelector:新领导者=存活副本(最好是在isr);新isr =存活isr如果不是空或恰好为新领导者,否则;正在接受中副本=存活已分配副本。
b.ReassignedPartitionLeaderSelector:新领导者=存活分区重新分配副本;新isr =当前isr;正在接受中副本=重新分配副本
c.PreferredReplicaPartitionLeaderSelector:新领导这=第一次分配副本(如果在isr);新isr =当前isr;接受副本=分配副本
d.ControlledShutdownLeaderSelector:新领导者=当前副本在isr中且没有被关闭,新isr =当前isr -关闭副本;接受副本=存活已分配副本。
2.对于这个分区,发送LeaderAndIsr请求给每一个接收副本和UpdateMetadata请求到每个broker server
NewPartition,OnlinePartition -> OfflinePartition
1.这只不过标识该分区为下线状态
OfflinePartition -> NonExistentPartition
1.这只不过标识该分区为不存在分区状态
ReplicaStateChange:
有效状态如下:
1.NewReplica:当创建topic或分区重新分配期间副本被创建。在这种状态下,副本只能成为追随者变更请求状态。
2.OnlineReplica:一旦此分区一个副本启动且部分分配副本,他将处于在线副本状态。在这种状态下,它可以成为领导者或成为跟随者状态变更请求。
3.OfflineReplica:每当broker server副本宕机或崩溃发生时,如果一个副本崩溃或挂了,它将变为此状态。
4.NonExistentReplica:如果一个副本被删除了,它将变为此状态。
有效状态转移如下:
NonExistentReplica - - > NewReplica
1.使用当前领导者和isr分区发送LeaderAndIsr请求到新副本和UpdateMetadata请求给每一个存活borker
NewReplica - > OnlineReplica
1.添加新的副本到副本列表中
OnlineReplica,OfflineReplica - > OnlineReplica
1.使用当前领导者和isr分区发送LeaderAndIsr请求到新副本和UpdateMetadata请求给每一个存活borker
NewReplica,OnlineReplica - > OfflineReplica
1.发送StopReplicaRequest到相应副本(w / o删除)
2.从isr和发送LeaderAndIsr请求重删除此副本(isr)领导者副本和UpdateMetadata分区每个存活broker。
OfflineReplica - > NonExistentReplica
1.发送StopReplicaRequest到副本(删除)
KafkaController操作:
当新建topic时:
当创建新分区时:
当broker失败或挂掉时:
当broker启动时:
当分区重新分配时: (OAR: 老的分配副本; RAR:每当重新分配副本会有新的副本组)
例如, if OAR = {1, 2, 3} and RAR = {4,5,6}, 在zk上重分配副本和领导者/is这些值可能经历以下转化。
AR leader/isr
{1,2,3} 1/{1,2,3} (初始化状态)
{1,2,3,4,5,6} 1/{1,2,3} (step 2)
{1,2,3,4,5,6} 1/{1,2,3,4,5,6} (step 4)
{1,2,3,4,5,6} 4/{1,2,3,4,5,6} (step 7)
{1,2,3,4,5,6} 4/{4,5,6} (step 8)
{4,5,6} 4/{4,5,6} (step 10)
注意,当只有一个地方我们能存储OAR持久化数据,必须用RAR在zk修改AR节点数据,这样,如果控制器在这一步之前崩溃,我们仍然可以恢复。
当中央控制器failover时:
当发送首选副本选举时:
关闭broker: