简单副本集测试

这一节主要对上一节搭建的副本集做一些简单的测试。

我们首先进入primary节点(37017),并向test.test集合里插入10W条数据:

.    rs0:PRIMARY> for(var i=;i<;i++){
. db.test.insert({"name":"zhanjindong"+i,"age":})
. }

等数据插入完毕我们登入到两个secondary节点,发现数据已经同步过来了:

./bin/mongo -port
. rs0:SECONDARY> db.getMongo().setSlaveOk();
. rs0:SECONDARY> db.test.count()
.

注意:在secondary节点上执行操作之前需要执行db.getMongo().setSlaveOk()命令,该设置允许连接从非master端读取数据。

secondary节点宕机:

模拟副本集中一个secondary节点宕机的情况,直接kill -9掉37018这个节点:

.    kill - 

然后再登录之前primary节点,再插入1W条数据:

.    rs0:PRIMARY> for(var i=;i<;i++){
. db.test.insert({"name":"zhanjindong"+i,"age":})
. }

然后再将37018这个节点启起来,过一会就发现宕机的节点数据已经同步过来了:

.    rs0:SECONDARY> db.getMongo().setSlaveOk()
. rs0:SECONDARY> db.test.count()
.

primary节点宕机:

再模拟primary节点宕机的情况:kill -9掉37017端口,这时查看监控页面:http://192.168.129.129:38018/_replSet/

可以看到37018已经成了primary节点。主界面宕机导致了整个集群发生一次election,实现了failover。等37017恢复了会自动成为secondary节点:

所有secondary节点宕机

当所有secondary宕机,或者副本集中只剩下一台机器的时候,那么剩下的机器只能成为secondary节点,也就意味着整个集群智能进行读操作而不能进行写操作:

当集群从故障中恢复过来后,仍然的primary节点仍然是primary节点。

注意:当某个节点宕机后重新启动该节点会有一段的时间(时间长短视集群的数据量和宕机时间而定)导致整个集群中所有节点都成为secondary而无法进行写操作(如果应用程序没有设置相应的ReadReference也可能不能进行读取操作)。

因此官方推荐的最小的副本集也应该具备一个primary节点和两个secondary节点。两个节点的副本集不具备真正的故障转移能力。

应用程序访问副本集

副本集搭建好了,基本的故障转移能力也验证过了,那么应用程序如何访问呢?下面分别介绍下C#和Java驱动如何访问mongodb副本集。

C#:

C#驱动下载地址http://driver-downloads.mongodb.org/dotnet/index.html,我使用的最新版本1.8.2。

下面是访问副本集基本的代码:

MongoClientSettings set = new MongoClientSettings();
List<MongoServerAddress> servers = new List<MongoServerAddress>();
servers.Add(new MongoServerAddress("192.168.129.129", ));
servers.Add(new MongoServerAddress("192.168.129.129", ));
servers.Add(new MongoServerAddress("192.168.129.129", ));
set.Servers = servers; //设置副本集名称
set.ReplicaSetName = "rs0";
//设置超时时间为3秒
set.ConnectTimeout = new TimeSpan(, , , , ); MongoClient client = new MongoClient(set);
MongoServer server = client.GetServer();
MongoDatabase db = server.GetDatabase("test");
MongoCollection coll = db.GetCollection("test"); //插入
BsonDocument bd = new BsonDocument();
bd.Add("name", "zhanjindong");
bd.Add("age", );
bd.Add("sex", "男D"); coll.Insert(bd); //读取
QueryDocument qd = new QueryDocument();
qd.Add("name", "zhanjindong");
qd.Add("age", );
qd.Add("sex", "男D"); BsonDocument rd = coll.FindOneAs<BsonDocument>(qd); Console.WriteLine(rd.ToString());

当kill掉一个节点(secondary或primary)的时候,读取和写入的操作都是正常的,说明副本集的failover起作用了。但kill模拟两个节点宕机的时候,发现上面的代码在读取的时候会报下面的错误:

这是因为默认的C#驱动的ReadPreference是Primary,也就是说读写操作都是在主节点上的,那么当集群中只剩下一个节点的时候,按照前面所说该节点一定是secondary节点,这样读取操作也是没法进行的(通过mongo shell当然是可以的)。解决方法就是设置驱动的ReadPreferenceMode:

set.ReadPreference = new ReadPreference(ReadPreferenceMode.PrimaryPreferred);

将ReadPreferenceMode设置成Secondary或SecondaryPreferred。后面读写分离一节对ReadPreference会有详细的说明。

Java:

Java驱动下载地址:http://central.maven.org/maven2/org/mongodb/mongo-java-driver/

我用的是最新版本mongo-java-driver-2.11.2.jar。

下面是Java访问MongoDB副本集的基本代码:

