【问题标题】:How does Write Concern in MongoDB Work at Thread level?MongoDB 中的 Write Concern 如何在线程级别工作?
【发布时间】:2015-02-06 10:20:20
【问题描述】:

正如我所见,我们可以从应用程序中设置写入关注点,我想知道 MongoDB 将如何处理这样的场景:

假设我们有两个任务/进程(P1 和 P2)在同一个数据库上运行(数据库具有三个节点的副本集,1 个主节点和 2 个辅助节点)。 P1 在日志级别启用了写入关注。 P2 在副本级别启用了写入关注。(二级)。

现在如果 P1 和 P2 都写入数据库会发生什么?

P2会等待P1写入的数据复制到secondary,然后再将其数据写入secondary吗?

或者它是如何处理的?

【问题讨论】:

    标签: mongodb database-administration mongo-java replicaset


    【解决方案1】:

    写入关注点是每个操作,并确定 MongoDB 何时向客户端报告写入成功。它与几乎同时发生的其他操作无关。

    如果 P1 具有“在日志级别启用写关注”,我认为这是指日志写关注 { "j" : 1 },MongoDB 不会报告 P1 发送的操作成功,直到它们被提交到日志。 P2 写入的状态无关紧要。

    如果 P2 具有“在副本级别启用写入关注”,我认为这意味着多数写入关注 { "w" : "majority" },那么在复制到副本中的大多数节点之前,P2 所做的每个操作都不会被报告为成功放。 P1 写入的状态是什么无关紧要。

    P1 和 P2 操作不会等待对方的写关注点得到满足才继续进行,或者类似的操作。

    由于响应很长,已编辑响应以对答案进行评论:

    是的,第二次写入必须等待第一次写入释放数据库写入锁(如果第一次写入产生锁,则可能在多文档第一次写入的中间),但第二次写入不会'不必等待第一次写入完成其整个写入关注点。

    例如,考虑将A 写入{ "w" : "majority" } 以及将B 写入{ "w" : 1 }A 首先到达主节点并获取写锁。 B 第二个到达并等待写锁。 A 使用完写锁并释放它; B 拿到锁。 A 的写入需要复制到辅助节点以实现其写入问题 - 这与 B 持有写入锁同时发生。 B 完成,MongoDB 响应客户端写入成功。 A 完成复制到所需数量的副本集成员,MongoDB 响应写入成功。 AB 之前发送,并在B 之前写在主数据库上,在此期间它持有锁并阻塞B,但B 首先返回。支持B 的不是A 的写入问题,更简单的事实是MongoDB 不能同时对同一个数据库进行两次写入。

    【讨论】:

    • 据我所知,直到 mongoDB 2.6,每当对集合执行写操作时,数据库都会被锁定。那么这不会让第二个过程等待吗? (如果他们都写入同一个数据库)?同理,P1写入的数据同步不会延迟P2写入的数据吗?
    【解决方案2】:

    这个问题很老了,关于 Mongo 迁移到 WiredTiger (2015) 3.0 版的时间。 从那时起,引擎的并发性显着提高,对于大多数读/写操作,锁定级别是文档级别本身。

    见:https://docs.mongodb.com/manual/faq/concurrency/

    因此,多线程(相同进程或多进程)也可以提高最严格的写入问题的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      • 2018-04-11
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      相关资源
      最近更新 更多