用Mongos代替驱动来增加副本集的故障切换能力

用Mongos代替驱动来增加副本集的故障切换能力

现在发觉mongodb的java驱动好像不太会利用Replication Sets的Failover的能力,因为驱动绑定了一个端口后,rs的主节点down了之后驱动不会知道新的主结点....

现在只想利用mongos的路由功能!路由能很好地利用Relication Sets的Failover的能力...然后驱动绑定路由端口就行了

架构图如下:
用Mongos代替驱动来增加副本集的故障切换能力_第1张图片


1:搭建2个Standard节点+1个Arbiter节点的Replication Sets


mkdir -p /data/mixreplset/r0
mkdir -p /data/mixreplset/r1
mkdir -p /data/mixreplset/r2
mkdir -p /data/mixreplset/log


/Apps/mongo/bin/mongod --dbpath=/data/mixreplset/r0 --replSet   replset1 --port 28010 --directoryperdb --rest

/Apps/mongo/bin/mongod --dbpath=/data/mixreplset/r1 --replSet   replset1 --port 28011 --directoryperdb --rest

/Apps/mongo/bin/mongod --dbpath=/data/mixreplset/r2 --replSet   replset1 --port 28012 --directoryperdb --rest


(--directoryperdb那你每个库的文件会单独放在一个文件夹里)



初始化复本集:

/Apps/mongo/bin/mongo --port 28010

config_replset1 = {
_id:"replset1",
members:
[
{_id:0,host:"127.0.0.1:28010",priority:4},
{_id:1,host:"127.0.0.1:28011",priority:2},
{_id:2,host:"127.0.0.1:28012",arbiterOnly : true}
]
}

注意arbiter仲裁节点只投票,不接收复制的数据!



rs.initiate(config_replset1);



配置SECONDARY的slaveOk,使其读
/Apps/mongo/bin/mongo --port 28011

rs.slaveOk()


--------------------------------------------------------------------------------


2,启动Config Server, Config Server : 40000

mkdir -p /data/mixreplset/shard/config

/Apps/mongo/bin/mongod --dbpath /data/mixreplset/shard/config --configsvr --port 40000 --directoryperdb --rest


--------------------------------------------------------------------------------


3,启动Route Process,Route Process : 50000

/Apps/mongo/bin/mongos --port 50000 --configdb 127.0.0.1:40000 --chunkSize 1 

--chunkSize 1 (MB)指定分片的最小单位容量,这里设置1M,方便查看效果 



--------------------------------------------------------------------------------

4,连接到mongos配置Sharding

用Mongo Shell 登录 Route Process

/Apps/mongo/bin/mongo --port 50000

use admin (记得执行这一点,切换到admin数据库)

//添加分片节点,将副本集作为一个节点添加

注意添加副本集作为一个分片时,格式有点不同!

mongos> db.runCommand({addshard:"replset1/127.0.0.1:28010,127.0.0.1:28011,127.0.0.1:28012",allowLocal:true})

(allowLocal:true仅仅开发时才将分片配置到本地)


--------------------------------------------------------------------------------

5,故障切换能力测试

use mydb

db.users.insert({name:"jack",age:0,addr:"guangzhou",country:"China"})

db.users.remove()

先插入1条数据,再删除了它,然后看到数据库mydb在mongos里配置起来了,默认是不分片的,位置replset1上,这正合我意!
上述操作也会使副本集的各节点预分配mydb的空间!

用Mongos代替驱动来增加副本集的故障切换能力_第2张图片


测试插入60万条数据
for(var i=1; i<=1000000; i++) db.users.insert({name:"jack",age:i,addr:"guangzhou",country:"China"})


然后插入到30万条时停止28010(Primary)的进程

用Mongos代替驱动来增加副本集的故障切换能力_第3张图片


然后replset1马上切换到28011,哇,切换时不会中断当前的数据插入操作!太牛了..这个比由驱动来控制的故障切换强得多!

用Mongos代替驱动来增加副本集的故障切换能力_第4张图片

用Mongos代替驱动来增加副本集的故障切换能力_第5张图片
不过好像丢了些数据??

用Mongos代替驱动来增加副本集的故障切换能力_第6张图片





结论: 故障切换可能会丢些数据!

    Mongos对Replica Set的故障切换支持不错,但当Replica Set在插入操作或修改频繁的情况下发生故障切换,此时很可能会丢些数据!
进行了3次实验,一次丢了7027条数据,一次丢了5334条,另一次丢了3654..不过上述是发生在连续插入小文档的情况下的,算是极端的情况,生产环境中应该会好一些!

你可能感兴趣的:(mongodb,数据库,shell,server,测试,sharding)