您的位置:首页 > 运维架构 > Apache

apache kafka系列之Controller设计机制和状态变化

2014-06-02 15:29 309 查看
apache kafka中国社区QQ群:162272557

在kafka集群中,其中一个broker server作为中央控制器,负责管理分区和副本状态并执行管理着这些分区的重新分配。下面说明如何通过中央控制器操作分区和副本的状态。
名词解释:
isr:同步副本组
OfflinePartitionLeaderSelector:分区下线后新的领导者选举
OAR:老的分配副本
PartitionStateChange:
其有效状态如下:

NonExistentPartition: 这种状态表明该分区从来没有创建过或曾经创建过后来又删除了。
NewPartition:创建分区后,分区处于NewPartition状态。在这种状态下,分区副本应该分配给它,但还没有领导者/同步复制组。
OnlinePartition:一旦一个分区领导者被选出,就会为在线分区状态。
OfflinePartition:如果分区领导者成功选举后,当领导者分区崩溃或挂了,分区状态转变下线分区状态。

其有效的状态转移如下:
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时:

调用方法onNewPartitionCreation

当创建新分区时:

创建新分区列表 -> 调用方法NewPartition
创建所有新分区副本 -> 调用方法NewReplica
新分区在线列表 -> 调用方法OnlinePartition
新分区所有在线副本 -> OnlineReplica

当broker失败或挂掉时:

当前broker所有领导者分区为下线分区 -> 调用方法OfflinePartition
下线和在线分区列表 -> OnlinePartition (使用下线分区领导者选举)
在broker上所有fail副本 -> OfflineReplica

当broker启动时:

发送UpdateMetadate请求给新启动broker的所有分区。
新启动broker的分区副本-> OnlineReplica
下线和在线分区列表 -> OnlinePartition (使用下线分区领导者选举)
当新的broker启动时,对于所有分区副本,系统会调用方法onPartitionReassignment执行未完成的分区分配。

当分区重新分配时: (OAR: 老的分配副本; RAR:每当重新分配副本会有新的副本组)

用OAR + RAR副本组修改并分配副本列表.
当处于OAR + RAR时,发送LeaderAndIsr请求给每个副本。
副本处于RAR - OAR -> 调用方法NewReplica
等待直到新的副本加入isr中
副本处于RAR -> 调用方法OnlineReplica
设置AR to RAR并写到内存中
send LeaderAndIsr request 给一个潜在领导者 (如果当前领导者不在RAR中)和一个被分配的副本列表(使用RAR) 和相同sir到每个处于RAR的broker中。
replicas in OAR - RAR -> Offline (强制这些副本从isr重剔除)
replicas in OAR - RAR -> NonExistentReplica (强制这些副本被删除)
在zk上修改重分配副本到RAR中。
在zk上修改 /admin/reassign_partitions路径,并删除此分区
选举领导者后,副本和isr信息变化,所以重新发送更新元数据请求给每一个broker。

例如, 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时:

replicaStateMachine.startup():

从任何下线副本或上线副本中初始化每个副本
每个副本 -> OnlineReplica (强制LeaderAndIsr请求发送到每个副本)

partitionStateMachine.startup():

从新建分区中初始化每个分区, 下线或上线分区
each OfflinePartition and NewPartition -> OnlinePartition (强制领导者选举)

恢复分区分配
恢复领导者选举

当发送首选副本选举时:

影响分区列表 -> 调用方法OnlinePartition (with PreferredReplicaPartitionLeaderSelector)

关闭broker:

在关闭broker中对于每个分区如果是领导者分区 -> 调用方法OnlinePartition (ControlledShutdownPartitionLeaderSelector)
在关闭broker中每个副本是追随者,将发送StopReplica请求 (w/o deletion)
在关闭broker中每个副本是追随者 -> 调用方法OfflineReplica (强制从同步副本组中删除副本)

请注明转载自:http://blog.csdn.net/lizhitao/article/details/28108919
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: