前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB入门实战教程(10)

MongoDB入门实战教程(10)

作者头像
Edison Zhou
发布2021-07-08 15:29:53
4850
发布2021-07-08 15:29:53
举报
文章被收录于专栏:EdisonTalk

前面我们学习了在MongoDB中如何使用索引来提高查询效率,本篇我们开始进入事务管理部分,首先我们来看看写操作事务。

1 writeConcern详解

通过前面的介绍,我们了解了如何搭建一个MongoDB的复制集实现高可用。要实现高可用,就需要在复制集上有冗余。

那么,对数据的写操作,是需要保证数据成功的在从节点上冗余才能算是高可用的。因此,MongoDB提供了一个writeConcern的参数,它决定了一个数据的写操作要落到多少个节点才算成功。

writeConcern的取值:

(1)0:发起写操作,并不关心是否成功;(实际中不建议使用此方式,无法保证数据的复制是否成功)

(2)1~集群最大节点个数:写操作需要被复制到指定节点个数才算成功;(举例:集群共5个节点,那么此方式需要5个节点都复制成功才算成功。实际中也不建议此方式,延时较长,体验较差)

(3)majority:写操作需要被复制到大多数节点上才算成功;(举例:集群中共5个节点,那么此方式需要5/2=3个节点都复制成功就算成功。实际中建议采用此方式,属于折中考虑的方案)

对于(2)和(3)两种方式,发起写操作的程序将会被阻塞到写操作达到指定的节点个数为止。

综述,从上面的介绍我们可以知道,在实际应用中,建议配置writeConcern为majority,它兼顾了响应时间(性能)和数据冗余(安全),这也是我在团队项目中为MongoDB Driver基础组件设置的默认选项。

2 writeConcern应用

Mongo Shell实验

首先,确保你已经搭建好了一个MongoDB的复制集(replica set),参考《MongoDB入门实战教程(2)》。这里我们有3个节点的复制集,一个primary节点 和 2个secondary节点。

其次,为了模拟网络延迟等待的效果,我们首先在primary节点上通过mongo shell为一个secondary节点设置slaveDelay参数为10s,代表这个secondary节点要等待10s才会被同步数据。

代码语言:javascript
复制
// 拿到复制集的配置
rs0:PRIMARY> conf = rs.conf()
// 查看当前所有members
rs0:PRIMARY> conf.members
// 为第2个secondary节点设置slaveDelay=10s
rs0:PRIMARY> conf.members[2].slaveDelay = 10
// 不让第2个secondary节点参与选举
rs0:PRIMARY> conf.members[2].priority = 0

设置好之后,我们再来试一试带writeConcern参数的insert操作。这里我们先来一个writeConcern=3,即所有3个节点都写成功了才算写入成功,预期结果是等待10s才能成功。

代码语言:javascript
复制
rs0:PRIMARY> db.testDB.insert({count:100}, {writeConcern:{w:3}})

实际结果:等待第2个secondary节点的延迟10s之后才会响应写入成功。

针对这种情况,我们也可以设置一个最大等待时间,超出了就立即响应。

例如,下面设置超过3s就立即响应,不管是否已同步到所有的3个节点:

代码语言:javascript
复制
rs0:PRIMARY> db.testDB.insert({count:100}, {writeConcern:{w:3, wtimeout:3000}})

通过上面的介绍,我们知道将writeConcern设置为majority是比较合适的。

代码语言:javascript
复制
rs0:PRIMARY> db.testDB.insert({count:100}, {writeConcern:{w:"majority"}})

MongoDB .NET Driver实验

在连接字符串级别为所有MongoDB操作设置默认writeConcern级别:

代码语言:javascript
复制
var client = new MongoClient(
    "mongodb+srv://<username>:<password>@<cluster-address>/test?w=majority"
);
var database = client.GetDatabase("test");

在Database级别为某个Database设置默认writeConcern为majority:

代码语言:javascript
复制
var mongoClient = new MongoClient("mongodb://mongo-master:27017");
var defaultDbSettings = new MongoDatabaseSettings()
{
   WriteConcern = WMajority
};
var mongoDatabase = mongoClient.GetDatabase("products", defaultDbSettings);

在Collection级别为某个Collection设置默认writeConcer为majority:

代码语言:javascript
复制
var defaultCollectionSettings = new MongoCollectionSettings()
{
  WriteConcern = WMajority
};         
var collection = mongoDatabase.GetCollection<SKU>("sku", defaultCollectionSettings);

在操作语句级别为某个操作设置writeConcern为majority:

代码语言:javascript
复制
var contact = new Contact();
_contacts.WithWriteConcern(WriteConcern.WMajority).InsertOne(contact);

3 总结

本文简单介绍了MongoDB的写操作事务,它有一个重要的参数writeConcern,了解它的选项并在实际项目中应用对于实现数据的高可用至关重要。

下一篇,我们会学习MongoDB的读操作事务,掌握readPreference 和 readConcern 两个重要参数。

参考资料

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

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

作者:周旭龙

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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