MongoDB入门实战教程(11)
前面我们学习了在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实战指南》(图书)

△推荐订阅学习

MongoDB入门实战教程(11)的更多相关文章
- duilib教程之duilib入门简明教程11.部分bug
一.WindowImplBase的bug 在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题, 1.最大化按钮的样式还是没 ...
- Kafka入门实战教程(7):Kafka Streams
1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...
- ZooKeeper入门实战教程(一)-介绍与核心概念
1.ZooKeeper介绍与核心概念1.1 简介ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务.在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道 ...
- Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门
前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...
- MongoDB入门必读(概念与实战并重)
MongoDB入门必读(概念与实战并重) 一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个 ...
- mybatis实战教程(mybatis in action),mybatis入门到精通
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...
- mybatis实战教程(mybatis in action),mybatis入门到精通(转)
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...
- Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建
前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...
- 【转】mybatis实战教程(mybatis in action),mybatis入门到精通
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis ...
- mongodb入门教程二
title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...
随机推荐
- 学习Kotlin语法(一)
简介 Kotlin是一种现代.简洁且功能强大的编程语言,特别适合Android开发.本文将从基础语法开始,逐步掌握Kotlin的核心特性. 目录 变量 基本类型 数字 无符号对应项 布尔值 字符和字符 ...
- CH9121 FTP使用详解
一.FTP简介: FTP是基于TCP应用层的网络文件传输协议,支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式).采用明文通信不加密. 1.Port模式 ...
- JMeter跨线程传参总结
- 🎀gh-ost工具介绍及使用
简介 gh-ost 是一款由GitHub开发的在线DDL(Online Data Definition Language)变更工具,专门用于MySQL数据库.它允许在不锁定表的情况下执行数据库模式变更 ...
- DPDI(Dispatch PDI)kettle调度管理平台之介入前后的对比剖析
DPDI(Dispatch PDI)kettle调度管理平台 --介入前后的对比剖析 引言 在数据处理领域,Kettle(Pentaho Data Integration)作为一款广受欢迎的开源ETL ...
- 微信支付功能的设计实现与关键实践(UniApp+Java)全代码
感觉本篇对你有帮助可以关注一下我的微信公众号(深入浅出谈java),会不定期更新知识和面试资料.技巧!!! 温馨提醒:阅读时可打开导航栏 概述 在移动互联网时代,支付功能已成为应用开发的核心能力之一. ...
- windows查看连接过wifi的密码
如何使用批处理脚本获取已保存的WiFi密码 在日常使用电脑时,我们经常会连接多个WiFi网络.随着时间的推移,可能会忘记某些WiFi的密码.幸运的是,Windows系统提供了命令行工具netsh,可以 ...
- windows11 安装WSL2详细过程
一.什么是 WSL 2 时间来到 2017 年,事情正在起变化.微软正式发布了「适用于 Linux 的 Windows 子系统」,即人们熟知的 Windows Subsystem for Linux, ...
- k8s之ingress反向代理pod
Ingress controller Nginx -->后来改造 Traefik -->也是用于微服务 Envoy -->微服务 Ingress资源 目前使用0.17.1版本ing ...
- python 读写、创建文件
python中对文件.文件夹(文件操作函数)的操作设计到os模块以及shutil模块 os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作,比如:绝对路径,父路径等 ...