【问题标题】:MongoDb linearizable read concern restrictionsMongoDb 线性化读取关注限制
【发布时间】:2018-06-27 04:31:31
【问题描述】:

有人可以向我解释Mongodb linearizable read concern 文档的某些部分吗:

仅当读取操作指定唯一标识单个文档的查询过滤器时,线性化读取关注保证才适用。

这是否意味着我必须在查询过滤器中显示的字段上拥有唯一索引

例如,让我们回答 4 个问题:

  1. 我的集合 test 在 A 字段上没有唯一索引。 db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000)

    它是 linearizable 并且我无法读取 stale 吗?如果回答,是否意味着没有理由在唯一索引中未显示的字段的读取中使用线性化读取关注

  2. 我有集合 test 在 A 字段上具有唯一索引。
    db.test.ensureIndex({A:1}, {unique:true}); db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000);

    它是 linearizable 并且我无法读取 stale 吗?

  3. 我有集合 test 在 A 字段上具有唯一索引。
    db.test.ensureIndex({A:1}, {unique:true}); db.test.find({A:1, B:1}).readConcern("linearizable").maxTimeMS(10000);

    它是 linearizable 并且我无法读取 stale 吗?

  4. 我的集合 test 在 A 字段上没有唯一索引。但是 find 方法在结果中只返回一个文档。
    db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000); //returned {_id:"someId", A:1}

    它是 linearizable 并且我无法读取 stale 吗?

【问题讨论】:

    标签: database mongodb mongodb-query database-administration linearization


    【解决方案1】:

    分布式数据库的概念可能很难理解,在解决问题之前让我们先介绍一些背景知识。

    Linearizable Read Concern 在 MongoDB v3.4 中引入,是为了确保应用程序始终从正确(当前/合法)primary node 中读取最新数据。这意味着在网络分区期间,应用程序不会读取:

    • 陈旧数据,即可能无法反映在读取操作之前发生的所有写入,或者
    • 未提交的数据,即数据的状态可能反映尚未得到多数或副本集成员确认的写入,因此可能会回滚

    由于在多个节点(即辅助节点)中跟踪多个状态(即已传播、已提交)的数据的复杂性,linearizable 读取关注的保证仅适用于读取操作唯一标识的情况一个文档。

    这是否意味着我必须对查询过滤器中显示的字段具有唯一索引?

    现在要解决您的问题,查询只需返回集合中的一个唯一文档。集合不一定要有唯一索引,尽管使用唯一索引有助于查询返回单个文档。例如,使用_id 指定查询过滤器。由于字段名称_id 保留用作主键;它的值在集合中必须是唯一的。

    您可能还有兴趣阅读以下内容:

    【讨论】:

    • 你能再回答一个问题吗?据我所知,可线性化的一致性是通过 noop 写入工作的。如果写入完成,则表示我们是主节点,我们可以向客户端返回答案:Replication-Internals。我的另一个问题是:为什么线性化对单个文档施加限制?为什么单身?如果我们是大师,为什么我们不能返回文档数组?
    • @DmitryZyr 我已经解决了这个问题,但我会详细说明。您对we are master 的假设并不总是正确的,因为 1) 还必须在辅助节点上跟踪数据,无论它们的数据是否被传播和提交 2) 在网络分区的情况下,主节点可能不是主节点。此外,您还需要考虑在辅助中检查每个文档的复杂性。例如,只有 2 个文档,在一个文档被确认传播并提交到大多数副本集后,在检查第二个文档时,不能保证第一个文档已经更新。
    猜你喜欢
    • 2019-02-28
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    相关资源
    最近更新 更多