mongodb - 比较 mgo 中使用的一致性模型

标签 mongodb go distributed mgo

MongoDB 服务器被多个查询 一致性规则。在mgo中,Session对象的SetMode改变了 session 的一致性模式。三种类型 可用的一致性模式有:最终、单调和强。

例如

session, err := mgo.Dial("localhost")
if err != nil {
    panic(err)
}
defer session.Close()
//Switch the session to a monotonic behavior.
session.SetMode(mgo.Monotonic, true)

我正在阅读 https://en.wikipedia.org/wiki/Consistency_model 中的不同一致性模型

但是mgo中使用的三个模型有什么关系呢?

Strong暗示EventualEventual暗示Monotonic对吗?

谢谢。

最佳答案

以下是 MongoDB 声称支持的三种一致性模型:

  • 强一致性:所有并行进程(或节点、处理器等)以相同的顺序(按顺序)看到所有访问。

  • 单调读取:如果进程读取数据项 x 的值,则该进程对 x 的任何连续读取操作将始终返回相同的值或更新的值。

  • 最终一致性:如果没有对给定数据项进行新的更新,最终对该项的所有访问都将返回最后更新的值。

通过这些定义,强意味着最终,强意味着单调,但最终一致性和单调读取之间没有关系。

然而,看看真实的系统,还有更多的发现。

在 MongoDB 中,单调模式意味着客户端打开到某个辅助节点的单个连接。所有读取都通过此连接发生。当发生写入时,客户端断开连接并连接到主节点,然后执行写入。写入后的读取是从主节点执行的。

在最终模式下,从多个辅助节点同时进行读取。这意味着我们可能会看到更新乱序,因为它们到达不同的节点。写入是针对主节点执行的,但可能在多个并发连接中执行。这意味着写入也可能乱序到达。从文档中不清楚第一次写入之后的读取是否都由主节点提供服务,例如在单调模式下,或者它们是否继续由辅助节点提供服务。 The source code但是,它告诉我们读取继续由辅助节点提供服务。

// Switch over a Monotonic session to the master.
if !slaveOk && s.consistency == Monotonic {
    s.slaveOk = false
}

因此,对于 Mgo v2,强意味着单调意味着最终

关于mongodb - 比较 mgo 中使用的一致性模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38572332/

相关文章:

node.js - MongoDB 由于键太大而无法建立索引而失败

javascript - Mongodb shell JavaScript 读取不同的表

mongodb - 如何获得 mongoDB 集合的排名位置?

google-app-engine - AppEngine 数据存储 : Hierarchical queries

javascript - 如何在 Meteor javascript 中使用 Mongodb 填充下拉菜单?

golang什么是导入副作用

Golang yaml.v2 将数组编码为序列

tensorflow - 使用分布策略在 Estimator 中累积梯度

quartz-scheduler - 分布式定时器服务

distributed - Kademlia 能否安全地用于具有足够隐私的聊天/讨论应用程序?