将与Mongo Go官方驱动程序mongo-go-driver(mgo中的session.SetMode)进行的会话的一致性规则设置为单调。

时间:2019-04-16 10:44:41

标签: mongodb go

我们正在从不再使用的mgov2切换到官方驱动程序

在mgo中,我们将会话模式设置为单调,如下所示:

myMongoSession.SetMode(mgo.Monotonic, true)

我对此的理解是确保:“如果某个进程读取数据项x的值,则该进程对x进行的任何后续读取操作将始终返回相同的值或更新的值。”

这对我们很重要

我将如何使用官方驱动程序执行此操作?我找不到这样做的参考

1 个答案:

答案 0 :(得分:3)

  

我对此的理解是确保:“如果某个进程读取数据项x的值,则该进程对x进行的任何后续读取操作将始终返回相同的值或更新的值。”

是,但并非总是如此。我们来看一下单调模式session.go#L73的代码注释:

// Monotonic mode is specific to mgo, and is same as SecondaryPreferred before first write. 
// Same as Primary after first write.
Monotonic Mode = 1

根据SetMode()的{​​{3}}:

  

在单调一致性模式下,读取的内容可能并不完全   最新信息,但他们将始终看到变化的历史   向前,在顺序查询中,数据读取将保持一致   同一会话,在该会话中进行的修改将是   在以下查询(您的写入)中观察到。

     

在实践中,单调模式是通过执行初始   读取与任意辅助节点的唯一连接,如果是   可用,并且一旦首次写入发生,会话连接即为   切换到主服务器。这设法分发一些   次要的阅读负荷,同时保持一些有用的   保证。

在大多数情况下,这是正确的,但是在某些情况下,SecondaryPreferred可能会选择{em> 次不同的次级,而它们的godoc.org/github.com/globalsign/mgo次可能不同。

  

我将如何使用官方驱动程序执行此操作?

单调模式是mgo特有的术语,对于Oplog不存在。 MongoDB Go driver和/或causal consistency等新功能已取代了此功能。

mongo-go-driver较为冗长,但也可以更好地控制multi-document transactionsread preferencesread concern

因果一致性示例:

opts := options.Client().ApplyURI(mongoURI).SetReadPreference(readpref.Secondary()).SetReadConcern(readconcern.Majority()).SetWriteConcern(writeconcern.New(writeconcern.WMajority()))
client, err := mongo.NewClient(opts)
if err != nil {
    panic(err)
}

有关交易示例,请参见write concern(在标签上选择Go语言)