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

Tim*_*Tim 5 distributed go mongodb mgo

使用多个一致性规则查询MongoDB服务器.在mgo,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)
Run Code Online (Sandbox Code Playgroud)

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

但是这三种模型之间的关系是mgo什么?

是否正确Strong暗示EventualEventual暗示Monotonic

谢谢.

Fil*_*und 9

这些是MongoDB声称支持的三种一致性模型:

  • 强一致性:所有并行进程(或节点,处理器等)以相同顺序(顺序)查看所有访问.

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

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

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

然而,看看真实的系统,还有更多的东西可以找到.

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

在最终模式中,同时从多个辅助节点完成读取.这意味着当我们到达不同的节点时,我们可能会看到无序更新.写入是针对主要进行的,但可能是多个并发连接.这意味着写入也可能无序到达.从文档中不清楚第一次写入后的读取是否全部由主要服务器提供,如单调模式,或者它们是否继续由辅助服务器提供服务.但是,源代码告诉我们读取继续由辅助服务器提供.

// Switch over a Monotonic session to the master.
if !slaveOk && s.consistency == Monotonic {
    s.slaveOk = false
}
Run Code Online (Sandbox Code Playgroud)

因此,对于Mgo v2,Strong意味着Monotonic意味着最终.