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

  • 时间:
  • 浏览:2
  • 来源:5分11选5APP下载_5分11选5APP官方

而且最新的数据不一定是majority 的数据,而对于那我节点来说,用户要的而且是majority 的数据,没有来越多存储引擎须要有一种生活保存历史数据的能力,目前都还还可以都还还可以能 wiredTiger才支持snapshot,没有来越多而且要使用ReadConcern=="majority", 须要使用wiredTiger 引擎。

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

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

由第一主次我门都看了readConcern 须要设置level, afterClusterTime, atClusterTimeout,MongoDB driver 提供了相关的接口让用户当时人设置。 其中的Level 用户使用readConcern 则须要指定。许多的则都不 须要, driver 会设置默认值。

afterOpTime 而且Deprecated 了,都还还可以能忽略。

ClusterTime 暂时理解为那我时间点, 而你你这名时间点是什么含义取决于level 参数。

afterClusterTime 表示在该时间点之前 。

atClusterTime 而且是4.2 的全局事务有关,目前driver 之前 我支持设置。

上述2种妙招都比较及时, MongoDB 4.0 中采用了 b 方案。

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

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

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

为了处理上述现象2, 用户都还还可以能指定level 为majority + afterClusterTime, 表示用户要在ClusterTime之前 的数据,而且大多数节点都而且有你你这名数据了。 这时,都还还可以能保证即使另那我有该数据的节点死掉,是新的primary肯定有你你这名数据,所有的secondary最终也会有你你这名数据。

而且level 为local, ClusterTime 则表示applied oplog time。

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

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

为了处理上述现象1, 用户都还还可以能指定local + afterClusterTime, 表示用户要数据 ClusterTime 之前 的数据(但依然而且都不 最新数据),而且你你这名节点都还还可以都还还可以能 ,服务器没有多说返回,有有2个劲等到有为止。

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

MongoDB的写请求写入Primary, secondary从Primary自动获取而且应用oplog来保持和主库的同步, MongoDB 允许用户从Primary 而且 secondary 读取数据(由客户端ReadPreference 决定)。但读数据而且发生以下现象: