本笔记是对 Redis Cluster Spec – Failure Detection 的归纳总结
状态转换图
- 每个 Node 在本地维护了一张其他 Node 的状态表,并根据 Failure Detection 算法更新这张表里的 Node 的状态
- 每个 Node 可以自行把其他 Node 的状态设置为 GOOD(这个状态在文档和源码中均不存在,等价于不是 PFAIL 也不是 FAIL)、PFAIL。
- 如果要把其他 Node 的状态设置为 FAIL 则需要大多数 Master Node 同意才行,一旦设置成功要将这个消息传播给所有其他能连接的 Node,其他 Node 收到这个信息后也要更新本地 Node 状态表,将 Failed Node 的状态更新为 FAIL。
下面是状态转换图,例举的是 Node A 观察 Node B 的例子:
少数派和多数派
多数派:拥有多数 Master 的一方,可含有 Slave。
少数派:拥有少数 Master 的一方,可含有 Slave。
少数派视角
少数派只会看到大多数 Master 处于 PFAIL/FAIL 状态,0- 所有 Slave 处于 PFAIL/FAIL 状态。
多数派视角
多数派只会看到少数 Master 处于 PFAIL/FAIL 状态,0- 所有 Slave 处于 PFAIL/FAIL 状态。
不会存在以下情况:多数派看到大多数 Master 处于 FAIL 状态,因为大多数 Master 处于 FAIL 就意味着活着的 Master 们变成了少数派,这就矛盾了。
一些自问自答
Q:为何少数派能够看到 Master 处于 FAIL 状态?不是说要大多数 Master 同意才能变成 FAIL 状态吗?
A:考虑这个情况,在 Partition 发生的前一秒某些 Master 被决定为 FAIL,随即 Partition 发生,那么在少数派眼里这些 Master 依然是处于 FAIL 状态的。
Q:这里的每个 Node 是 Slave 还是 Master 呢?
A:随便,只要是 Node 就行。
Q:既然每个 Master 独占的负责 Slots,那么少数派继续工作为啥不可以,反正各自管各自的。
A:因为在多数派方,这个 Master 有可能会被 Slave 顶替,如果允许少数派继续工作,那么就会形成两个 Master,造成 split brain
Q:少数派节点是如何知道自己应该停止工作的?
A:它发现大多数 Master 变成了 PFAIL / FAIL 状态时,就知道自己不能工作了,Redis 源码里是这么写的。
Q:多数派节点时如何知道自己应该停止工作的?
A:如果这个 Cluster 要求所有 Slots 被覆盖,那么当有一个 Master 处于 FAIL 状态时,便停止工作,见源码。如果不要求,则继续工作,只不过部分 Slots 的操作会报错。