MongoDB(AutoSharding+Replication sets 稳定性测试 )

MongoDB(AutoSharding+Replication sets 稳定性测试 )

转自:http://blog.csdn.net/crazyjixiang/article/details/6636671

单Replication sets设计:


如图所示,10.9.3.228只启动Mongos和config两个服务

  1. ^_^[root@:/usr/local/mongodb/bin]#cat runServerConfig.sh   
  2. ./mongod --configsvr --dbpath=../data/config --logpath=../data/config.log --fork   
  3. ^_^[root@:/usr/local/mongodb/bin]#cat runServerMongos.sh   
  4. ./mongos --configdb 10.7.3.228:27019 --logpath=../data/mongos.log --logappend --fork  

注意:Mongos里面的ip和端口是config服务的ip和端口

先进性配置AutoSharding

163的shardv已经启动了,只要启动下165服务器的autoSharding服务

  1. [root@localhost bin]# cat runServerShard.sh   
  2. ./mongod --shardsvr -dbpath=../data/mongodb --logpath=../data/shardsvr_logs.txt --fork  

配置163和164的Replication

  1. [root@localhost bin]# ./mongo 10.10.21.163:27018  
  2. MongoDB shell version: 1.8.2  
  3. connecting to: 10.10.21.163:27018/test  
  4. > cfg={_id:"set163164",members:[                              
  5. ... {_id:0,host:"10.10.21.163:27018"},  
  6. ... {_id:1,host:"10.10.21.164:27017"}  
  7. ... ]}  
  8. {  
  9.         "_id" : "set163164",  
  10.         "members" : [  
  11.                 {  
  12.                         "_id" : 0,  
  13.                         "host" : "10.10.21.163:27018"  
  14.                 },  
  15.                 {  
  16.                         "_id" : 1,  
  17.                         "host" : "10.10.21.164:27017"  
  18.                 }  
  19.         ]  
  20. }  
  21. > rs.initiate(cfg)  
  22. {  
  23.         "info" : "Config now saved locally.  Should come online in about a minute.",  
  24.         "ok" : 1  
  25. }  
  26. > rs.conf()  
  27. {  
  28.         "_id" : "set163164",  
  29.         "version" : 1,  
  30.         "members" : [  
  31.                 {  
  32.                         "_id" : 0,  
  33.                         "host" : "10.10.21.163:27018"  
  34.                 },  
  35.                 {  
  36.                         "_id" : 1,  
  37.                         "host" : "10.10.21.164:27017"  
  38.                 }  
  39.         ]  
  40. }  
  41. set163164:PRIMARY>   
  42. set163164:PRIMARY>   
  43. set163164:PRIMARY> show dbs  
  44. admin   (empty)  
  45. local   14.1962890625GB  
  46. set163164:PRIMARY> use local  
  47. switched to db local  
  48. set163164:PRIMARY> show collections  
  49. oplog.rs  
  50. system.replset  
  51. set163164:PRIMARY> db.system.replset.find()  
  52. "_id" : "set163164""version" : 1, "members" : [  
  53.         {  
  54.                 "_id" : 0,  
  55.                 "host" : "10.10.21.163:27018"  
  56.         },  
  57.         {  
  58.                 "_id" : 1,  
  59.                 "host" : "10.10.21.164:27017"  
  60.         }  
  61. ] }  
  62. set163164:PRIMARY> rs.isMaster()  
  63. {  
  64.         "setName" : "set163164",  
  65.         "ismaster" : true,  
  66.         "secondary" : false,  
  67.         "hosts" : [  
  68.                 "10.10.21.163:27018",  
  69.                 "10.10.21.164:27017"  
  70.         ],  
  71.         "maxBsonObjectSize" : 16777216,  
  72.         "ok" : 1  
  73. }  

至此Replication sets配置成功!


再在228服务器上进行相应Sharding配置

use admin

  1. > db.runCommand({addshard:"set163164/10.10.21.163:27018,10.10.21.165:27018"});   
  2. "shardAdded" : "set163164""ok" : 1 }  
  3. > db.runCommand({enableSharding:"test"})    
  4. "ok" : 1 }  
  1. > db.runCommand({shardcollection:"test.users",key:{_id:1}})    
  2. "collectionsharded" : "test.users""ok" : 1 }  

然后分别在163和164服务器上启动rep服务,163要单独启动shard服务

163:

  1. [root@localhost bin]# cat runServerShard.sh   
  2. ./mongod --shardsvr --dbpath=../data/mongodb --logpath=../data/shardsvr_logs.txt --fork --replSet set163164  


164:
  1. [root@localhost bin]# cat runServerShard.sh   
  2. ./mongod --dbpath=../data --logpath=../data/shardsvr_logs.txt --fork --replSet set163164   

至此AutoSharding+Rep配置成功。然后进行测试稳定性阶段。

先看下结果:



可以看到,总共插入2000W条数据,163和164相同大小 165属于分片 数据。

我现在进行稳定性测试:

断掉163服务器。

Mongos那再相应进行查询:

  1. > db.users.find()  
  2. error: { "$err" : "error querying server: 10.10.21.163:27018""code" : 13633 }  
  3. > db.users.find()  
  4. error: {  
  5.         "$err" : "DBClientBase::findOne: transport error: 10.10.21.163:27018 query: { setShardVersion: \"test.users\", configdb: \"10.7.3.228:27019\", version: Timestamp 11000|1, serverID: ObjectId('4e2f64af98dd90fed26585a4'), shard: \"shard0000\", shardHost: \"10.10.21.163:27018\" }",  
  6.         "code" : 10276  
  7. }  
  8. > db.users.find()                                                                             
  9. error: { "$err" : "socket exception""code" : 11002 }  
直接出现错误!

再进行手动添加164服务器!

  1. > db.runCommand({addshard:"10.10.21.164:27017"});   
  2. {  
  3.         "ok" : 0,  
  4.         "errmsg" : "host is part of set: set163164 use replica set url format <setname>/<server1>,<server2>,...."  
  5. }  

还是出错!

可见这样配置是有问题的!

经过一段时间的思考和反复测试,发现是否是投票上除了问题

看到官网上有这样一段话:

Consensus Vote

For a node to be elected primary, it must receive a majority of votes. This is a majority of all votes in the set: if you have a 5-member set and 4 members are down, a majority of the set is still 3 members (floor(5/2)+1). Each member of the set receives a single vote and knows the total number of available votes.

If no node can reach a majority, then no primary can be elected and no data can be written to that replica set (although reads to secondaries are still possible).

那么2台Server投票是否会出现问题,那再加一台如何?


这边也可以 把164作为 arbiter来 :

  1. use admin  
  2. var cfg={_id:"set162163164", members:[{_id:0,host:"10.10.21.162:27018"}, {_id:1,host:"10.10.21.163:27017"}, {_id:2,host:"10.10.21.164:27017",arbiterOnly:true} ]}  
  3. rs.initiate(cfg)  
  4. rs.conf()  

228:

  1. use admin  
  2. #db.runCommand({addshard:"set162163164/10.10.21.162:27018,10.10.21.163:27017,10.10.21.164:27017"})       #正常添加3台  
  3. db.runCommand({addshard:"set162163164/10.10.21.162:27018,10.10.21.163:27017"})       #arbiter  
  4. db.runCommand({addshard:"10.10.21.165:27018"})   
  5. db.runCommand({enableSharding:"test"})   
  6. db.runCommand({shardcollection:"test.users",key:{_id:1}})  

经过试验:

稳定性已经提高,断掉162,163,164任意一台Server ,Mongos都能自动reconnect中其中的vote的一个成员primary.

最终设计图:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值