gpt4 book ai didi

mongodb - "majority"和 "linearizable"之间的区别

转载 作者:行者123 更新时间:2023-12-02 02:43:42 25 4
gpt4 key购买 nike

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

"majority"
The query returns the instance’s most recent data acknowledged as having been written to a majority of members in the replica set.

"linearizable"
The query returns data that reflects all successful writes issued with a write concern of "majority" and acknowledged prior to the start of the read operation.

文档还提到了一个选项“writeConcernMajorityJournalDefault”,它表示将该选项设置为 false 时,即使使用“线性化”,也可以回滚数据。

有人可以解释一下这两个问题是如何运作的以及这个选项如何影响它们吗?

最佳答案

MongoDb 3.4 中引入了“线性化”读取关注点,以解决“多数”读取关注点可能出现的问题。

让我们尝试理解“多数”的问题,阅读关注点来感受“线性化”给我们带来了什么。

假设我们有一个包含 3 个节点的副本集,如下所示:

3 node replica set

哪里,A 是主要的,B 是次要的,C 是次要的

我们还有两个用户 AliceBob,他们将对位于“用户”中的以下文档执行一些操作”集合。

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

在 T0 时刻:

发生以下情况,

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

db.users.find({"_id":100234}); --> with read concern 'majority'

输出:

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

  • BC意识到A已停止响应并开始选举程序。(可能是由于网络分区 em>)。
  • 在 T1 时刻:

    发生以下情况,

    1. 由于选举过程,B 成为新的初选

    但是,直到 A 未进行通信或 A 本身意识到需要将自己降级为辅助设备时,它才会继续充当主设备(这通常是为了虽然很短的一段时间)。

    enter image description here

    在 T2 时刻:

    1. Bob 连接到 B(新主节点)并发出以下命令。

    db.users.update( {"_id":100234}, {$set: {name:"Sansa"} } ); --> with write concern 'majority'.

  • Bob 已确认写入。
  • 在 T3 时刻:

    1. Alice 连接到 A(旧主设备)并发出以下命令。

    db.users.find({"_id":100234}); --> read concern 'majority'

    输出:

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

    即使在发出多数读取关注后,Alice 也会获取陈旧数据,即 Bob 所做的写入对 Alice 不可见。因此,“线性化”属性在这种情况下得到了补偿。

    Definition of Linearizability: writes should appear to be instantaneous. Imprecisely, once a write completes, all later reads (where “later” is defined by wall-clock start time) should return the value of that write or the value of a later write. Once a read returns a particular value, all later reads should return that value or the value of a later write.

    因此,出现了解决方案,即“线性化”读取问题。通过此属性,mongod 检查其主节点并可以看到大多数节点在发出读操作的结果之前。但是,使用此读取关注点而不是“多数”会带来性能成本损失,因此这不能替代“多数”读取关注点。

    <小时/>

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

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

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

    上述属性仅在使用写入关注点“majority”并且未指定日志标志时才适用。

    关于mongodb - "majority"和 "linearizable"之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42615319/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com