前面我们学习了在MongoDB中的写操作事务管理,本篇我们开始进入读操作事务。

1 读数据关注的两个问题

在通过mongodb读取数据时,我们一般需要关注两个问题:

(1)从哪里读取?

(2)什么样的数据可以被读取?

第一个问题,mongodb交给了 readPreference 来解决。

第二个问题,mongodb交给了 readConcern 来解决。

2 readPreference详解

关于readPreference

readPreference 选项决定了mongodb会使用哪一个节点(primary or secondary)来满足正在发起的读请求。

readPreference的可选值:

(1)primary:只选择主节点

(2)primaryPreferred:优先选择主节点,如果主节点不可用则选择从节点

(3)secondary:只选择从节点

(4)secondaryPreferred:优先选择从节点,如果从节点不可用则选择主节点;

(5)nearest:选择最近的节点,无论是primary 还是 secondary 角色。

readPreference适用场景

比如,在电商场景中,用户下单后会立即跳转到订单详情页,这时候可以配置为 primary/primaryPreferred,因为这时候从节点可能还没有获得同步的新订单数据。

又如,用户查询自己的历史订单记录,这时候可以配置为 secondary/secondaryPreferred,因为这时候用户对历史订单的时效性没有太高的要求;

再如,在Report场景中,由于报表对时效性的要求并不是太高,但资源需求较大,因此可以配置为secondary,在从节点单独处理,避免对线上用户造成影响。

最后,在内容管理场景中,将用户上传的图片分发到全世界(比如多数据中心的场景),可以配置为nearest,让各地用户能够就近读取数据。

readPreference应用实践

在MongoShell中:

// 在读取students集合时采用secondary策略
db.teams.find().readPref("secondary");

在.NET应用程序中:

// 通过连接字符串设置全局默认readPreference策略
mongodb://mongo-master:27017,mongo-slave1:27017,mongo-slave2:27017/?replicaSet=testRs&readPreference=secondary // 在.NET代码中通过Driver设置readPreference策略
_contacts.WithReadPreference(ReadPreference.Secondary).Find(doc => true);

扩展:Tag

在mongodb中,readPreference只能控制某一类节点,而tag则可以将节点选择控制到一个或多个节点。在Kubernetes中,也有tag这个概念,可以将容器部署到指定tag的一个或多个node上。

比如,一个5节点的复制,3个节点硬件较好专供服务线上客户实时操作,2个节点硬件较低专供服务报表生成。这时,就可以给3个硬件较好的节点打tag:{purpose: "online"},给2个硬件较低的节点打tag:{purpose: "reporting"}。最后,在线应用在读取数据时就可以指定tag是{purpose: "online"}的节点读取,而报表应用则指定tag是{purpose: "reporting"}的节点读取。

3 readConcern详解

关于readConcern

readPreference 解决了从哪里读数据的问题,而readConcern 则用来解决什么样的数据可以被读取。

readConcern 类似于传统关系型数据库的隔离级别,它的可选项包括:

(1)available:读取所有可用的数据

(2)local:读取所有可用且属于当前分片的数据

(3)majority:读取在大多数节点上提交完成的数据

(4)linearizable:可线性化读取文档

(5)snapshot:读取最近快照中的数据

可以看到,上面的可选项基本上也是遵循了关系型数据的事务隔离级别,越往下安全性越高,但是并发性能越低。

在实际应用中,和 writeConcern 一样,我们往往会折中考虑做权衡,因此我们在readConcern的一般性场景下选择 majority,即读取在大多数节点上提交完成的数据。如果跟事务隔离级别对比,那majority就类似于Read Commited即提交读。

readConcern应用实践

在MongoShell中:

db.teams.find().readConcern("majority");

在.NET应用程序中:

// 连接字符串全局设置
mongodb://mongo-master:27017,mongo-slave1:27017,mongo-slave2:27017/?replicaSet=testRs&readConcern=majority // 在.NET代码中操作Driver时设置
_contacts.WithReadConcern(ReadConcern.Majority).Find(doc => true);

writeConcern + readConcern

在某些场景中,向主节点写入了一条数据,立即从从节点读取这条数据,如何才能在不改变方式的前提下保证用户能够读取到刚刚写入的数据?

对于这类问题,我们也可以称其为如何实现一个安全的读写分离。

这里,我们可以使用 writeConcern + readConcern 的组合拳来实现:

