Raft的名字并没有特殊的含义,其目的是将分布式一致协议(主流的Paxos)进行简化和工程化应用。Raft由于其简单和可靠,被越来越多的公司采用(PingCAP tidb, InfluxDB, CoreOS etcd,hasicorp consul等)。Raft通过三个主要模块:选主,日志复制和安全实现了一个完整的分布式系统。其可以用来实现分布式锁服务,分布式存储系统,高可靠元信息管理和解决系统单点问题。
在raft的选主中,将节点划分为3种角色:leader,follower和candicate(如下图所示)。 所有节点启动时都是Follower状态,内部有一个随机的timer(50-100ms),当timer触发时,发起投票,进行candidate状态。在candidate状态时,节点收集从其他节点返回的投票,当获取到多数(超过一半)即转换为leader。节点直接也定期发送心跳以获得集群整体状态。处于candidate状态的节点在得知非自己的主节点的信息时或者在一个新的周期(自己不是leader),即进入follower状态。
Raft的节点具有如下约束:
1. 只有Leader才能接受写和读请求(强一致性保证);
2. 只有candidate才能发起选举;
3. 成为Leader的节点必须包含最多的日志;
4. 每个节点的term的定时周期使用随机值;
5. Candidate节点收到超过一半以上的投票才能成为主节点;
6. 主节点同步日志到从节点;
7. 日志采用append模式;
8. 节点间的心跳时间不能小于选举超时时间;
9. 一个周期内最多只有一个leader;
通过以上的约束,Raft能够很好的解决分区一致性,避免双主的出现。日志同步能够保值节点间数据的一致性,日志同步的内容在后续的学习中进行分析。