一、Raft 协议简介
Raft 是一种用于管理复制日志的一致性算法。它的主要目标是在一组节点中,确保数据的一致性和高可用性。Raft 将节点分为三种角色:领导者(Leader)、追随者(Follower)和候选人(Candidate)。
在正常情况下,只有一个领导者节点负责处理客户端的请求。追随者节点被动地接收领导者的日志复制,并在领导者出现故障时,通过选举产生新的领导者。
二、RocketMQ 中的 Raft 实现
1. 角色分配
- RocketMQ 的 Broker 节点在使用 Raft 协议时,也会被分配不同的角色。其中,一个节点会被选举为领导者,其他节点为追随者。
- 领导者节点负责接收生产者发送的消息,并将消息复制到追随者节点。追随者节点则确认消息的接收,并在领导者出现故障时,参与选举新的领导者。
2. 日志复制
- 当生产者向 RocketMQ 发送消息时,领导者节点会将消息写入本地日志,并向追随者节点发送复制请求。
- 追随者节点接收到复制请求后,将消息写入本地日志,并向领导者节点发送确认响应。
- 领导者节点在收到大多数追随者节点的确认响应后,认为消息已经被成功复制,并向生产者发送确认响应。
3. 领导者选举
- 如果领导者节点出现故障,追随者节点会在一段时间后发现领导者不可用,并转换为候选人角色。
- 候选人节点会向其他节点发送投票请求,请求其他节点为自己投票。
- 如果一个候选人节点获得了大多数节点的投票,它就会成为新的领导者。
简单来说,Raft 算法的特点就是 Strong Leader:
a. 系统中必须存在且同一时刻只能有一个 Leader,只有 Leader 可以接受 Clients 发过来的请求;
b. Leader 负责主动与所有 Followers 通信,负责将“提案”发送给所有 Followers,同时收集多数派的 Followers 应答;
c. Leader 还需向所有 Followers 主动发送心跳维持领导地位(保持存在感)。
一句话总结 Strong Leader: "你们不要 BB! 按我说的做,做完了向我汇报!"。另外,身为 Leader 必须保持一直 BB(heartbeat)的状态,否则就会有别人跳出来想要 BB 。
三、RocketMQ 利用 Raft 实现高可用保障的优势
1. 数据一致性
- 通过日志复制和领导者选举机制,RocketMQ 可以确保在不同节点上的数据一致性。即使领导者节点出现故障,新的领导者也可以通过复制日志来恢复数据。
2. 高可用性
- 在 Raft 协议的支持下,RocketMQ 可以自动选举新的领导者,从而保证系统的高可用性。即使部分节点出现故障,系统仍然可以正常运行。
3. 可扩展性
- Raft 协议支持动态添加和删除节点,这使得 RocketMQ 可以很容易地进行扩展。当系统负载增加时,可以添加更多的 Broker 节点来提高系统的处理能力。
四、常见面试题解析
1. 什么是Raft协议,它和Paxos有什么区别?
Raft是一个更易于理解的共识算法,它把共识过程分解为领导人选举、日志复制和安全性三个子问题,并且通过增加一些限制条件来减少需要考虑的状态数。与Paxos相比,Raft更注重易于理解,它的设计目标就是易于实现和理解。
2. 在RocketMQ中,Raft协议是如何保证NameServer集群高可用的?
在RocketMQ的NameServer集群中,每个节点运行着Raft协议。如果Leader节点宕机,Raft协议会自动触发选举流程,从Follower节点中选出新的Leader,从而保证NameServer集群的高可用。
3. Raft协议中的Leader选举是如何进行的?
当Leader节点故障时,Follower节点会开始一个选举流程。每个Follower会增加自己的任期号(Term),并给自己投票。如果一个Follower在给定的选举超时时间内没有收到Leader的心跳信息,它就会认为当前没有Leader,然后开始新的选举。如果它收到了大多数节点的投票,那么它就会成为新的Leader。
4. 为什么说Raft协议比Paxos更容易实现?
Raft协议通过限制状态的种类和数量,以及引入了更多的辅助性机制(比如日志条目直接复制),使得Raft比Paxos更容易理解和实现。
5. Raft协议中Leader如何处理客户端的写请求?
客户端的写请求首先会被发送到Leader。Leader将请求转换成日志条目,并将日志条目复制到集群中的其他节点上。一旦条目被复制到多数节点上,Leader就会将该条目应用到自己的状态机,并返回结果给客户端。
总之,RocketMQ 利用 Raft 协议实现了高可用保障,为分布式系统中的消息传递提供了可靠的解决方案。了解 RocketMQ 中的 Raft 实现以及相关的常见面试题,对于深入理解分布式系统和消息中间件的原理和应用具有重要意义
【关联阅读】




