在分布式存储系统中,通常通过维护多个副本来提高系统的可用性,那么多个节点之间必须要面对数据一致性的问题。Raft 的目的就是通过复制的方式,使所有节点达成一致,但是这么多节点,以哪个节点的数据为准呢?所以必须选出一个Leader。
大体上有两个步骤:领导选举,数据复制。
Raft 是一个共识算法(consensus algorithm)。比如比特币之类的加密货币,就需要共识算法。Spring Cloud 的注册中心解决方案Consul 也用到了Raft 协议。
Raft 的核心思想:先到先得,少数服从多数。
Raft 算法演示:
http://thesecretlivesofdata.com/raft/
总结:
Sentinle 的Raft 算法和Raft 论文略有不同。
1、master 客观下线触发选举,而不是过了election timeout 时间开始选举。
2、Leader 并不会把自己成为Leader 的消息发给其他Sentinel。其他Sentinel 等待Leader 从slave 选出master 后,检测到新的master 正常工作后,就会去掉客观下线的标识,从而不需要进入故障转移流程。