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
暗示Eventual
,Eventual
暗示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/