List<ServerAddress> addresses = new ArrayList<ServerAddress>();
ServerAddress address1 = new ServerAddress("192.168.129.129", 37017);
ServerAddress address2 = new ServerAddress("192.168.129.129", 37018);
ServerAddress address3 = new ServerAddress("192.168.129.129", 37018);
addresses.add(address1);
addresses.add(address2);
addresses.add(address3); MongoClient client = new MongoClient(addresses);
DB db = client.getDB("test");
DBCollection coll = db.getCollection("test"); // 插入
BasicDBObject object = new BasicDBObject();
object.append("name", "zhanjindong");
object.append("age", 23);
object.append("sex", "男"); coll.insert(object); BasicDBObject qobj = new BasicDBObject();
qobj.append("name", "zhanjindong");
qobj.append("age", 23);
qobj.append("sex", "男"); DBObject robj = coll.findOne(qobj); System.out.println(robj.toString());

和C#一样如果想从secondary节点进行读取操作也是需要设置ReadPreference:

ReadPreference preference = ReadPreference.secondary();
DBObject robj = coll.findOne(qobj, qobj, preference);

不同的是Java驱动发现副本集中某个成员连接不了会发出警告信息:

而且发现如果读取不到的话Java驱动会进行不停的重试。

:设置驱动的ReadReference也可以通过MongoDB连接字符串配置:mongodb://example1.com,example2.com,example3.com/?readPreference=secondary。通过连接字符串指定的read preference是针对整个连接。

MongoDB副本集学习(二):基本测试与应用的更多相关文章

  1. MongoDB副本集学习(一):概述和环境搭建

    MongoDB副本集概述 以下图片摘自MongoDB官方文档:http://docs.mongodb.org/manual/core/replication-introduction/ Primary ...

  2. [ MongoDB ] 副本集的搭建及测试

    Replica Sets  复制 (副本集) node1: 10.0.0.10node2: 10.0.0.11node3: 10.0.0.12 副本集结构图:

  3. MongoDB 副本集丢失数据的测试

    在MongoDB副本集的测试中发现了一个丢数据的案例. 1. 概要描述 测试场景为:一主一从一验证 测试案例 step1 :关闭从副本: step 2 :向主副本中插入那条数据: step 3 :关闭 ...

  4. MongoDB副本集学习(三):性能和优化相关

    Read Preferences/读写分离 有时候为了考虑应用程序的性能或响应性,为了提高读取操作的吞吐率,一个常见的措施就是进行读写分离,MongoDB副本集对读写分离的支持是通过Read Pref ...

  5. Mongodb 副本集 数据同步简单测试

    副本集的搭建,请见  CENTOS6.5 虚拟机MONGODB创建副本集 接下来将简单说明下副本集之间的数据同步. 1.首先,进入primary节点 MOGO_PATH/bin/mongo  -por ...

  6. java程序连接MongoDB副本集测试

    三个节点有一个节点挂掉也不会影响应用程序客户端对整个副本集的读写! public class TestMongoDBReplSet { public static void main(String[] ...

  7. NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署

    NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MongoDB 是一个基于分布式文件存储的数据库.由 C ...

  8. MongoDB 副本集的原理、搭建、应用

    概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...

  9. MongoDB副本集搭建及备份恢复

    一.MongoDB副本集(repl set)介绍 早起版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主: 目前已经淘汰了ma ...

随机推荐

  1. Shell编程中Shift的用法

    Shell编程中Shift的用法 位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shif ...

  2. Spring与jsp表达式的产生的问题

    今天遇到一个问题就是Spring标签与jsp表达式的问题 直接上代码 <form:form commandName="book" action="/book_upd ...

  3. 洛谷P1661 扩散

    题目描述 一个点每过一个单位时间就会向四个方向扩散一个距离,如图. 两个点a.b连通,记作e(a,b),当且仅当a.b的扩散区域有公共部分.连通块的定义是块内的任意两个点u.v都必定存在路径e(u,a ...

  4. jquery ajax提交表单数据的两种方式

    http://www.kwstu.com/ArticleView/kwstu_201331316441313 貌似AJAX越来越火了,作为一个WEB程序开发者要是不会这个感觉就要落伍,甚至有可能在求职 ...

  5. js中日历的代码

    Html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  6. Facebook内部高效工作PPT指南

    Facebook内部高效工作PPT指南 Facebook 内部分享:不论你如何富有,你都赚不到更多的时间,你也回不到过去.没有那么多的假如,只有指针滴答的时光飞逝和你应该好好把握的现在,以下25张PP ...

  7. js实现鼠标点击input框后里面的内容就消失代码

    <!--# <a href="http://www.mianfeimoban.com/texiao_mb/" target="_blank" cla ...

  8. C语言绘制余弦函数图象

    #include"stdio.h" #include"math.h" void main() { double y; int x,m; for(y=1;y> ...

  9. thinkphp 3.23 第三方登录sdk集成包

    本集成包在官方包上扩展了支付宝登录和微信,支持最新的3.23版本 config    /* URL配置 */     'URL_CASE_INSENSITIVE' => true, //默认fa ...

  10. angular问题总结与反思

    因为工作中实际开发需要,才开始接触angular框架.从当初的比葫芦画瓢,被各种问题.概念折磨摧残,到现在有一定的了解认识,觉得有必要将自己的认识进行简单的总结.不到位的地方还望多多包涵. 1.双向数 ...