在Mongo上写出多数和二次阅读偏好

时间:2016-08-04 06:25:17

标签: mongodb

我们说我有一个Primary (A)&两个secondary (B, C)。如果我正在使用write majority进行写作。有人可以解释一下我的疑问: -

  1. 让我们说使用majority完成了写入并更新了数据 A& B并且写入尚未传播到C。这时如果一个 使用secondarysecondary preferred读取相同的数据 查询是从具有最新数据的B提供的 mongo无法保证这一点,并且读取可能会返回过时的数据 C
  2. 让我们说再次使用多数写作,让我们说 写入已在A上完成,然后写入其中一个正在进行中 中学B。如果此时读取,则读取将被阻止 或者它将提供来自C的陈旧数据?
  3. 我们说我已经取出了辅助C,同样的情况也在 我们在上述案例中提到的进展。请读一下 在B或读取完成后,将阻止辅助B 不会被阻止,并且B会提供过时的数据?
  4. 环境

    • Mongo Version - 3.0.9
    • 存储引擎 - MMAPv1

1 个答案:

答案 0 :(得分:1)

Mongodb复制过程与次要异步。如果将读取的关注点设置为“多数”,则可以读取陈旧数据。基本上,这意味着您已将读取首选项设置为最终一致性。

如果读取问题设置为" local",您将从主要数据中获取最新数据。

请注意readConcern等级"多数"只能在WiredTiger存储引擎中使用。 WiredTiger存储引擎仅附加存储引擎,不会使用就地更新。没有锁并提供文档级并发。

  

阅读关注="多数"

     

查询返回实例的最新数据副本,确认为   写在副本集中的大多数成员。

     

要使用"多数"的阅读关注级别,您必须使用WiredTiger   存储引擎并启动mongod实例   --enableMajorityReadConcern命令行选项(如果使用配置,则为replication.enableMajorityReadConcern设置)   文件)。

问题1: Mongo不保证将从写入数据的辅助服务器提供读取服务吗?

答案1: MongoDB并不能保证这一点。次要的选择取决于以下内容: -

当您选择非主要读取首选项时,驱动程序将根据各种因素确定要定位的成员。请参阅此链接。 Read preference mechanics member selection

问题2:即使对同一数据进行了写操作,也绝不会阻止读取?

回答2:不会阻止阅读。但是,您可能会阅读一些陈旧的数据。

  

读取可能会错过在课程期间更新的匹配文档   读操作。

Concurrency locking what isolation guarantees does MongoDB provide