mongodb是nosql数据库吗 11 NoSQL | MongoDB入门实战教程


mongodb是nosql数据库吗 11 NoSQL | MongoDB入门实战教程

文章插图
| 总结/Edison Zhou
前面我们学习了在MongoDB中的写操作事务管理,本篇我们开始进入读操作事务 。
1 读数据关注的两个问题
在通过mongodb读取数据时,我们一般需要关注两个问题:
(1)从哪里读取?
(2)什么样的数据可以被读取?
第一个问题,mongodb交给了 readPreference 来解决 。
第二个问题,mongodb交给了 readConcern 来解决 。
2 readPreference详解
关于readPreference
readPreference 选项决定了mongodb会使用哪一个节点(primary or secondary)来满足正在发起的读请求 。
mongodb是nosql数据库吗 11 NoSQL | MongoDB入门实战教程

文章插图
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:读取最近快照中的数据


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: