java - 如何在 Java 中设置 WriteConcern 以非常安全地写入 MongoDB 副本集

标签 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。
  • 显然,对于这些 super 安全的写入,性能会受到影响,我们对此感到满意(或更准确地说,我们的负载足够低,这是一个过早的优化)。
  • 如果我们无法写入数据库,我们可以重试,但如果失败,我们最好*中止用户的旅程,而不是在不写入数据库的情况下继续,:(就像我说的,这是法律要求。

* 对于更好的给定定义!

<小时/>

编辑:到目前为止我们已经尝试过......

我们尝试过使用:

new WriteConcern.Majority(0, true, false)

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

最佳答案

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

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

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

要增加额外的信心,请考虑在主硬盘上使用 RAID 或类似技术。

关于java - 如何在 Java 中设置 WriteConcern 以非常安全地写入 MongoDB 副本集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19385256/

相关文章:

java - 父 pom 中的 maven-compiler-plugin

javascript - 如何在嵌套子文档mongodb中查找带有数组的字段?

algorithm - 是否有强一致的组成员协议(protocol)?

java - 生成介于 0 和某个值之间的随机整数,其中一半在集合 (0,5] 中,另一半在 (5,x]

java - HttpClient JSONData POST 请求以及 PHP 服务器的响应

java - 如何使用 Maven 自动化多个构建?

MongoDB $lookup 和 $map 对象数组

php - 在使用 PHP/Phalcon/MongoDB 插入新文档期间引用现有的 ObjectId

sql - id 列或聚集主键/数据库一致性

amazon-dynamodb - dynamodb 更新表达式是否强一致?