Y.S*_*.S. 1 mongodb durability
我想了解 MongoDB 提供哪些保证(如果有的话),因为它与主数据库永久或暂时失败或在网络级别与副本集的其余部分分离时的数据持久性有关。
我了解 w:1 写入关注会发生什么。我了解日记的作用。
我不明白当选择新的主数据库时,MongoDB 如何决定保留哪些写入以及丢弃哪些写入。在 4 节点(+仲裁器)集群中,N1 为主节点,N2、N3、N4 为辅助节点,在这种情况下:
问题:
首先是一些背景:
mongodb 副本集使用操作日志进行复制。主节点上的每次写入都会附加到 oplog 中。
每个辅助节点查询其同步源中的 oplog 条目,批量检索并应用它们。
Oplog 条目是幂等的,并且必须按顺序应用。
在将条目写入 oplog 本身之前,它们首先被写入日志。
如果节点在应用批次时崩溃,则可以安全地从日志中重播整个批次,因为每个条目都是幂等的。
成员相互报告他们最近应用的 oplog 事件的标识符。
由于 oplog 事件必须按顺序应用,这意味着每个节点都已应用报告条目之前的所有条目,此后不再应用。
在 5 节点副本集中,大多数是 3 个节点。主节点不会向客户端/应用程序确认写入w:majority已完成,直到大多数节点报告其 oplog 已达到或超过添加写入的点。
副本集中的每个节点都会监视其他每个成员。
如果主节点意识到它无法与大多数投票节点通信,它将降级为辅助节点。
如果辅助节点在几秒钟(默认情况下为 10 秒)内没有与主节点进行任何通信,它将要求进行选举。
发起选举的节点将向每个副本集成员征求投票。
每个成员通常都会投“是”票,他们可能投“否”票的几个原因是:
如果候选节点收到足够的“是”票以构成副本集中的大多数投票节点,则它会转换为主要节点并接受写入。
每次选举都会增加term副本集的值。如果主节点从其他节点之一接收到包含比当选时更高的任期的心跳或其他消息,则它会立即降级为辅助节点。
{w:majority, j:true} 写入命中主节点。
主要将:
假设主节点的 oplog 现在包含:
| 时间 | 手术 |
|---|---|
| T1 | 创建集合 |
| T2 | 创建索引 |
| T3 | 插入文档1 |
| T4 | 插入文档2 |
| T5 | 更新文档1 |
| T6 | 插入文档3 |
我将使用 T5 的更新作为写入w:majority。
次要节点轮询更改,主要节点等待多数人确认。
N1 是主要的,N5 是仲裁者。在 T5 写入之前,其余节点显示以下最近应用的 oplog 事件:
N2:T4
N3:T4
N4:T2
N2 确认更改。
最近应用的 oplog 事件现在是:
N2:T5
N3:T4
N4:T3
N3 已收到更改并正在应用它。
这意味着 N3 不会向任何其他节点报告新的上次应用的 oplog 时间,并且主节点仍然不会向提交写入的应用程序进程确认成功或失败。
主要下降
在主要失败之前的那一刻,每个成员的最后应用的优化时间是:
N1: T6
N2: T5
N3: T4
N4: T3
N5: 不适用
N3 无法向主节点确认它已应用更改。
根据情况合理。
选举是被迫的。
在适当的超时后,一个或多个辅助节点将要求进行选举。
我们假设 N3 实际上完成了 T5 的操作。
如果N4恰好是第一个超时的,它会召集选举,并要求所有成员投票支持。投票结果如下:
N4:是(总是为自己投票)
N5:否 - 我可以看到一个节点的 oplog 事件比你有的
N3:否 - 我有一个比你更新的 oplog 事件
N2:否 - 同上
此时N2或N3将成为下一个参选者,得票情况如下:
候选人 N3:是 - 自己
N5:是 - 你有最近的事件
N4:是 - 你比我
更新 N2:是 - 你至少和我一样更新
这次选举成功,节点转变为主节点。
如果 N3 应用了来自 T5 的事件,则无论是否将其报告给主节点,都会发生此事件序列。由于所有节点都会监视所有其他节点,因此 N3 会将其报告给 N2、N4 和 N5。
请注意,如果 #4 没有发生,N3 仍将处于 T4,并且不会被选举,因为 N2 有更新的事件。
在任何一种情况下,参与选举的任何次要应用的最新事件都将被保留。
当 N1 恢复并尝试重新加入副本集时,新主节点上的 oplog 很可能已移至 T6 之外。由于当前主节点不知道 T6 时的写入情况,并且前一个主节点无法成为辅助节点,除非它可以重放当前主节点的 oplog 条目,因此节点会比较其 oplog 历史记录,直到找到公共点。
在这种情况下,这将是 T5。
然后,前一个主数据库会回滚 T6 操作所做的更改,并将回滚的数据写入本地磁盘文件,以便稍后在必要时恢复。然后,它从新的主节点请求 T5 之后出现的 oplog 条目,并开始作为辅助节点进行复制。
在这种情况下,唯一丢失的写入是由主节点处理但未复制到任何其他节点的写入。
如果主节点已确认写入,并且 N2 复制了写入已被多数人确认的事实,结果是否会有所不同?如果 N2 和 N3 都复制了写入被多数人确认的事实,结果会不同吗?
这个事实实际上不需要复制。每个节点都在监视其他节点,因此每个辅助节点都会清楚地知道哪些 oplog 条目已被大多数副本集看到,而无需告知。
唯一的区别是,如果 N3 也向主数据库报告它已复制该操作,则主数据库可以向应用程序报告多数写入已成功。
如果:
在这种情况下,N1 会意识到它无法联系大多数副本集,因此会下台。
如果 N1 或 N2 试图呼吁选举,他们将无法获得所需的 3 票
由于落后于N3,N4仍不会当选
当 N3 要求选举时,N4 和 N5 都会投“是”票,因此 N3 将成为初选。
这意味着当网络分区修复时,N1 和 N2 都会发现它们有当前主节点不知道的写入操作。
在这种情况下,T5 和 T6 写入都会回滚。
| 归档时间: |
|
| 查看次数: |
1781 次 |
| 最近记录: |