18 May 2026
etcd raft学习
raft通过leader选举和日志复制来保证一致性。选举靠随机超时和多数投票,保证一任一个leader,日志复制要求过半节点确认才提交,保证数据不丢。
leader选举
必须有一个所有节点都承认的leader,节点有3种状态,leader、follower和candidate,leader定期给所有follower发送心跳。如果讴歌follower在一段时间内没有收到心跳,就回把自己变成candidate,宣布竞选leader,然后向所有节点请求投票,每个节点只能投一票,当candidate拿到超过半数的票,就成功当选新的leader,然后继续给所有节点发送心跳。
每个任期内,只会有一个leader被选择出来,因为每个节点只能投票一次,并且先到先得,遵循多数原则。不会出现2个节点都获得多数票情况,避免出现多个leader的现象。新leader一定会拥有之前所有leader的日志,因为在选举leader时,拥有旧日志的节点没有资格当选。
日志复制
所有的写操作都是由leader处理,然后再复制给其他节点。当有写操作时,leader将将这个操作写入自己的日志,但是该日志没有提交,然后leader给所有节点发送这个写操作的日志,当过半节点确认已经写入这个日志以后,leader就将这个日志提交,然后告诉所有节点,之前的写操作日志可以提交了。然后leader才确认本次写事件成功,并反馈客户端。整个过程和选举leader类似,确保多数节点已经接收到本次写操作,才算真正完成。日志是批量,并行的发送到其他节点,减少网络延迟,提高写入效率。
读操作
相比较写操作,读操作为了确保读到最新的数据,leader会先广播一次心跳,确认自己是leader,然后直接读取相应数据,无需将读操作写成日志,保证一致性并提升读取效率。
LEo
at 00:12