前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB运维与开发(9)---readConcern

MongoDB运维与开发(9)---readConcern

作者头像
AsiaYe
发布2020-12-14 09:41:55
1.4K0
发布2020-12-14 09:41:55
举报
文章被收录于专栏:DBA随笔DBA随笔

//

MongoDB运维与开发(9)---readConcern

//

readConcern产生背景

MongoDB的写请求写入Primary, secondary从Primary自动获取并且应用oplog来保持和主库的同步, MongoDB 允许用户从Primary 或者 secondary 读取数据。但读数据可能存在以下问题:

1、如果用户从secondary读,但secondary还没有跟上Primary,就会导致读取了老数据

2、如果用户从primary读到数据,但在该数据复制到secondary 之前crash 了,就会导致用户读取到"脏数据"。

MongoDB在3.6版本中引入了readConcern这个参数,readConcern决定在读取数据的时候,到底能够读取到哪个版本的数据。

今天主要看看概念性质的东西,下篇文章中会给出相应的例子。

readConcern可选的值包含:

local、available、majority、linearizable、snapshot

下面来看这几个值的含义:

1、local:查询从实例返回数据,不能保证数据已经写入大多数副本集成员

  • 默认从主库读
  • 如果本次读取使用了causally consistent(这里仅知道这个概念就行,关于这个概念,后续会补充) ,则默认在从库读

2、available:查询从实例返回数据,不能保证数据已经写入大多数副本集成员

  • 如果本次读取没有使用causally consistent ,则默认在从库读
  • 如果本次读取使用了causally consistent ,则不能使用available

对于分片的副本集来说,available模式提供了最低的读取延迟,但是这个优点是以数据的一致性为代价的,因为它可能返回一个孤立的文档。

3、majority:查询结果返回被副本集的大多数成员确认的数据,读操作返回的文档是持久化的

要想使用majority这个模式的readConcern,MongoDB必须使用wireTiger存储引擎。

4、linearizable:该查询返回的数据返回在读取操作开始之前完成的所有成功的多数确认写入。查询可能会等待并发执行的写操作传播到大多数副本集成员,然后返回结果。

如果集群中大多数副本集成员崩溃,并且在读取操作后重新启动,这个时候,读取的结果将取决于参数:

writeConcernMajorityJournalDefault

如果writeConcernMajorityJournalDefault设置为默认状态true,则读取操作返回的文档是持久的;

如果将writeConcernMajorityJournalDefault设置为false时,在确认写入之前,MongoDB不会等待数据写入磁盘日志,即使我们配置了w=majority。这样,在给定副本集中大多数节点的瞬时丢失的情况下,多数写入操作可能会回滚(为磁盘中没有日志)。

  • 通常情况下,可以对primary节点配置线性读取
  • 如果读取使用了causally consistent,则无法使用linearizable模式

5、snapshot:适用于多文档事务中的操作。

通常情况下使用较少。后续有用到,再举例说明。

注意:

  • 目前 readConcern 主要用于跟 mongos 与 config server 的交互上
  • 使用readConcern 需要配置replication.enableMajorityReadConcern选项
  • 只有支持 readCommited 隔离级别的存储引擎才能支持 readConcern,比如 wiredtiger 引擎,而 mmapv1引擎则不能支持。

有帮助的话还希望点下再看哈

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档