我们需要将一个特定的数据位写入 mongo 副本集,并确保它是安全的(这是法律要求)。是否有一个标准的 WriteConcern 封装了大多数节点上的磁盘写入?像 MAJORITY_FSYNCED 这样的东西。
我想出的最好的是以下 - 这是有效的吗?
WriteConcern replicaSetFsyscToMajority = new WriteConcern.Majority(0, true, false);
查看 Java 驱动程序的 WriteConcern 类中的预定义级别,据我所知,现有的级别似乎都不是我所追求的:
FSYNCED 表示仅对主磁盘上的磁盘进行安全写入。(因此主节点上的崩溃可能会导致写入丢失)
REPLICAS_SAFE 似乎表示写入已被至少 2 个副本确认,并写入内存,不一定写入磁盘(因此整个 mongo 副本集的断电可能会丢失写入)。MAJORITY 类似 - 但与 ((n/2) + 1) 个副本类似。
补充说明/评论
- 我们在 Java 7 上使用 Java 驱动程序 2.11.2。
- 显然,对于这些超级安全的写入,性能会受到影响,我们对此感到满意(或者更准确地说,我们的负载足够低以至于它是过早的优化)。
- 如果我们无法写入数据库,我们可以重试,但如果失败,我们最好中止用户的旅程,而不是继续不写入数据库,:( 就像我说的,这是法律要求。
* 对于给定的更好的定义!
编辑:到目前为止我们已经尝试过......
我们尝试过使用:
new WriteConcern.Majority(0, true, false)
我可以说它不会抛出任何错误,(我们可以读写,并且我们所有的测试都通过了),我不知道它是否在很大程度上验证了写入,而且我还没有对它进行性能分析。