mongoDB研究笔记:写关注
对于某些应用程序来说,写关注是重要的。它能判断哪些写操作成功写入了,哪些失败了,对于失败的操作,驱动程序能返回错误,由应用程序决定怎么处理。如果没有写关注,应用程序发送一个写操作到socket后,就不会管后面发送了什么情况,不知道是否成功写入数据库,这种情形对于日志类型的应用程序还是可以接受的,因为偶尔的写失败不会影响整个日志的监控情况;带有写关注的操作会等到数据库确认成功写入后才能返回,因此写关注会带来一点性能的损失。下面先分析复制集上写关注配置。
默认情况下复制集的写关注只针对primary节点,当应用程序发送一个写操作请求时,驱动程序会调用getLastError命令返回写操作的执行情况(这一动作对应用程序来说是透明的),getLastError命令会根据你配置的写关注选项来执行。写关注选项的配置是针对当前客户端与数据库的socket连接来说的,因此配置项需要通过应用程序传递给驱动程序。当然如果你没有传递任何选项参数给驱动程序,getLastError命令会根据你配置在复制集中默认配置local.system.replset.settings.getLastErrorDefaults来执行。getLastError命令的常用选项如下:
(1) 选项w
当取值为-1时,驱动程序不会使用写关注,忽略掉所有的网络或socket错误。
当取值为0时,驱动程序不会使用写关注,只返回网络和socket的错误。
当取值为1时,驱动程序使用写关注,但是只针对primary节点,这个配置项是复制集或单mongod实例的默认写关注配置。
当取值为整数且大于1时,写关注将针对复制集中n个节点,当客户端收到这些节点的反馈信息后,命令才返回给客户端继续执行。
(2)选项wtimeout
指定写关注应在多长时间内返回,如果你没有指定这个值,复制集可能因为不确定因素导致应用程序的写操作一直阻塞。
下面通过一段代码对上面的描述做个回顾,在C#驱动程序下连接复制集并插入一条记录。
//实例化一个客户端的连接属性实例
MongoClientSettings clientSetting = new MongoClientSettings();
//设置属性准备Servers为要连接的复制集中的所有成员实例
List<MongoServerAddress> Servers = new List<MongoServerAddress>();
Servers.Add(new MongoServerAddress("Guo",40000));
Servers.Add(new MongoServerAddress("Guo",40001));
Servers.Add(new MongoServerAddress("Guo",40002));
clientSetting.Servers = Servers;
clientSetting.ReplicaSetName = "rs0"; //设置属性复制集的名称
MongoClient client = new MongoClient(clientSetting);//根据设置的属性,实例化客户端
//得到一个与复制集连接的实例
MongoServer server = client.GetServer();
//获得一个与具体数据库连接对象,数据库名为students
MongoDatabase mydb = server.GetDatabase("students");
//获得数据库中的表对象,即scores表
MongoCollection mydbTable = mydb.GetCollection("scores");
//准备一条数据,即声明一个文档对象
BsonDocument doc = new BsonDocument
{
{"stuid",5},
{"subject","sports"},
{"score",99}
};
//将文档插入到数据库中
mydbTable.Insert(doc);
上面代码向复制集中插入一条数据,但是客户端的配置属性都是默认的,写关注w选项值为1,可以在C#的驱动程序中通过MongoClientSettings这个类来设置客户端的连接属性,包括写关注等;上面的代码也没有具体指定连接到哪个节点,但驱动程序会默认的选择primary节点;当primary节点宕机时,复制集重新选择出新的primary节点,驱动程序尝试重新连接新的primary节点并完成插入,这个动作对应用程序透明的。
mongoDB研究笔记:写关注的更多相关文章
- MongoDB 默认写入关注保存数据丢失问题与源码简单分析
MongoDB 默认写入关注可能保存数据丢失问题分析 问题描述: EDI服务进行优化,将原有MQ发送成功并且DB写入成功,两个条件都达成,响应接收订单数据成功,修改为只有有一个条件成功就响应接收数据成 ...
- mongoDB研究笔记:复制集概述
自我学习,仅供参考: 数据库总是会遇到各种失败的场景,如网络连接断开.断电等,尽管journaling日志功能也提供了数据恢复的功能,但journaling通常是针对单个节点来说的,只能保证单节点数据 ...
- mongoDB研究笔记:分片集群部署
前面几篇文章的分析复制集解决了数据库的备份与自动故障转移,但是围绕数据库的业务中当前还有两个方面的问题变得越来越重要.一是海量数据如何存储?二是如何高效的读写海量数据?尽管复制集也可以实现读写分析,如 ...
- mongoDB研究笔记:复制集故障转移机制
上面的介绍的数据同步(http://www.cnblogs.com/guoyuanwei/p/3293668.html)相当于传统数据库中的备份策略,mongoDB在此基础还有自动故障转移的功能.在复 ...
- mongoDB研究笔记:复制集数据同步机制
http://www.cnblogs.com/guoyuanwei/p/3279572.html 概述了复制集,整体上对复制集有了个概念,但是复制集最重要的功能之一数据同步是如何实现的?带着这个问题 ...
- mongoDB研究笔记:journaling保证意外故障下的数据完整性
mongoDB的Journaling日志功能与常见的log日志是不一样的,mongoDB也有log日志,它只是简单记录了数据库在服务器上的启动信息.慢查询记录.数据库异常信息.客户端与数据库服务器连接 ...
- MongoDB之 写安全(Write Concern)
MongoDB Write Concern,简称MongoDB写入安全机制,是一种客户端设置,用于控制写入安全的级别.Write Concern 描述了MongoDB写入到mongod单实例,副本集, ...
- mongoDB研究笔记:分片集群的工作机制
上面的(http://www.cnblogs.com/guoyuanwei/p/3565088.html)介绍了部署了一个默认的分片集群,对mongoDB的分片集群有了大概的认识,到目前为止我们还没有 ...
- MongoDB4和MysSQL5.7的读/写和事务处理速度简单对比
系统环境: Ubuntu 18.04 数据库 MysSQL5.7/MongoDB4.0 插入的数据为随机生产,不重复. MySQL使用的连接库是 sqlalchemyMongoDB使用的连接库是pym ...
随机推荐
- sql server 执行计划(execution plan)介绍
大纲:目的介绍sql server 中执行计划的大致使用,当遇到查询性能瓶颈时,可以发挥用处,而且带有比较详细的学习文档和计划,阅读者可以按照我计划进行,从而达到对执行计划一个比较系统的学习. 什么是 ...
- 黑科技项目:英雄无敌III Mod <<Fallen Angel>>介绍
英雄无敌三简介(Heroes of Might and Magic III) 英3是1999年由New World Computing在Windows平台上开发的回合制策略魔幻游戏,其出版商是3DO. ...
- Sql Server 分区之后增加新的分区
随着时间的推移,你可能会希望为已分区的表添加额外的分区(例如,可以为每一个新年创建一个新的分区).要增加一个新的分区,可以使用ALTER PARTITION SCHEME和ALTER PARTITIO ...
- 在linux中添加ftp用户,并设置相应的权限
在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...
- Step by Step 配置使用HTTPS的ASP.NET Web应用[转载]
原创地址:http://www.cnblogs.com/jfzhu/p/4064654.html 转载请注明出处 有关HTTPS.SSL以及SSL证书的工作原理,参见 <HTTPS那些事(一)H ...
- 快快快!27个提升效率的iOS开源库推荐
文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...
- Linux添加/删除用户和用户组
声明:现大部分文章为寻找问题时在网上相互转载,在此博客中做个记录,方便自己也方便有类似问题的朋友,故原出处已不好查到,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 本文总结了Li ...
- 使用Sublime Text3开发AngularJs
之前的Sublime环境安装插件弄得有点乱,卸载了重新安装: 1. 安装sublime: https://www.sublimetext.com/3 2. 注册: —– BEGIN LICENSE — ...
- Centos 基础开发环境搭建之Maven私服nexus
hmaster 安装nexus及启动方式 /usr/local/nexus-2.6.3-01/bin ./nexus status Centos 基础开发环境搭建之Maven私服nexus . 软件 ...
- MyBatis-NET
http://www.codeproject.com/Articles/894127/MyBatis-NET https://mybatis.github.io/mybatis-3/