【问题标题】:The difference between "majority" and "linearizable"“多数”和“可线性化”的区别
【发布时间】:2017-03-05 23:28:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 好问题。 localmajority 读取关注点之间的区别是可以理解的,但 linearizable 所造成的区别让我无法理解。我在文档中看不到任何解释,如果您使用majority readConcern 并拥有writeConcernMajorityJournalDefault,则有可能读取有被回滚风险的数据。
  • 我已将此标记为迁移到dba.stackexchange.com,希望在那里找到答案。

标签: mongodb


【解决方案1】:

Linearizable”读取问题已在 MongoDb 3.4 中引入,以解决“ma​​jority”读取问题可能存在的问题。

让我们试着理解“ma​​jority”阅读关注的问题,以感受“Linearizable”给我们带来了什么。

假设,我们有一个包含 3 个节点的副本集,看起来像这样:

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

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

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

在 T0 时刻:

以下发生,

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

db.users.find({"_id":100234}); --> 阅读关注“多数”

输出:

{ "_id" : 100234, "name" : "凯特琳" }

  1. BC 意识到 A 已停止响应并开始选举程序。(可能是由于网络分区) .

在 T1 时刻:

以下发生,

  1. 由于选举过程,B 成为新的主节点

然而,直到 A 没有被传达或 A 自己意识到它需要将自己降级为次要,它会继续充当主要(这通常是为了虽然时间很短)。

在 T2 时刻:

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

db.users.update({"_id":100234}, {$set: {name:"Sansa"} }); --> 与 写关注“多数”。

  1. Bob 已确认写入。

在 T3 时刻:

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

db.users.find({"_id":100234}); --> 阅读关注“多数”

输出:

{ "_id" : 100234, "name" : "凯特琳" }

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

线性化的定义: 写入应该是瞬时的。不准确,一旦写 完成,所有后续读取(其中“稍后”由挂钟定义 开始时间)应返回该写入的值或 以后写。一旦读取返回特定值,所有后续读取 应该返回该值或稍后写入的值。

因此,出现了解决方案,即“linearizable”阅读关注点。使用此属性,mongod 检查其主节点并可以看到大多数节点 在发出读取操作的结果之前。 但是,使用此 Read Concern 而非“majority”会降低性能成本,因此这不能替代“majority”读取关注。


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

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

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

上述属性仅适用于写入关注“majority”且未指定日志标志的情况。

【讨论】:

【解决方案2】:

据我了解,节点中的 Read Concern majority立即返回读取查询以及写入该节点的最新数据。另一方面,Read Concern linearizable 将等到并发执行写入完成后再传播给大多数副本集成员,然后再返回结果。

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

由于 Read Concern linearizable 等待并发执行的写入完成,因此其性能明显低于 Read Concern majority

同样,由于 Read Concern majority 不等待并发执行的写入,它会快速返回,但它可能会返回陈旧的数据(仍然持久且 w:majority 已确认)。详情见这个例子:https://docs.mongodb.com/manual/reference/read-concern-majority/#example

在 t3~t5 之间(t3 之后和 t5 之前)之间的示例中,主节点和辅助节点将返回不同的数据,读取关注 majority

【讨论】:

    猜你喜欢
    • 2011-07-16
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2022-08-04
    • 2017-01-09
    相关资源
    最近更新 更多