选举算法汇总(redis、zookeeper、kafka)
1.redis 哨兵(sentinel)模式
- 背景:哨兵模式,节点类型包括master、slave、和sentinel,master-slave节点和主从模式的作用是相同的;多了sentinel节点提高服务的可用性和稳定性
- 触发原因:master(简称A节点)节点异常,当一个sentinel发现A节点ping异常,视为主观下线状态,并广播给其他sentinel,如果超过一定数量(可配置)的sentinel都视为主管下线,则节点A被置为客观下线;需要重新选出一个master节点。
- 目标:从节点A的slave节点中选择一个节点作为新的master
- 选举过程:
- 第一步选举出领头sentienl
- 所有在线的sentinel都有资格当选领头sentinel
- 每个sentinel在每轮配置纪元只能选举一次
- 每个发现master下线的sentinel都要求其他sentinel将自己设置为领头sentinel
- 先到先得:第一个要求某目标sentinel将自己设置为领头sentinel会成功,后来的请求会被拒绝
- 如果某个sentinel被过半sentinel设置为了领头sentinel,那么这个sentinel将成为领头sentinel
- 如果这轮没成功选出,纪元加1,进行下一轮
- 第二步领头sentinel从slave中选举出新master(是从该master的slave列表中选)
- 删除不在线的slave
- 删除5秒内没有和领头sentine通信的slave
- 删除所有和已下线的master断开链接超过指定时间(可配置)的slave
- 如果还剩多个,找到复制偏移量最大的slave(保证数据最新)
- 如果复制偏移量最大的slave有多个,选择运行id最小的
- 第一步选举出领头sentienl
2. redis 集群模式
- 背景:集群模式下节点也是master-salve结构,slave用于复制master节点,并在master节点下线后,代替master继续运行
- 触发原因:处理槽位的某个主节点未收到另外一个主节点的pong信息,将其标为疑似下线;当某个节点被半数以上处理槽位的主机点标记为疑似下线,则该节点被判定为客观下线。需要从其slave中选举一个新的master。
- 选举过程:
- 一个配置纪元表示一轮选举,配置纪元从0开始
- 当从节点发现其复制的主节点下线时,该从节点会广播一条信息,要求有投票权的主节点将自己选举为新的主节点
- 有投票权的主节点会将收到的第一个请求的从节点选举为主节点
- 若某个从节点被超过半数有投票权的主节点选举为主节点,则该从节点即成功新的主节点;否则进行下一轮
3. zookeeper的leader选举
- 背景:zookeeper集群节点有三种角色:leader、follower、observer;其中只有leader节点能处理事务性请求并管理集群;当leader节点下线时,需要从所有的follower节点中选择一个新的leader(其中observer不参与选择和事务投票,只用来扩展集群的非事务处理能力)。zookeeper选择了cp,舍弃了a
- 触发原因:leader节点下线,集群无法对外提供服务
- 选举过程:
- 所有follower节点都被设置为looking状态,表示要进行leader选举
- 所有的follower节点都向其他follower节点广播消息,消息中包含<myid, zxid>,其中myid是机器id;zxid是事务id
- 收到消息的follower节点将收到的zxid和自己的zxid对比,选择zxid大的;如果zxid一样,则选择myid大的,然后将<myid, zxid>重新广播出去
- 统计投票,如果某个follower被半数以上follower选择,则该follower将成为新的leader
- 改变服务器状态,分别对应为leading、following,集群开始对外服务。
4.kafka 优先副本选举
- 背景:kafka每个分区有多个副本,包括一个leader副本和多个follow副本,且每个副本分配在不同的broker上,保证可靠性。只有leader副本对外提供读写服务,follow副本用来同步leader副本;因此一旦leader副本不可用,该分区就不可用;leader副本坐在的节点叫做leader节点;follow副本所在的节点叫做follow节点;优先副本即AR集合中的第一个副本;
- 触发原因:刚开始各分区的leader副本均衡分布在各个节点,保证集群负载的均衡性;但随着节点的上下线,这种平衡被逐渐打破,导致负载不均衡;当不均衡达到设置的阈值时(即某个broker的非优先副本的leader个数/副本数 > 10%),需要进行优先副本选举,以达到分区平衡。
- 选举过程:
- 生成环境不建议打开优先副本选举的开关,防止对线上产生影响;建议在合适的时机进行手动操作,实现分区平衡。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南