用Mongos代替驱动来增加副本集的故障切换能力
现在发觉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..不过上述是发生在连续插入小文档的情况下的,算是极端的情况,生产环境中应该会好一些!