如何设置WriteConcern以便在Java中对MongoDB副本集进行非常安全的写入

时间:2013-10-15 15:33:01

标签: java mongodb consistency

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

我可以说它不会抛出任何错误,(我们可以读写,并且我们所有的测试都通过了),我不知道它是否在很大程度上验证了写入,而且我没有表现描述它。

2 个答案:

答案 0 :(得分:1)

你是对的,与次要有关的写入问题只能确认,而不是数据已写入磁盘。

我不熟悉Java驱动程序,但您应该能够单独设置Journaling和WriteConcern。但请记住,即使J = 1且W =多数,也有可能回滚,如本SO问题所述:Can rollback still occur on a MongoDB replica set with J=1 and W=Majority?

J = 1将确保数据在主节点上是安全的,辅助节点也将以复制的形式提供一些保护。

为了增加额外的信心,请考虑在主硬盘上使用RAID或类似功能。

答案 1 :(得分: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。