现在的位置: 首页 > 综合 > 正文

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

2013年12月12日 ⁄ 综合 ⁄ 共 2495字 ⁄ 字号 评论关闭

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

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

架构图如下:

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的空间!

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

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

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


不过好像丢了些数据??


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

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

抱歉!评论已关闭.