MongoDB: 通过ReadConcern 来处理备库一致读的问题

  • 时间:
  • 浏览:0

afterOpTime 机会Deprecated 了,可不里能忽略。

ClusterTime 暂时理解为俩个 时间点, 而什儿 时间点是哪些含义取决于level 参数。

afterClusterTime 表示在该时间点就让。

atClusterTime 机会是4.2 的全局事务有关,目前driver 有就让我支持设置。

机会level 为local, ClusterTime 则表示applied oplog time。

机会level 为majority, ClusterTime 则表示大多数节点都达到的 applied oplog time。

由第一次要亲戚朋友看到readConcern 可不里能设置level, afterClusterTime, atClusterTimeout,MongoDB driver 提供了相关的接口让用户此人 设置。 其中的Level 用户使用readConcern 则可不里能指定。或多或少的则都在可不里能, driver 会设置默认值。

每俩个 MongoDB slave 都维护了俩个 _lastAppliedOpTime 和 _lastCommittedOpTime。 (根据mongodb 的配置,_lastAppliedOpTime 有时应该是_durableOpTime,这里不做区分)

机会使用了 causally consistent, MongoDB driver会自动更新afterClusterTime 为上第一根请求的response 的operationTime。

上述2种法律法律依据都比较及时, MongoDB 4.0 中采用了 b 方案。

MongoDB的写请求写入Primary, secondary从Primary自动获取有就让我应用oplog来保持和主库的同步, MongoDB 允许用户从Primary 机会 secondary 读取数据(由客户端ReadPreference 决定)。但读数据机会指在以下间题:

b). slave 每次向它的source节点请求oplog 的就让,source节点会返回它的_lastAppliedOpTime。

机会最新的数据不一定是majority 的数据,而对于俩个 节点来说,用户要的机会是majority 的数据,就让 存储引擎可不里能有一种生活保存历史数据的能力,目前能不可不里能 wiredTiger才支持snapshot,就让 机会要使用ReadConcern=="majority", 可不里能使用wiredTiger 引擎。

为了处置上述间题1, 用户可不里能指定local + afterClusterTime, 表示用户要数据 ClusterTime 就让的数据(但依然机会都在最新数据),机会什儿 节点这麼 ,服务器无须返回,突然等到有为止。

_lastAppliedOpTime 的值比较容易维护,每次apply一批oplog 就会直接更新。_lastCommittedOpTime 更新比较困难。 主要有以下几种法律法律依据:

_lastAppliedOpTime 表示本节点applied 到了那个时间,

_lastCommittedOpTime 表示克隆qq好友好友集内写入到majority节点的_lastAppliedOpTime。

为了处置上述间题2, 用户可不里能指定level 为majority + afterClusterTime, 表示用户要在ClusterTime就让的数据,有就让我大多数节点都机会有什儿 数据了。 这时,可不里能保证即使就让有该数据的节点死掉,是新的primary肯定有什儿 数据,所有的secondary最终也会有什儿 数据。

MongoDB 引入了ReadConcern的概念, readConcern 的原型为: