分区下的 Raft 复制
Raft replication under partition
- 7 个成员集群,其中一个是领导者。
- Leader 尝试复制日志(一些写入)
- 发生网络分区。分别是3人和4人。
- 领导者最终进入少数派
- Leader 只达到 2 个 follower → 复制失败
在这种情况下会发生什么?
据我了解:2 个追随者已应用 "bad" 写入,当网络分区修复时,他们将用多数领导历史覆盖该写入。但这违反了线性化。
您混淆了复制和承诺。仅仅复制一个条目到这个集群的少数并不会破坏线性化。重要的是何时考虑 提交 更改。由于分区少数端的领导者无法将更改复制到集群的大多数,因此它永远不会提交更改,也永远不会向客户端确认更改已被持久化。此外,未提交的更改永远不会应用于任何节点上的状态机。因此,在修复分区时覆盖未提交的更改不会破坏任何保证。
只有当领导者增加 commitIndex
并在仅复制到少数集群后确认写入时,保证才会被打破。
- 7 个成员集群,其中一个是领导者。
- Leader 尝试复制日志(一些写入)
- 发生网络分区。分别是3人和4人。
- 领导者最终进入少数派
- Leader 只达到 2 个 follower → 复制失败
在这种情况下会发生什么?
据我了解:2 个追随者已应用 "bad" 写入,当网络分区修复时,他们将用多数领导历史覆盖该写入。但这违反了线性化。
您混淆了复制和承诺。仅仅复制一个条目到这个集群的少数并不会破坏线性化。重要的是何时考虑 提交 更改。由于分区少数端的领导者无法将更改复制到集群的大多数,因此它永远不会提交更改,也永远不会向客户端确认更改已被持久化。此外,未提交的更改永远不会应用于任何节点上的状态机。因此,在修复分区时覆盖未提交的更改不会破坏任何保证。
只有当领导者增加 commitIndex
并在仅复制到少数集群后确认写入时,保证才会被打破。