查询MongoDB服务器有多个
一致性规则。在mgo中,SetMode对象的Session更改了 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进行的任何后续读取操作将始终返回相同的值或更新的值。
  • 最终一致性:如果未对给定的数据项进行任何新的更新,则最终对该项目的所有访问都将返回上次更新的值。

  • 根据这些定义,Strong表示最终的,而Strong表示单调,但是最终的一致性和单调的读取之间没有关系。

    但是,从实际系统来看,还有更多发现。

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

    在“最终”模式下,同时从多个辅助节点进行读取。这意味着,当更新到达不同的节点时,我们可能会看到它们乱序。针对主数据库执行写入操作,但可能会在多个并发连接中执行写入操作。这意味着写入也可能会乱序到达。从文档中尚不清楚,第一次写入后的读取是否全部由主要服务器提供,例如在单调模式下,还是继续由次要服务器提供。 The source code告诉我们,次要的继续阅读。
    // Switch over a Monotonic session to the master.
    if !slaveOk && s.consistency == Monotonic {
        s.slaveOk = false
    }
    

    因此,对于Mgo v2, Strong表示单调,表示最终

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

    10-10 23:56