17、kafka分区选主机制

1、大数据常用的选主机制

leader的选择方法非常多,大数据领域常用的的选举方法有如下集中
(1)Zab(zookeeper使用)
a、快速leader选举(leader election)
b、发现或者版本建立(epoch establish)
c、同步(follower从leader同步数据和状态)
d、广播(leader广播数据或状态到follower)

例如有3个节点需要选举leader,编号为1,2,3. 先启动1,选择自己为leader,然后启动2,首先也选择自己为leader。由于1,2都没有过半,选择编号大的为leader,所以1,2都选择2为leader。然后3启动后发现1,2都已经协商好且数量过半,于是3也选择2为leader,此时leader选择结束。
因为zab协议需要选择过半以上才能被选举为leader,所以zab协议需要奇数个机器参与选举(1,3,5,7一般不超过7个,因为zk一般同步元数据,所以负载不是很高,zk管理的节点通信负载才比较高,5或7个一般能处理大量的集群),一般为第二个节点启动后被选择为leader。

(2)Raft协议
相关角色说明

leader:处理所有客户端交互,日志复制等,一般只有一个leader
Follower:类似选民,完全被动
Candidate:候选人,可以为选为一个新的领导,由管理员配置

启动时在集群中指定一些机器为candidate,然后candidate开始向其他机器(尤其是follower)拉票,当某一个candidate的票数超过半数,它就成为leader(同美国总统选举)。

两种选择算法的区别联系
(1)他们都是Paxos算法的变种。
(2)与zab协议不同的是,zab的每一个节点都有被选为leader的协议,raft协议必须从候选人中选择为leader。

2、常用选主机制的缺点

最简单的方式
由于kafka集群依赖zookeeper集群,所以最简单直观的方案是:所有的follower都在zookeeper上设置一个watch,一旦leader宕机,其对应的ephemeral znode(临时节点)会自动删除,此时所有follower都尝试创建该节点,而创建成功者(zookeeper保证只有一个能创建成功)即是新的leader,其他replica即为follower。

该方式有如下缺点:
a、脑裂(split-brain)

这是由于zookeeper的特性引起的,虽然zookeeper能保证所有的watch按顺序触发,但并不能保证同一时刻所有的replica看到的状态是一样的,这就可能造成不同的replica的响应不一致;(如由于网络原因部分选择的leader已经更新,但是其他follower由于网络原因没有看到,部分又选举出一个leader,导致一个集群出现两个leader)

b、羊(惊)群效应(herd effect)

如果宕机的哪个broker上的partition比较多,会造成多个watch被触发,造成集群类大量的调整(向羊群开一枪所有羊群四处奔散,造成网路资源和负载)。
c、zookeeper负载过重:每一个replica都要为此在zookeeper上注册一个watch,当集群规模增加到几千个partition时,zookeeper负载会过重。

3、kafka分区的选主机制

kafka如何解决以上选举机制的
kafka的leader election方案解决了上述问题,它在所有的broker中选出一个controller,所有的partition的leader选举都有controller决定。controller会将leader的改变直接通过RPC的方式(比zookeeper Queue的方式更高效)通知需要为此作为响应的broker。

原因:
1、不用zk选举,使用controller(Controller会将leader的改变通过rpc方式通知给follower),没有zk负载过重问题
2、也没有注册watch不会触发任何事件-惊群效应
3、leader失败是由一个Controller进行选举并不会产生任何通信,所以不会有脑裂的情况

问题:
(1)Controller是如何选举出来的
每一个broker都会在Controller path(/controller)上注册一个watch。当前controller失败时,对应的Controller path会自动消失(临时节点)。此时该watch被触发,所有活着的broker都会去竞选成为新的Controller(创建新的controller path),但是只有一个会竞选成功。竞选成功者成为新的leader。竞选失败则重新在新的Controller path上注册watch,因为zk的watch是一次性的,被触发一次之后即失效,所以需要重新注册。
(2)如何使用Controller进行partition选举
a、从zk中读取当前分区的所有ISR(in-sync-replicas)集合
b、调用配置的分区算法选择分区的leader
kafka选择分区算法:
i、NoOpLeaderSelector–偏爱分区(SR中的第一个),并将leader发送给为此做出改变的broker,
ii、offlinePartitionLeader–也是选择偏爱分区作为leader
iii、reassignedPartitionLeader
iii、preferredReplicaPartitionLeader
iiii、ControlledShutdownLeader
上面五中算法都使用偏爱分区作为leader,区别是选择leader之后所做的操作不同。

快来成为我的朋友或合作伙伴,一起交流,一起进步!:
QQ群:961179337
微信:lixiang6153
邮箱:lixx2048@163.com
公众号:IT技术快餐
更多资料等你来拿!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝壳里的沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值