【问题标题】:MongoDB write concern for strong consistentMongoDB 写关注强一致性
【发布时间】:2020-11-22 15:08:07
【问题描述】:

我有 Java 进程来更新 MongoDB 3.6.0。我有 1 - 主要,2 个副本。流量是

  1. 更新具有特定“_id”的文档中的一些数据

  2. 从副本读取

有时,read 会获取文档的旧版本。我们决定使用 WriteConcern 来解决这个问题 -

WriteConcern(WriteConcern.W3.withWTimeout(100, TimeUnit.MILLISECONDS).withJournal(false));

随着 WriteConcern 的引入,会有一些延迟,为了避免过多的延迟,我跳过了更新日志日志

上面的配置能用吗?

【问题讨论】:

    标签: mongodb mongodb-java


    【解决方案1】:

    这是编写过程的高级视图:

    1. 数据写入快照,
    2. 从快照到日志 ~0.1s
    3. 从快照到磁盘 1s

    如果您设置 writeConcern = 3,并且一台服务器出现故障,则用户将永远不会收到确认。

    此外,禁用日记功能不会加快复制速度。我建议使用 writeConcern 多数,并保留日志。但是,如果您更喜欢禁用日记功能,那么唯一的问题就是 3 中的 1 之间写入的数据。

    【讨论】:

    • 谢谢!!我对此并不陌生,但我认为 Journalling 默认情况下处于启用状态,并且对于其中一项更新操作,我们配置了此 WriteConcern 并跳过写入 Journal。由于我们需要此操作的强一致性,因此我们使用了此配置。如果服务器出现故障,那么它将是一个问题,否则它将起作用。请纠正我的理解
    • 如果您使用 writeConcern=3 并且服务器出现故障,您将永远不会得到确认,因为您只有 2 个服务器启动。如果没有服务器出现故障,你很好,但我不会对此进行中继。 是的,默认情况下会启用日志,并且在写入问题占多数或更大的系统中,日志并不是非常重要,只要整个服务器堆栈不会崩溃@sam
    • 谢谢。如果 1 台服务器出现故障,我将不会收到确认并发生超时错误。两台服务器将有更新的数据,不会有回滚。最终,当第三台服务器启动时,数据不会在该节点中复制。
    • @sam 如果解决方案有帮助,请点赞和/或接受。这就是论坛的运作方式。
    猜你喜欢
    • 2015-06-04
    • 2017-04-08
    • 2018-06-25
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多