Nacos-10--认识Nacos中的Raft协议(Nacos强一致性的实现原理)
Nacos中的Raft协议是一种基于CP(强一致性)的分布式一致性协议,用于确保持久化服务实例(非临时实例)和关键配置数据的强一致性。Raft协议通过领导者选举、日志复制、安全性保证等机制,确保在分布式系统中即使部分节点故障或网络分区,数据仍能保持一致性和可用性。
1、Raft协议的核心设计思想
Raft协议的设计目标是强一致性和容错性。
核心思想:
- 领导者(Leader)主导机制:集群中只有一个Leader,负责处理所有写请求。
- 日志复制(Log Replication):Leader将客户端请求转换为日志条目,并同步到所有Follower节点。
- 半数确认(Majority Acknowledgement):日志条目需半数以上节点确认后才能提交,确保数据一致性。
- 安全性(Safety):通过严格的日志匹配规则和Leader选举规则,避免数据冲突。
2、Raft协议的核心概念
1、节点角色
- Leader:集群中唯一的主节点,负责处理所有写请求,并将日志条目同步到Follower。
- Follower:从节点,被动接收Leader的日志复制请求,并响应心跳。
- Candidate:临时角色,用于Leader选举阶段,发起投票请求。
2、任期(Term)
- Term是逻辑时钟:用于标识Raft协议的时间周期,每个Term从0开始递增。
- Leader选举触发Term变化:当Follower未收到Leader心跳时,会进入Candidate状态并启动新Term的选举。
3、日志条目(Log Entry)
- 日志结构:每个日志条目包含客户端请求的命令(如服务注册、配置更新)、任期号(Term)和日志索引(Index)。
- 日志提交(Commit):当 Leader 收到半数以上节点的确认后,日志条目被标记为已提交,状态机执行该命令。
3、Raft协议的工作原理
1、领导者选举(Leader Election)
1、初始状态:所有节点初始状态为Follower。
2、超时触发选举:
- Follower在随机时间(如150ms-300ms)内未收到Leader心跳,进入Candidate状态。
3、投票请求: - Candidate增加当前Term,向其他节点发送RequestVoteRPC请求。
- Follower若未投票给其他Candidate,且Candidate的日志至少与自身一样新,则投票给该Candidate。
4、选举成功: - Candidate收到半数以上节点的投票,成为新Leader。
- Leader定期发送心跳(AppendEntriesRPC)维持领导权。
2、日志复制(Log Replication)
1、客户端请求:
- 客户端向Leader发送写请求(如服务注册或配置更新)。
2、日志追加: - Leader将请求转换为日志条目(包含命令、Term、Index),追加到本地日志。
3、日志同步: - Leader向所有Follower发送AppendEntriesRPC,包含新日志条目。
4、日志提交: - 当半数以上节点确认日志条目后,Leader提交该日志,并应用到状态机(如更新服务注册表或配置)。
5、响应客户端: - Leader向客户端返回操作结果(如注册成功或配置更新成功)。
3、安全性保证(Safety)
- 日志匹配规则:
- Follower收到AppendEntries后,会检查前一日志的Term和Index是否与本地一致。
- 若不一致,拒绝接受新日志,Leader需回退日志索引重新同步。
- Leader选举限制:
- 只有拥有最新日志的节点才能成为Leader(通过Term和日志长度判断)。
- 脑裂防护:
- 网络分区恢复后,旧Leader若发现更高Term的新Leader,自动降级为Follower。
4、Raft协议在Nacos中的实现
Nacos通JRaft框架实现Raft协议,用于支持持久化服务实例(Ephemeral=false)和关键配置的强一致性。
1、节点状态管理
- 角色转换:
- Nacos节点初始为Follower,超时后进入Candidate并发起选举。
- 选举成功后成为Leader,定期发送心跳维持领导权。
- 集群元数据同步:
- 节点启动时通过CliServiceaddPeer注册到Leader,同步全量数据。
2、数据写入流程
1、客户端请求:
- 客户端注册持久化实例(Ephemeral=false)或更新配置。
2、Leader处理: - Leader将请求转换为日志条目,追加到本地日志。
3、日志复制: - Leader通过AppendEntriesRPC将日志同步到Follower。
4、提交与应用: - 半数以上节点确认后,日志提交并应用到状态机(如更新服务注册表或配置文件)。
5、响应客户端: - Leader返回操作结果(如注册成功)。
3、数据读取流程
- 强一致性读:
- 默认从Leader读取数据,确保返回最新提交的日志。
- 线性一致性读:
- 通过ReadIndex机制,确保Follower读取时等待日志同步到最新提交索引。
- Lease Read:
- Leader使用租约(Lease)机制,在租约有效期内允许Follower读取本地数据(需确保租约未过期)。
4、网络分区与恢复
- 分区期间:
- 若Leader所在分区无法与大多数节点通信,会自动放弃领导权。
- 其他分区若能形成多数派,会选举新Leader。
- 恢复后:
- 旧Leader降级为Follower,同步新Leader的日志。
- 通过日志匹配规则修复数据差异。
5、Raft协议的适用场景
Raft协议适用于需要强一致性和数据可靠性的场景:
- 持久化服务注册:如金融系统的数据库实例注册(Ephemeral=false)。
- 关键配置管理:如支付系统的限流规则、数据库连接串等配置。
- 元数据存储:如服务元数据、命名空间配置等。
6、Raft协议的优缺点
优点:
- 强一致性:日志提交需半数以上节点确认,确保数据一致性。
- 容错性:容忍少数节点故障(≤ (N- 1)/2)。
- 可理解性:相比Paxos,Raft的设计更直观,易于实现和调试。
- 动态成员管理:支持运行时添加或移除节点。
缺点:
- 性能开销:日志同步需网络通信,写延迟较高。
- 可用性限制:网络分区或Leader故障期间,可能暂时不可用。
- 复杂性:实现日志匹配、Leader选举等逻辑需处理大量边界条件。
7、Raft协议与Distro协议对比
说明:
- Raft 倾向于一致性和分区容忍性(CP),在网络分区或节点故障时可能暂停服务直到选出新Leader。
- Distro 倾向于可用性和分区容忍性(AP),允许在分区期间继续提供服务,通过异步机制保证最终一致性。
8、总结
Nacos中的Raft协议通过领导者选举、日志复制、安全性保证等机制,确保了持久化服务实例和关键配置的强一致性。它适用于对数据可靠性要求极高的场景(如金融、支付系统),但在性能和可用性上需权衡。通过灵活选择Raft(CP)或Distro(AP)协议,Nacos能够满足不同业务场景的需求。
向阳前行,Dare To Be!!!