核心解决问题
选择Leader接管写入 分布式异构网络中共同确定一个值 不存在拜占庭将军问题
基本原理
Leader选择
Node 通过投票的方式,多数服从少数
Case
Single Node System
客户端写入值,Node接受并更新
Multiple Node
Node必然在三个状态之一
- Follower state
- Candidate state
- Leader state
所有的节点开始于Follower state , Listen Leader 节点的响应。 规定时间未得到响应,成为 candidate 状态,并且发送votes(投票给自己) request 给其他的node
其他节点进行投票。如果大多数投票给该candidate ,则该candidate 成为Leader.
投票细节
- Node检查在当前的term内没有投票,则投票给当前的candidate
- Node reset lection term
这个过程是Leader 选举。 所有的写请求被Leader接管。
如何写(Log Replication)
- Leader 接受到 set 5 的请求
- Leader 写入本地日志(Uncommited)
- Leader 广播到其他节点
- 大多数节点都写入成功
- Leader节点commit
- Leader节点通知其他节点commit
re-election
Leader挂了 投票可以选出Leader
多节点同时选举Leader. 通过 election timeout 机制可以保证选择出Leader
网络分区问题
当网络分区的时候,
Leader 在多节点区
不需要重新选择,因为在少节点区,无法获得多数投票。无法产生新的Leader
Leader 在少节点区
被分割的多节点区间,重新选举Leader,term增加. 当Client 的写请求到达该 Leader的时候,因为无法收到多数的commit,则导致该写无法被commit
当分区恢复的时候
当Leader 在少数节点区,系统现在有两个Leader,但是因为 少数Leader区的terms较小。无法被系统认可,因此会回滚它们未被提交的日志。 然后同步新Leader的log
关键术语
lection term
当follower 转换成candidate 的时候,开始一个新的lection term
Timeout
- election timeout : follower 在等待该时间后未得到Leader的响应,则变化未candidate. 随机时间 150ms and 300ms
- heartbeat timeout Leader和follower 节点的心跳检测
思考
分布式系统中达成共识需要选择一个值。引入选举随机时间的目的是为了解决活锁问题。可以尽快选择出一个Leader。 terms的引入可以保证多个Leader存在的时候,选择正确的Leader. 投票机制是保证共识的机制,每个节点都有投票权。所有的节点平等。