在分布式系统中,多个服务器要保持consensus,这是不容易实现的,因为个别服务器的故障是随时可能出现的,所以在出现故障时我们需要有一种方案来保证分布式系统在多种情况下都能保持consensus
因为多个服务器的情况是复杂的,所以不可能让所有服务器达成一致,所以超过一半的服务器达到一致就可以了
Raft算法中有三种角色:
1.Follower:主服务器的追随者
2.Leader:主服务器,负责领导它及他的Follower
3.Candicate:可以被选为Leader的服务器
Raft算法的过程:
1.所有的节点初始都是Follower状态,所有的服务器都可以变成Candicate,当一个服务器成为Candicate后,它会向其它的Leader的Follower发出要求成为Leader的请求
2.被请求的Follower会回复当前Candicate YES (若在被请求过程中,某个服务器宕机,这个服务器就不会收到请求,这时这个宕机服务器会变成自己的Leader)
3.当候选人变成Leader之后,他就可以领导他的所有Follow的行为
4.如果Leader发生宕机,那么他的某个Follower一段时间后会变成Candicate,向其他Follow发出请求(即重复执行1.步骤)
注意,每个节点都有一个竞选超时时间(随机),如果超过这个时间这个节点没有领导,那么这个节点自动转换为Candicate状态,这时所有收到请求的节点都会返回YES,当这个节点收到大多数返回YES时(不包括自己),这个节点成为Leader,并重置它的Follower的竞选超时时间
注意,节点竞选时可能会有多个节点不分胜负,这时应该重新生成竞选超时时间
注意,如果集群被分裂,有Leader的一部分继续运行;没Leader的部分一段时间后会进行竞选,然后按照有Leader运行,当故障修复后少数服从多数
客户端请求会首先到达Leader,Leader会记下Log,然后发送给Follower,当大多数Follower返回确认后,Leader返回给客户端成功,并且向所有Follower也发出一个确认,Follower收到后,根据Log进行Commit