博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB副本集学习(二):基本测试与应用
阅读量:6329 次
发布时间:2019-06-22

本文共 3989 字,大约阅读时间需要 13 分钟。

简单副本集测试

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

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

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

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

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

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

secondary节点宕机:

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

1.    kill -9 9508

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

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

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

1.    rs0:SECONDARY> db.getMongo().setSlaveOk()2.    rs0:SECONDARY> db.test.count()3.    110000

 

primary节点宕机:

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

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

 

所有secondary节点宕机

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

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

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

 

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

 

应用程序访问副本集

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

C#:

C#驱动下载地址,我使用的最新版本1.8.2。

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

MongoClientSettings set = new MongoClientSettings();List
servers = new List
();servers.Add(new MongoServerAddress("192.168.129.129", 37017));servers.Add(new MongoServerAddress("192.168.129.129", 37018));servers.Add(new MongoServerAddress("192.168.129.129", 37019));set.Servers = servers;//设置副本集名称set.ReplicaSetName = "rs0";//设置超时时间为3秒set.ConnectTimeout = new TimeSpan(0, 0, 0, 3, 0);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", 23);bd.Add("sex", "男D");coll.Insert(bd);//读取QueryDocument qd = new QueryDocument();qd.Add("name", "zhanjindong");qd.Add("age", 23);qd.Add("sex", "男D");BsonDocument rd = coll.FindOneAs
(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驱动下载地址:

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

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

List
addresses = new ArrayList
();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是针对整个连接。

 

转载地址:http://hwfoa.baihongyu.com/

你可能感兴趣的文章
Wrod中超链接的一些技巧
查看>>
我的友情链接
查看>>
IP_VFR-4-FRAG_TABLE_OVERFLOW【cisco设备报错】碎片***
查看>>
Codeforces Round #256 (Div. 2) D. Multiplication Table 【二分】
查看>>
ARM汇编指令格式
查看>>
HDU-2044-一只小蜜蜂
查看>>
HDU-1394-Minimum Inversion Number
查看>>
df -h 卡住
查看>>
第七天1
查看>>
[转] createObjectURL方法 实现本地图片预览
查看>>
Jquery中的Jquery.extend, Jquery.fn.extend,Jquery.prototype
查看>>
JavaScript—DOM编程核心.
查看>>
JavaScript碎片
查看>>
Bootstrap-下拉菜单
查看>>
soapUi 接口测试
查看>>
【c学习-12】
查看>>
工作中MySql的了解到的小技巧
查看>>
loadrunner-2-12日志解析
查看>>
2013年蓝桥杯省赛C/C++A组真题解析
查看>>
C# Memcached缓存
查看>>