“多数提交的数据”和“多数提交的数据的快照”有什么区别

时间:2018-12-24 02:36:59

标签: mongodb

多数人提交的数据与多数人提交的数据的快照有什么区别,我应该在意吗?如果两个概念完全不同,那么何时以及如何选择一个?

我正在阅读有关mongodb事务的参考:https://docs.mongodb.com/manual/core/transactions/#transaction-options-read-concern-write-concern-read-preference,并注意到多数提交的数据和多数提交的快照的数据可能存在一些差异,但是我没有不知道真正的区别以及如何选择一个。

1 个答案:

答案 0 :(得分:0)

不幸的是,文档确实将这些概念视为理所当然,但区别并不那么容易理解。我什至不确定我是否正确,但 Aly Cabral 在 her talk about distributed transactions 中做了这个例子。

如果我指定 readConcern: snapshot,那么我将在所有分片中拥有一致的时间点。

enter image description here

相反,如果我指定 readConcern: localreadConcern: majority,那么我将为每个分区提供一致的快照。

enter image description here

她最后说,使用 readConcern: snapshot,协调跨分片集群的快照查找可能很昂贵,因此您应该权衡每个 readConcern 的利弊。


她做了一个很好的例子,这些图片真的对我有帮助,但我认为有必要补充一下:

  • 显示的 time 字段指的是 ClusterTime1:这是一个基于混合逻辑时钟的集群范围的逻辑时钟。每个分片的主分片都有自己的 ClusterTime 值并遵守以下规则:

    <块引用>

    ClusterTime 增量规则: 只有当有 写入主节点的复制操作日志 (oplog)。 集群时间分布规则: 集群节点(mongod、mongos、配置服务器、客户端) 始终跟踪并包含最知名的 ClusterTime 发送消息时。

    如果在第二张图片中,交易的 ClusterTime 被选择为 102,那么 ClusterTime 为 110 的分片可能具有我不想在交易过程中看到的多数提交的更改。从 MongoDB 5.0 开始,这个时间是可配置的:

    readConcern: {
        level: "snapshot",
        atClusterTime: Timestamp(1613577600, 1)
    }
    

我正在编写关于 MongoDB 事务的 report,我已经解释了这些概念和许多其他概念。如果您发现错误/需要改进的地方,我将非常感谢任何人的帮助。


1:https://dl.acm.org/doi/pdf/10.1145/3299869.3314049