raft学习笔记(一)

记录学习过程中的一些笔记。后面看raft的论文,有些内容是有不同的,比如成员关系变更。这些后面再更新。

节点有三种状态:leader,follower,candidate。初始状态follower
leader只有一个,要获得大多数节点的投票才能成为leader。一次投票选举leader的过程称为term。每发起新一轮选举,term加一。leader节点通过心跳(append entries协议)与从节点保持通信。

1. leader选举

有两个timeout控制选举。Election timeout在150ms到300ms随机。
节点与leader在election timeout时间内都没有联系上,打算把自己选为leader。状态由follower改为candidate。candidate节点开始新一轮term(将term加1),并给自己投一票,然后发送Request Vote消息给其他节点,如果收到消息的节点在这一轮(term)还没有投过票,则它投票给candidate并重置election timeout。若获得大多数投票,则将状态改为leader。新的leader开始发Append Entries消息给从节点,发送间隔由heartbeat timeout指定。从节点回复Append Entries消息。

Split vote
如果不够大多数,则发起新一轮选举。如果收到term更大的消息,则意味着有其他leader选举出来了,改状态为follower。

2. 日志复制

leader通过append entries协议将操作同步给从节点,得到大多数节点的回复后,才进行commit。然后才回复client.
系统所有的操作都要经过leader,每次更改被作为一个条目加到节点的日志(each change is added as an entry in the node’s log)。该条目当前是未提交的(uncommitted),还不会更新节点的值。要提交,leader首先要复制日志到从节点,等到大部分节点将条目写入日志,leader提交条目,节点值被更新。然后leader通知从节点,条目已被提交。从节点提交条目,更新节点值。系统达到一致。
client将请求发给leader,leader追加日志,并在下次心跳将change发给从节点(Append Entries消息)。从节点回ack后leader就回复client(此时尚commit)。

日志匹配特性:
如果不同日志中的条目拥有相同的索引和任期号,那么他们存储了相同的命令
如果不同日志中的条目拥有相同的索引和任期号,那么他们之前的所有日志条目也都相同

3. 安全

选举限制:raft使用投票的方式来组织candidate赢得选举出发它包含了所有已经提交的日志条目
提交之前任期内的日志条目:只有leader当前任期内的日志条目才通过计算副本数目的方式来提交;一旦当前任期内的某个日志条目已这种方式提交,基于日志匹配特性,之前的所有日志条目也会被间接提交

4. 网络分区

假设分了两个区,一个含大多数节点。两个区的leader都会收到请求,含大多数节点的分区,日志会被commit,另一个则不会(因为得不到大多数节点的ack)。网络恢复后,小的区看到更大的election term,节点step down,回滚所有未提交的日志,同步新leader的日志。
小的区没办法选出新的leader,有leader的话,一定是旧的leader,term更小。当然可能没leader,这种情况就更简单了。

5. 集群成员变更

联合一致算法:
日志条目被复制给新旧配置中的所有机器
新旧配置中的服务器都可以成为leader
达成一致(选举和提交)需要分别在两种配置上获得过半支持

6. 日志压缩

快照技术,每个服务器独立的创建快照,复制状态机将状态写入快照,还包含一些元数据,如last included index,last included term

7. 客户端交互

如何找到leader
如何支持线性化语义:
客户端对于每一条指令都赋予一个唯一的序列号。然后,状态机跟踪每个客户端已经处理的最新的序列号以及相关联的回复。如果接收到一条指令,该指令的序列号已经被执行过了,就立即返回结果,而不重新执行该请求

你可能感兴趣的:(raft学习笔记(一))