gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:37 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com