raft
etcd和consoul的核心算法
Raft是一种实现分布式共识的协议。
Raft提供了一种在计算系统集群中分布状态机的通用方法,确保集群中的每个节点都统一 一系列相同的状态转换 他有许多开源参考实现,具有GO,C++,Java和Scala中的完整规范实现 一个raft集群包含若干个服务器节点,通常是5个,这允许整个系统容忍2个节点的失效,每个节点处于以下三种状态之一 follower(跟随者): 所有节点都已follower的状态开始。如果没收到leader消息则会变成candidate状态 candidate(候选人):会向其他节点拉选票,如果得到大部分的票则成为leader,这个过程就叫做leader选举 leader(领导者): 所有对系统的修改都会先经过leader
Raft一致性算法
Raft通过选出一个leader来简化日志副本的管理,例如,日志项只允许从leader滚向follower 基于leader的方法,Raft算法可以分解成三个子问题 1、leader election(领导选举):原来的leader挂掉后,必须选出一个新的leader 2、Log replication(日志复制): leader 从客户端接收日志,并复制到整个集群中 3、Safety(安全性): 如果有人以的server将日志项放回到状态机了,那么其他的server只会回放相同的日志项
动画: http://thesecretlivesofdata.com/raft
1、简单版的领导者选举和日支复制的过程 2、详细版的领导者选举和日志复制的过程 3、如果遇到网络分区(脑裂),raft算法是如何恢复网络一致的
Leader election(领导选举)
1、raft使用一种心跳机制来触发领导人选举 2、当服务器程序启动时,节点都是follower身份 3、如果一个跟随者在一段时间里没有接收到任何消息,也就是选举超时,然后他就会认为系统中没有可用的领导者,然后开始选举 以选出新的领导者 4、要开始一次选举过程,follower会给当前当前term +1,并将其转换成candidate (选举状态),然后它会并行的向集群中的其他服务器节点发送请求投票的RPCs来给自己投票 5、候选人的状态维持知道发生以下一个条件发生的时候