自己在团队里面负责的是基于 Consul 实现的 CM(Configuration Management)模块。以前一直对于 Consul 怎么实现一致性不是很了解。最近看了一下 Raft 协议,就写一写自己对于 Raft 的理解和一些笔记。
Raft 协议简述
Raft 协议是什么?
Raft 是一种为了管理复制日志的一致性算法。Raft (computer science)。
Raft 协议将分布式一致性问题分解为了3个小的问题:领导选举、日志复制和安全性。今天想记下来的就是领导选举。
Raft 基础术语
- leader, candidate, follower。服务器成员的3种状态:领导,候选人,跟随者。一个集群中只能同时存在一个领导。
- term,任期。每一个领导有唯一的一个任期号。任期号会在新的选举发起的时候由发起人增加。跟随者会在新的领导人选举成功后更新任期号。
- log index, 日志序号,每一段日志都有唯一的日志序号。
第一次选举
当集群中的服务器第一次启动时,默认是跟随者状态。对于跟随者来说,会设置一个随机时间的计时器并等待领导的心跳包。如果计时器超时还没有收到领导的心跳包,跟随者会认为领导已经宕机,随后发起新一轮的选举,状态转变为候选人。如果候选人获得了大多数服务器的选票,就转变为领导。
获得选票的条件
- 跟随者的任期小于候选人的任期时,才会投票给候选人。
- 选人的日志序号不小于跟随者时,跟随者才会投票给候选人。