Raft算法
Mzy 金丹

Raft算法

Raft 算法是一种可靠且易于理解的共识算法,适用于构建分布式系统。它通过领导者选举、日志复制和安全性保证来实现一致性。

Raft 算法中有三个角色:领导者(leader)、候选人(candidate)、跟随者(follower)。

  • 领导者(leader):负责处理客户端请求,并将日志复制到其他节点。
  • 候选人(candidate):是在选举过程中的临时角色,它负责发起选举并尝试成为新的领导者。
  • 跟随者(follower):只是被动地接受来自领导者的指令,并将日志复制到自己的日志中。

领导者选举

  • raft算法,当集群节点发现领导者故障下线,健康节点会重新选举,选出新的领导选举,由它去协调分布式系统操作。
  • redis哨兵选举策略与raft算法大同小异,都是通过(多轮)选举,选出票数超过半数(法定人数可配)的候选人作为领导选举。
  • redis(哨兵)集群节点有三种角色:master/slave/sentinelsentinel主要负责检测master故障,一旦发现master客观下线,sentinel马上进入 投票选举 环节,从多个sentinel节点中选出领导选举,由它去执行 master的故障转移。

master 主观下线 –> master 客观下线 –> 投票选举 leader –> leader 执行故障转移

日志复制

  • raft 算法的数据复制是 强一致性,领导者接收客户端的请求,将日志复制到其他节点,并确保被复制节点上的数据日志顺序一致。
  • 当半数以上的其他节点成功接收日志,领导者才会确认该条日志提交成功,并修改其它节点上的日志状态为提交成功,通过这样的方式保证集群的数据一致性。
  • redis的数据复制是 最终一致,master 负责接收客户端的请求,将数据写入内存后,异步复制数据到 slave。
  • slave初始或断线重连master,发现数据不一致后,会根据 slave当前的数据偏移量或master节点 ID,向master实现增量同步或者全量同步。
  • 如果slave正常链接mastermaster数据发生变化会正常发送给对应slave,但不需要半数以上的slave节点确认接收才确认数据同步成功。
  • redis是高性能服务,它需要在保证性能的前提下进行数据复制,因此数据的 最终一致 < 强一致

安全性

  • raft算法的日志复制是强一致,安全性明显要比redis要好。

  • raft算法的领导选举,需要确保日志的term和日志的index最优的健康的节点当选领导者。

  • redis数据复制是最终一致,master设置数据积压缓冲区和数据偏移量,与slave的数据量进行对比,进行数据复制实现最终一致。

  • redis master故障下线后,redis哨兵重新选举,选出新的哨兵领导者。哨兵领导者在下线 master slave 节点中筛选出最优(网络链接正常,优先级低,数据偏移量最大)的slave将其晋升为master

redis的高可用性

redis用复制来解决可靠性,一份数据做多份冗余。但是,当master节点因为某种原因下线,还必须有一种机制能让slave节点自动地转化成master节点,对外提供写服务,保证系统的高可用性。redissentinel就是这样的一种机制。

Powered by Hexo & Theme Keep
Unique Visitor Page View