基于电商场景的高并发RocketMQ实战-Raft协议的leader选举算法、Broker基于状态机实现的leader选举
2023-12-26 12:19:10
🌈🌈🌈🌈🌈🌈🌈🌈
【11来了】文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁
Raft 协议的 leader 选举算法
Raft 协议是一种分布式一致性算法,用于解决分布式系统中的数据一致性问题。
Raft 协议将整个系统的状态分为 3 种角色:领导者 leader、跟随者 follower、候选者 candidate
那么通过 Raft 协议进行的 leader 选举算法流程如下:
- 每个 follower 都会给自己设置一个 150ms~300ms 的随机倒计时时间
- 第一个倒计时结束的 follower,先将自己的身份转变为 candidate,并且表示自己想要去竞选为 leader,于是先投自己一票
- 此时,这个 candidate 还会去找其他的 follower 进行拉票,其他的 follower 会投票给收到的第一个请求者,当这个 candidate 的票数超过集群中的半数,就成功选举为 leader
- 选举成功后,新的 leader 会周期性的向 follower 发送心跳消息,以维持领导地位(follower 设计成为 candidate 的倒计时,每次收到 leader 的心跳都会将倒计时重新刷新,这样当 leader 健康的时候,follower 永远没有机会成为 candidate)
Broker 基于状态机实现的 leader 选举
状态机(State Machine)指的是一种抽象模型,包括一组状态以及在不同状态之间转换的规则,在不同状态下执行的行为是不同的
Broker 在实现 leader 选举就是通过 状态机
来实现的
完整流程图如下:
在启动 Broker 之后,每个 Broker 自己都有一个状态机,状态切换流程如下:
- Broker 初始化状态为 follower
- 执行 follower 对应行为
maintainAsFollower
,判断当前 follower 是否收到来自 leader 的心跳包- 如果没有收到,则开启自己切换为 candidate 状态的倒计时
- 如果收到了,证明已经有 leader 了,刷新自己切换为 candidate 状态的倒计时
- 当倒计时结束之后切换为 candidate 状态,执行 candidate 状态对应行为
maintainAsCandidate
,首先会给自己投一票,之后再想其他 Broker 节点发出给自己投票的请求(其他 Broker 节点只能投一票,会投给最先请求的 candidate) - 判断是否收到半数以上投票
- 没有收到,则重置切换为 candidate 的倒计时,重新选举
- 收到,则切换状态为 leader
- 切换为 leader 状态后,执行 leader 对应行为
maintainAsLeader
,此时会定时向其他 broker 节点发送心跳,来维持自己的 leader 地位,如果没有收到了半数以上的心跳响应,则说明当前 leader 与其他节点可能连接断开,则将当前 leader 切换为 candidate 状态
文章来源:https://blog.csdn.net/qq_45260619/article/details/135215917
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!