“多数”和“可线性化”之间的区别

时间:2017-03-05 23:28:37

标签: mongodb

阅读文档几次,但仍无法理解“多数”和“线性化”read concerns行为的差异:

  

"majority"
  该查询返回实例的最新数据,确认已写入副本集中的大多数成员。

     

"linearizable"
  该查询返回的数据反映了所有成功写入的写入关注度为“多数”且在读取操作开始之前已确认。

文档还提到了一个选项“writeConcernMajorityJournalDefault”,它说该选项设置为false,即使使用“linearizable”,数据也可以回滚。

有人可以解释一下,这两个问题如何起作用以及这个选项如何影响它们?

2 个答案:

答案 0 :(得分:11)

"的线性化" MongoDb 3.4中引入了阅读关注,以解决" 多数"阅读关注。

让我们尝试用" 多数"来理解问题。阅读关注以了解" 可线性化"给我们带来了。

假设我们有3个节点的复制,看起来像这样:

3 node replica set

其中, A 是主要的, B 是中学, C 是次要的

让我们还有两个用户 Alice Bob ,它们将对以下文档执行某些操作,该文档位于&#34; 用户< / EM> &#34;集合。

{
 "_id": 100234,
 "name": "Katelyn"
}

在时刻T0:

发生以下情况,

  1. Alice连接到 A (主要)并发出以下命令。
  2.   

    db.users.find({&#34; _id&#34;:100234}); - &GT;阅读关注&#39;多数&#39;

    输出:

      

    {&#34; _id&#34; :100234,&#34; name&#34; :&#34; Katelyn&#34; }

    1. B C 意识到 A 已停止响应并启动选举程序。(可能是由于网络分区 EM>)。
    2. 在时刻T1:

      发生以下情况,

      1. 由于选举过程, B代表新的主要
      2. 然而,直到没有传达 A A 本身意识到它需要将自己降级为辅助,它继续作为主要用户(这通常用于虽然很短的时间。)

        enter image description here

        在时刻T2:

        1. Bob与 B (新主要)连接并发出以下命令。
        2.   

          db.users.update({&#34; _id&#34;:100234},{$ set:{name:&#34; Sansa&#34;}}); - &GT;同   写关注&#39;多数&#39;。

          1. Bob承认写作。
          2. 在T3时刻:

            1. Alice连接到 A (旧的主要)并发出以下命令。
            2.   

              db.users.find({&#34; _id&#34;:100234}); - &GT;阅读关注&#39;多数&#39;

              输出:

                

              {&#34; _id&#34; :100234,&#34; name&#34; :&#34; Katelyn&#34; }

              即使在发出多数读取问题之后,Alice也会收到过时的数据,即Alice写的内容对Alice不可见。 因此,&#34; 线性化&#34;在这种情况下得到补偿。

                

              可线性化的定义:   写作应该是即时的。不精确,一旦写了   完成后,所有后来读取(其中“稍后”由挂钟定义   应该返回该写入的值或者a的值   后来写。一旦读取返回特定值,所有稍后读取   应该返回该值或稍后写入的值。

              因此,解决方案就是&#34; 可线性化&#34;阅读关注。有了这个属性,mongod会检查它的主要属性,并且可以看到大多数节点 在发出读取操作的结果之前。 然而,使用这种读取关注度超过&#34;多数&#34;有一个性能成本的阴影,因此这不是'#34;多数&#34;的替代品。阅读关注。

              关于 writeConcernMajorityJournalDefault 属性,它只是一个副本集配置选项。它接受布尔值

              True 表示MongoDB在大多数投票成员写入磁盘日志后确认写操作。

              False 表示在大多数投票成员将操作应用于内存后,MongoDB会确认写入操作。

              上述属性仅适用于写作关注&#34;多数&#34;使用并且未指定日记标记。

答案 1 :(得分:2)

据我所知,节点中的“读取关注点” DockingManager立即返回,其中包含该节点中写入的最新数据的读取查询。另一方面,读关注点majority将等到同时执行的写入操作完成后再传播到大多数副本集成员,然后返回结果。

他们两者都保证大多数副本集成员已经确认读取的数据,即读取的文档是持久的,并且保证不会回滚。

由于“读取关注点” linearizable等待并发执行的写操作完成,因此它的性能明显慢于“读取关注点linearizable”。

类似地,由于读关注点majority不等待并发执行的写操作,它将快速返回,但它可能返回陈旧的数据(仍然持久且多数:已确认)。有关详细信息,请参见以下示例:https://docs.mongodb.com/manual/reference/read-concern-majority/#example

在该示例中,在t3〜t5之间(在t3之后和t5之前),主要和次要对象将返回具有读取关注事项majority的不同数据。