前面我们学习了在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才会被同步数据。

// 拿到复制集的配置
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才能成功。

rs0:PRIMARY> db.testDB.insert({count:100}, {writeConcern:{w:3}})

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

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

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

rs0:PRIMARY> db.testDB.insert({count:100}, {writeConcern:{w:3, wtimeout:3000}})

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

rs0:PRIMARY> db.testDB.insert({count:100}, {writeConcern:{w:"majority"}})

MongoDB .NET Driver实验

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

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

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

var mongoClient = new MongoClient("mongodb://mongo-master:27017");
var defaultDbSettings = new MongoDatabaseSettings()
{
WriteConcern = WMajority
};
var mongoDatabase = mongoClient.GetDatabase("products", defaultDbSettings);

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

var defaultCollectionSettings = new MongoCollectionSettings()
{
WriteConcern = WMajority
};
var collection = mongoDatabase.GetCollection<SKU>("sku", defaultCollectionSettings);

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

var contact = new Contact();
_contacts.WithWriteConcern(WriteConcern.WMajority).InsertOne(contact);

3 总结

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

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

参考资料

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

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

△推荐订阅学习

作者:周旭龙

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

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

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

  1. Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...

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

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

  3. duilib教程之duilib入门简明教程10.界面设计器 DuiDesigner

    上一个教程讲解了怎么布局最大化.最小化.关闭按钮,但是如果手动去计算这三个按钮的位置和大小的话,非常的不直观,也很不方便.    所以这一章准备介绍duilib的UI设计器,由于这个设计器很不完善,也 ...

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

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

  5. MVC5 + EF6 入门完整教程二

    从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛弃了WebForm的一些特有的习惯,例如服务器端控件,Vie ...

  6. MVC5+EF6 入门完整教程 总目录

    本系列文章会从一个主干开始,逐渐深入,初步规划30篇.初级10篇,中级10篇,综合项目实战10篇 初级10篇 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@201505 ...

  7. MVC5+EF6 入门完整教程

    MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@20150521 MVC5+EF6 入门完整教程9:多表 ...

  8. MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

    稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...

  9. MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用

    摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...

  10. MVC5+EF6 入门完整教程12--灵活控制Action权限

    大家久等了. 本篇专题主要讲述MVC中的权限方案. 权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一. 前面的系列文章中我们用到了 SysUser, SysRole, SysUserR ...

随机推荐

  1. 使用 PHP cURL 实现 HTTP 请求类

    类结构 创建一个 HttpRequest 类,其中包括初始化 cURL 的方法.不同类型的 HTTP 请求方法,以及一些用于处理响应头和解析响应内容的辅助方法. 初始化 cURL 首先,创建一个私有方 ...

  2. TCP延迟调优之PSH参数与passt延迟问题修复

    qemu中使用passt来作为虚拟机的网卡NAT实现,希望能够利用它IP地址与host一致的优点.这本来是没有啥问题的,但是不知道为什么它的TCP入口流量的延迟很严重. 好吧,反正以后总是要改pass ...

  3. 🎀dubbo 2.7.2 启动报错【Unsupported generic type false】排查

    1.问题现象 dubbo服务启动时抛出异常Unsupported generic type false,但不影响服务正常发布. Caused by: java.lang.IllegalArgument ...

  4. 康谋产品 | 用于ADAS和AD传感器的独立数据采集设备

    一.产品简介 在 ADAS/AD 环境中,如果想要将原始数据与摄像头.雷达或激光雷达等传感器分离,总是会使用测量数据转换器.借助MDILink,您可以获得一个SerDes测量数据转换器,从开发阶段和验 ...

  5. Promise 这个新 API 真香!

    Hey, 我是 沉浸式趣谈 本文首发于[沉浸式趣谈],我的个人博客 https://yaolifeng.com 也同步更新. 转载请在文章开头注明出处和版权信息. 如果本文对您有所帮助,请 点赞.评论 ...

  6. Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器

    企业级应用开发的需求日益增长.今天,我们要介绍的是一个在GitHub上广受好评的开源项目--Jeesite5.这不仅是一个技术框架,更是企业级应用开发的加速器.接下来,我们将深入探讨Jeesite5的 ...

  7. 记录一次mysql数据库修复过程

    1. 场景 最近在使用小皮面板进行靶场搭建的时候,发现数据库一直无法启动,而在虚拟机里是可以启动了,这就很奇怪了.意识到我的本地已经安装了mysql,可能产生了冲突,但是当我兴冲冲启动本地mysql的 ...

  8. .net6.0及以上WPF中使用GDI+的demo

    using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows; usin ...

  9. dll正由另一进程使用,因此该进程无法访问此文件

    打开 Windows 资源监视器:按下 Win+R 快捷键打开"运行"对话框,输入 resmon 命令并按下回车键.在资源监视器中,选择"CPU"选项卡,然后在 ...

  10. 远程服务器(腾讯云轻量服务器)上安装SQL Server以及SQL Server Management Studio,以及EFCore对其的连接

    SQL Server的安装 下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 安装教程参考:https://bl ...