1

我们需要将一个特定的数据位写入 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)

我可以说它不会抛出任何错误,(我们可以读写,并且我们所有的测试都通过了),我不知道它是否在很大程度上验证了写入,而且我还没有对它进行性能分析。

4

2 回答 2

1

您是对的,与辅助节点相关的写入问题仅确保确认,而不是数据已写入磁盘。

我不熟悉 Java 驱动程序,但您应该能够分别设置 Journaling 和 WriteConcern。但请记住,即使 J=1 和 W=Majority 也有回滚的可能性,如这个 SO 问题中所述:回滚仍然发生在 J=1 和 W=Majority 的 MongoDB 副本集上吗?

J=1 会保证数据在主节点上是安全的,从节点也会以复制的形式给予一定的保护。

为了增加信心,可以考虑在主硬盘上使用 RAID 或类似的东西。

于 2014-03-20T17:27:37.510 回答
0

来自 WriteConcern 中的 javadoc:

/**
 * Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation.
 */
public final static WriteConcern REPLICA_ACKNOWLEDGED= new WriteConcern(2);

/**
 * Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation.
 * <p>
 * This field has been superseded by {@code WriteConcern.REPLICA_ACKNOWLEDGED}, and may be deprecated in a future release.
 * @see WriteConcern#REPLICA_ACKNOWLEDGED
 */
public final static WriteConcern REPLICAS_SAFE = new WriteConcern(2);

所以我认为 REPLICAS_SAFE 或 REPLICA_ACKNOWLEDGED 是你需要的。

于 2013-10-15T19:08:00.207 回答