Raft算法简介
Raft共识性算法是paxos算法的简化版,多用在分布式环境中,集群成员通过投票对某事项决议,多数票通过,则共识达成。集群leader的选举,如kafka分区leader partion的选举。Parxos本身也是通过投票,多数票通过,则共识达成。但是Raft比Paxos投票过程做了一定的简化,并考虑具体的业务场景本身特点,并利用业务场景特点,快速达成共识。
Raft算法涉及成员角色
- leader
集群的领导者,针对主从集群,通常承担集群的主的角色,负责用户的写请求,并把数据同步给集群的从角色。 - flower
集群的从角色,针对主从集群,负责用户的读请求,并从主同步数据,和主保持数据同步,并参入投票。针对主备集群,flower不处理用户的读请求。 - candidate
投票决议的发起者,当集群出现需要通过投票达成共识时,candidate发起投票决议,其他角色参入投票。
Raft算法投票过程
- 集群刚开始启动时,成员都是flower角色,等待leader角色和自己通信,
刚开始启动,由于都是flower角色,肯定会出现flower等待leader通信超时,
第一个等待超时的成为candidate,并投自己一票,投票消息内容:(term,value),term是任期,每次更换leader,term+1。同时向其他成员发起投票决议。 - 其他成员接收到投票决议后,看term和本地term大小做比较,若接收到的term大于自己的term,则同意发起者投票,否则丢弃。
- candidate收到投自己的票数过半,则此次决议共识达成,自己转换成leader角色,同时向其他成员传递自己当选leader信息,包括term,leaderId等信息。
- 其他角色接收到leader当选信息后,更新自己本地leader信息,集群达成一致状态,集群可以对外提供服务了。
- 若第三步candidate接收到其他flower的投票响应超时或者为过半,重新发起新一轮投票,转入第一步继续;
- 若集群运行过程中,有flower发现连接leader超时,则转入第一步。
- 有的集群考虑具体业务场景,比如集群启动时,不需要投票,集群中每个成员都配置有自己的id,那么id最小的直接成为leaer角色,然后同步leader当选角色信息给其他flower,转入第四步;
- 还有集群在leader宕机时,选择那个和leader保持数据同步最新的flower成为leader角色,转入第四步。