db.orders.insert({ oid: 101, sku: "kiteboar", q: 1}, {writeConcern:{w: "majority”}});
db.orders.find({oid:101}).readPref("secondary").readConcern("majority");

4 总结

本文简单介绍了MongoDB的读操作事务,它有两个重要的参数 readPreference 和 readConcern,分别解决从哪里读取数据 和 什么样的数据可以被读取 的问题。

下一篇,我们会学习MongoDB的多文档事务,这是MongoDB 4.x版本的最大改进。

参考资料

唐建法,《MongoDB高手课》(极客时间)

郭远威,《MongoDB实战指南》(图书)

△推荐订阅学习

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

MongoDB入门实战教程(11)的更多相关文章

  1. duilib教程之duilib入门简明教程11.部分bug

    一.WindowImplBase的bug    在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,    1.最大化按钮的样式还是没 ...

  2. Kafka入门实战教程(7):Kafka Streams

    1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...

  3. ZooKeeper入门实战教程(一)-介绍与核心概念

    1.ZooKeeper介绍与核心概念1.1 简介ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务.在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道 ...

  4. Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门

    前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...

  5. MongoDB入门必读(概念与实战并重)

    MongoDB入门必读(概念与实战并重) 一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个 ...

  6. mybatis实战教程(mybatis in action),mybatis入门到精通

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...

  7. mybatis实战教程(mybatis in action),mybatis入门到精通(转)

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...

  8. Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建

    前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...

  9. 【转】mybatis实战教程(mybatis in action),mybatis入门到精通

    MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis ...

  10. mongodb入门教程二

    title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...

随机推荐

  1. Java WatchService监控指定路径下的文件新增、删除和修改(子文件夹、指定文件类型)

    WatchService 是 Java NIO 包 (java.nio.file) 中提供的一个用于监控文件系统变化的 API.它允许应用程序监听目录中的文件创建.修改和删除事件. 基本原理 Watc ...

  2. 扫盲ASM

    在进行程序跟踪时,会出现汇编.由于ASM盲,所以添加不少烦恼.有烦恼得想办法解决.对,扫盲ASM. 这里是教材,感觉大白话很好理解(感谢 http://www.ruanyifeng.com/blog/ ...

  3. WgelCTF打靶笔记(2)

    参考视频:https://www.bilibili.com/video/BV1itwgeHEEk/?spm_id_from=333.1387.upload.video_card.click&v ...

  4. kette介绍-Step之Table input

    表输入(Table Input)介绍: Table input用于将数据源的数据加载到Kettle转换中的行集,可以说是数 据从持久化到内存的一种加载变换,故名为输入.加载内部过程,就是通过JDBC ...

  5. .NET周刊【4月第1期 2025-04-06】

    国内文章 35岁程序员的中年求职记:四次碰壁后的深度反思 https://www.cnblogs.com/minily/p/18803259 文章探讨程序员的35岁危机,指出这一问题确实存在,但也有其 ...

  6. [开源] .NetCore 使用 ORM FreeSql 访问 Sqlite

    1.创建项目 我们以 console 类型项目试验 插入.删除.更新.查询 等功能,创建控制台项目,使用命令: dotnet new console dotnet add package FreeSq ...

  7. QQ收藏self_xss漏洞复现(娱乐)

    漏洞影响范围:QQ安卓版本 <=V8.8.5.5570 漏洞存在位置:QQ我的收藏功能 我的qq版本 漏洞复现 1.点击头像>>我的收藏 2.点击右上角:"+" ...

  8. 揭秘AI自动化框架Browser-use(四):Browser-use记忆模块技术解析

    一.从一次失败的景点采集说起 在 AI 自动化任务中,记忆模块是实现复杂任务处理的关键组件.Browser-use 项目通过引入记忆模块,解决了 LLM 在连续性任务中的无状态性问题,使代理能够维持上 ...

  9. 遇到的问题之“input的值感觉没有设置上去,却有值”

    案例一.批量设置参数 1.被设置的框 改为下拉框的问题可参考:https://www.cnblogs.com/saoge/p/16985318.html <td> <app:inpu ...

  10. Vue3 学习-初识体验-helloworld

    在数据分析中有一个最重要的一环就是数据可视化, 数据报表的开发. 从我从业这几年的经历上看, 经历了从业务系统导表格数据, 到Excel+PPT, 再是开源报表工具, 再是主流商业BI产品(低/零代码 ...