|
当分区情况恢复后,Mongo会尝试判断哪个节点拥有权威性,很显然,没有一个权威节点的存在,因为两个节点在分区时都接受了写操作。随后,MongoDB会尝试寻找拥有最高optime(每个节点的oplog的时间戳)的节点,然后它迫使旧的主节点(n1)回滚到最近的一次数据相同的时间点,随后重新应用在n3上发生的各种操作。
在回滚过程中,MongoDB会将冲突对象的当前状态的快照写入磁盘上的一个BSON文件中,某个操作者可以在稍后尝试重建文档的适合状态。
这个系统存在着多个问题。首先,在选择主节点的代码中有个缺陷:MongoDB可能会将分发集中某个并没有最高的optime的节点升级为主节点。其次,在回滚的代码中也有个缺陷。在我的测试中,回滚大约只有10%的次数是成功的。在大多数情况下,MongoDB会完全丢弃冲突数据。此外:在回滚过程中并非所有的对象类型都会被完整地记录下来:例如按照设计,超过上限的集合就会丢弃所有的冲突。第三,即使系统运行正常,回滚日志也不足以恢复线性一致性。由于回滚的版本与oplog并没有共享一个定义良好的因果次序,因此通常只有无次序的合并操作(例如CRDT)才能重建文档的正确状态。
线性一致性的缺失也同样发生在FSYNC_SAFE、JOURNAL_SAFE、甚至是REPLICAS_SAFE等级别中,虽然它们能够确保在请求成功之前已经有两个从节点确认了本次写操作。- 6000 total
- 5695 acknowledged
- 3768 survivors
- 1927 acknowledged writes lost! (╯°□°)╯︵ ┻━┻
- 712 717 722 727 732 737 ... 2794 2799 2804 2809 2814 2819
- 0.94916666 ack rate
- 0.338367 loss rate
- 0.0 unacknowledged but successful rate
复制代码 |
|