核心解决问题
选择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. 投票机制是保证共识的机制,每个节点都有投票权。所有的节点平等。