当使用write-concern进行插入时,MongoDb会锁定辅助读取操作:多数?

时间:2014-02-14 11:19:58

标签: mongodb concurrency replication replicaset

MongoDb的当前配置是:

  • 一个主要( A ),两个辅助( B C ),一个副本集的所有部分
  • 对主要文件的插入是通过写入关注来完成的:多数
  • 从副本集中读取时,读取首选项设置为“最近”

方案

  • 触发插入,这意味着只有在传播到大多数副本集成员后才会成功
  • 在写操作返回(reference
  • 之前,应用程序无法从主数据库读取
  • 由于写入关注点设置为“多数”,因此写入操作仅在传播到至少一个辅助( B )实例后返回,在我们的情况下,设置为3个成员< / LI>
  • 这意味着辅助( B )也被锁定以供阅读,因为它正在复制(根据this

问题是,因为应用程序设置为从最近的实例读取,并且假设最近的实例是另一个实例( C ),如果在写入操作时发出读取请求在其他2个实例上仍在进行中,是否允许或阻止读取。如果允许,我该如何预防?

2 个答案:

答案 0 :(得分:0)

  

如果在其他2个实例上写操作仍在进行时读取请求通过,则允许或阻止读取

嗯,你有点想出来了。如果它位于最近的组

,您可以从'C'读取(陈旧数据)
  

我该如何预防?

读取首选项可以通过驱动程序,数据库级别,集合级别或操作级别全局应用(对于写入问题,可以或多或少地应用读取首选项)。如果对于该特定操作,您不能忍受过时数据,则可以在发出插入后将该特定查询的读取首选项覆盖到primary(请注意,在该方案中,可以使用写入设置插入操作关注{w:1}

答案 1 :(得分:0)

写关注并不是真的那样。 B和C都将处理写操作,并在执行时执行相同的数据库级写锁定,无论是否发送任何写入问题的getLastError。当锁定在C上时,C上的读取将被阻止。

写问题实际上只是针对客户端,它使客户端等待,直到满足条件(在您的情况下,大多数副本已应用写入)。它不会改变辅助节点优先复制的方式。