Raft算法
Raft算法
Raft 算法是一种可靠且易于理解的共识算法,适用于构建分布式系统。它通过领导者选举、日志复制和安全性保证来实现一致性。
Raft 算法中有三个角色:领导者(leader)、候选人(candidate)、跟随者(follower)。
- 领导者(leader):负责处理客户端请求,并将日志复制到其他节点。
- 候选人(candidate):是在选举过程中的临时角色,它负责发起选举并尝试成为新的领导者。
- 跟随者(follower):只是被动地接受来自领导者的指令,并将日志复制到自己的日志中。
领导者选举
raft
算法,当集群节点发现领导者故障下线,健康节点会重新选举,选出新的领导选举,由它去协调分布式系统操作。redis
哨兵选举策略与raft
算法大同小异,都是通过(多轮)选举,选出票数超过半数(法定人数可配)的候选人作为领导选举。- 而
redis
(哨兵)集群节点有三种角色:master/slave/sentinel
,sentinel
主要负责检测master
故障,一旦发现master
客观下线,sentinel
马上进入 投票选举 环节,从多个sentinel
节点中选出领导选举,由它去执行master
的故障转移。
master 主观下线 –> master 客观下线 –> 投票选举 leader –> leader 执行故障转移
日志复制
- raft 算法的数据复制是
强一致性
,领导者接收客户端的请求,将日志复制到其他节点,并确保被复制节点上的数据日志顺序一致。 - 当半数以上的其他节点成功接收日志,领导者才会确认该条日志提交成功,并修改其它节点上的日志状态为提交成功,通过这样的方式保证集群的数据一致性。
redis
的数据复制是最终一致
,master 负责接收客户端的请求,将数据写入内存后,异步复制数据到 slave。slave
初始或断线重连master
,发现数据不一致后,会根据slave
当前的数据偏移量或master
节点 ID,向master
实现增量同步或者全量同步。- 如果
slave
正常链接master
,master
数据发生变化会正常发送给对应slave
,但不需要半数以上的slave
节点确认接收才确认数据同步成功。 redis
是高性能服务,它需要在保证性能的前提下进行数据复制,因此数据的最终一致
<强一致
。
安全性
raft
算法的日志复制是强一致,安全性明显要比redis
要好。raft
算法的领导选举,需要确保日志的term
和日志的index
最优的健康的节点当选领导者。redis
数据复制是最终一致,master
设置数据积压缓冲区和数据偏移量,与slave
的数据量进行对比,进行数据复制实现最终一致。redis master
故障下线后,redis
哨兵重新选举,选出新的哨兵领导者。哨兵领导者在下线master
的slave
节点中筛选出最优(网络链接正常,优先级低,数据偏移量最大)的slave
将其晋升为master
。
redis的高可用性
redis
用复制来解决可靠性,一份数据做多份冗余。但是,当master
节点因为某种原因下线,还必须有一种机制能让slave
节点自动地转化成master
节点,对外提供写服务,保证系统的高可用性。redis
的sentinel
就是这样的一种机制。