注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

曾国藩的博客

 
 
 

日志

 
 

MongoDB高可用架构—Replica Set 集群实战 2  

2014-03-09 12:17:11|  分类: SQL/Oracle/Mysql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://www.linuxidc.com/Linux/2012-07/64491p2.htm

四、配置三台config server
 
分别在各服务器上运行(启动都一样):
/opt/mongodb/bin/mongod --configsvr --dbpath /data0/mongodb/db/config --port 20000 --logpath /data0/mongodb/logs/config.log --logappend --fork --directoryperdb
 
用脚本形式:
  1. [root@mongo01 sh]# cat config.sh  
  2. /opt/mongodb/bin/mongod --configsvr --dbpath /data0/mongodb/db/config --port 20000 --logpath /data0/mongodb/logs/config.log --logappend --fork --directoryperdb 
  3. [root@mongo01 sh]# pwd 
  4. /opt/mongodb/sh 
  5. [root@mongo01 sh]# ./config.sh 
 
然后在各节点查看有没有启动起来:
  1. [root@mongo01 sh]# ps aux |grep mong 
  2. root     25343  0.9  6.8 737596 20036 ?        Sl   19:32   0:12 /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard1 -oplogSize 100 -logpath /data0/mongodb/logs/shard1.log -logappend --maxConns 10000 --quiet -fork --directoryperdb 
  3. root     25351  0.9  7.0 737624 20760 ?        Sl   19:32   0:11 /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard2 -oplogSize 100 -logpath /data0/mongodb/logs/shard2.log -logappend --maxConns 10000 --quiet -fork --directoryperdb 
  4. root     25669 13.0  4.7 118768 13852 ?        Sl   19:52   0:07 /opt/mongodb/bin/mongod --configsvr --dbpath /data0/mongodb/db/config --port 20000 --logpath /data0/mongodb/logs/config.log --logappend --fork --directoryperdb 
  5. root     25695  0.0  0.2  61220   744 pts/3    R+   19:53   0:00 grep mong 
  
五、配置mongs(启动路由)
 
分别在206、207服务器上运行(也可以在所有节点上启动):
/opt/mongodb/bin/mongos -configdb 192.168.8.30:20000,192.168.8.31:20000,192.168.8.32:20000 -port 30000 -chunkSize 50 -logpath /data0/mongodb/logs/mongos.log -logappend -fork
 
用脚本形式: 
  1. [root@mongo01 sh]# cat mongos.sh  
  2. /opt/mongodb/bin/mongos -configdb 192.168.8.30:20000,192.168.8.31:20000,192.168.8.32:20000 -port 30000 -chunkSize 50 -logpath /data0/mongodb/logs/mongos.log -logappend -fork 
  3. [root@mongo01 sh]# pwd 
  4. /opt/mongodb/sh 
  5. [root@mongo01 sh]# ./mongos.sh  
  6. [root@mongo01 sh]# ps aux |grep mong 
  7. root     25343  0.8  6.8 737596 20040 ?        Sl   19:32   0:13 /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard1 -oplogSize 100 -logpath /data0/mongodb/logs/shard1.log -logappend --maxConns 10000 --quiet -fork --directoryperdb 
  8. root     25351  0.9  7.0 737624 20768 ?        Sl   19:32   0:16 /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard2 -oplogSize 100 -logpath /data0/mongodb/logs/shard2.log -logappend --maxConns 10000 --quiet -fork --directoryperdb 
  9. root     25669  2.0  8.0 321852 23744 ?        Sl   19:52   0:09 /opt/mongodb/bin/mongod --configsvr --dbpath /data0/mongodb/db/config --port 20000 --logpath /data0/mongodb/logs/config.log --logappend --fork --directoryperdb 
  10. root     25863  0.5  0.8  90760  2388 ?        Sl   20:00   0:00 /opt/mongodb/bin/mongos -configdb 192.168.8.30:20000,192.168.8.31:20000,192.168.8.32:20000 -port 30000 -chunkSize 50 -logpath /data0/mongodb/logs/mongos.log -logappend -fork 
  11. root     25896  0.0  0.2  61220   732 pts/3    D+   20:00   0:00 grep mong 
 
注意:
1). mongos里面的ip和端口是config服务的ip和端口:192.168.8.30:20000,192.168.8.31:20000,192.168.8.32:20000
2). 必须先启动config后(并且config启动正常后,有config的进程存在)再启动mongos
 
六、配置shard集群 
1.连接一台路由 
  1. [root@mongo01 sh]# mongo 192.168.8.30:30000/admin 
  2. MongoDB shell version: 2.0.5 
  3. connecting to: 192.168.8.30:30000/admin 
  4. mongos>  
2.加入shards 
  1. mongos> db.runCommand({ addshard : "shard1/192.168.8.30:27021,192.168.8.31:27021,192.168.8.32:27021",name:"shard1",maxSize:20480}) 
  2. "shardAdded" : "shard1""ok" : 1 } 
  3. mongos> db.runCommand({ addshard : "shard2/192.168.8.30:27022,192.168.8.31:27022,192.168.8.32:27022",name:"shard2",maxSize:20480}) 
  4. "shardAdded" : "shard2""ok" : 1 } 
PS:
分片操作必须在 admin 库下操作
如果只启动206和207服务器的路由!因此可不用把208服务器加进来!
可选参数说明:
Name:用于指定每个shard的名字,不指定的话系统将自动分配
maxSize:指定各个shard可使用的最大磁盘空间,单位 MegaBytes
 
3.列出加入的shards 
  1. mongos> db.runCommand( { listshards : 1 } ); 
  2.     "shards" : [ 
  3.         { 
  4.             "_id" : "shard1"
  5.             "host" : "shard1/192.168.8.30:27021,192.168.8.31:27021,192.168.8.32:27021"
  6.             "maxSize" : NumberLong(20480) 
  7.         }, 
  8.         { 
  9.             "_id" : "shard2"
  10.             "host" : "shard2/192.168.8.30:27022,192.168.8.31:27022,192.168.8.32:27022"
  11.             "maxSize" : NumberLong(20480) 
  12.         } 
  13.     ], 
  14.     "ok" : 1 

PS: 列出了以上二个我加的shards(shard1和shard2),表示shards已经配置成功!!
如果206那台机器挂了,其它两个节点中某个会成为主节点,mongos会自动连接到主节点!
  1. mongos> db.runCommand({ismaster:1}); 
  2.     "ismaster" : true
  3.     "msg" : "isdbgrid"
  4.     "maxBsonObjectSize" : 16777216, 
  5.     "ok" : 1 
  6. mongos> db.runCommand( { listshards : 1 } ); 
  7. "ok" : 0, "errmsg" : "access denied - use admin db" } 
  8. mongos> use admin 
  9. switched to db admin 
  10. mongos> db.runCommand( { listshards : 1 } ); 
  11.     "shards" : [ 
  12.         { 
  13.             "_id" : "s1"
  14.             "host" : "shard1/192.168.8.30:27021,192.168.8.31:27021" 
  15.         }, 
  16.         { 
  17.             "_id" : "s2"
  18.             "host" : "shard2/192.168.8.30:27022,192.168.8.31:27022" 
  19.         } 
  20.     ], 
  21.     "ok" : 1 
  22. mongos>  
 
七.添加分片
 
1.激活数据库分片
db.runCommand( { enablesharding : "<dbname>" } );
如:db.runCommand( { enablesharding : "" } );
 
插入测试数据:
  1. mongos> use nosql 
  2. switched to db nosql 
  3. mongos> for(var i=0;i<100;i++)db.fans.insert({uid:i,uname:'nosqlfans'+i}); 
激活数据库:
  1. mongos> use admin 
  2. switched to db admin 
  3. mongos> db.runCommand( { enablesharding : "nosql" } ); 
  4. "ok" : 1 } 

通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection 将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对 collection作些操作!
 
2.添加索引
必须加索引,不然不能对collections分片!
  1. mongos> use nosql 
  2. switched to db nosql 
  3. mongos> db.fans.find() 
  4. "_id" : ObjectId("4ff2ae6816df1d1b33bad081"), "uid" : 0, "uname" : "nosqlfans0" } 
  5. "_id" : ObjectId("4ff2ae6816df1d1b33bad082"), "uid" : 1, "uname" : "nosqlfans1" } 
  6. "_id" : ObjectId("4ff2ae6816df1d1b33bad083"), "uid" : 2, "uname" : "nosqlfans2" } 
  7. "_id" : ObjectId("4ff2ae6816df1d1b33bad084"), "uid" : 3, "uname" : "nosqlfans3" } 
  8. "_id" : ObjectId("4ff2ae6816df1d1b33bad085"), "uid" : 4, "uname" : "nosqlfans4" } 
  9. "_id" : ObjectId("4ff2ae6816df1d1b33bad086"), "uid" : 5, "uname" : "nosqlfans5" } 
  10. "_id" : ObjectId("4ff2ae6816df1d1b33bad087"), "uid" : 6, "uname" : "nosqlfans6" } 
  11. "_id" : ObjectId("4ff2ae6816df1d1b33bad088"), "uid" : 7, "uname" : "nosqlfans7" } 
  12. "_id" : ObjectId("4ff2ae6816df1d1b33bad089"), "uid" : 8, "uname" : "nosqlfans8" } 
  13. "_id" : ObjectId("4ff2ae6816df1d1b33bad08a"), "uid" : 9, "uname" : "nosqlfans9" } 
  14. "_id" : ObjectId("4ff2ae6816df1d1b33bad08b"), "uid" : 10, "uname" : "nosqlfans10" } 
  15. "_id" : ObjectId("4ff2ae6816df1d1b33bad08c"), "uid" : 11, "uname" : "nosqlfans11" } 
  16. "_id" : ObjectId("4ff2ae6816df1d1b33bad08d"), "uid" : 12, "uname" : "nosqlfans12" } 
  17. "_id" : ObjectId("4ff2ae6816df1d1b33bad08e"), "uid" : 13, "uname" : "nosqlfans13" } 
  18. "_id" : ObjectId("4ff2ae6816df1d1b33bad08f"), "uid" : 14, "uname" : "nosqlfans14" } 
  19. "_id" : ObjectId("4ff2ae6816df1d1b33bad090"), "uid" : 15, "uname" : "nosqlfans15" } 
  20. "_id" : ObjectId("4ff2ae6816df1d1b33bad091"), "uid" : 16, "uname" : "nosqlfans16" } 
  21. "_id" : ObjectId("4ff2ae6816df1d1b33bad092"), "uid" : 17, "uname" : "nosqlfans17" } 
  22. "_id" : ObjectId("4ff2ae6816df1d1b33bad093"), "uid" : 18, "uname" : "nosqlfans18" } 
  23. "_id" : ObjectId("4ff2ae6816df1d1b33bad094"), "uid" : 19, "uname" : "nosqlfans19" } 
  24. has more 
  25. mongos> db.fans.ensureIndex({"uid":1}) 
  26. mongos> db.fans.find({uid:10}).explain() 
  27.     "cursor" : "BtreeCursor uid_1"
  28.     "nscanned" : 1, 
  29.     "nscannedObjects" : 1, 
  30.     "n" : 1, 
  31.     "millis" : 25, 
  32.     "nYields" : 0, 
  33.     "nChunkSkips" : 0, 
  34.     "isMultiKey" : false
  35.     "indexOnly" : false
  36.     "indexBounds" : { 
  37.         "uid" : [ 
  38.             [ 
  39.                 10, 
  40.                 10 
  41.             ] 
  42.         ] 
  43.     } 
3.Collecton分片
要使单个collection也分片存储,需要给collection指定一个分片key,通过以下命令操作:
db.runCommand( { shardcollection : "",key : }); 
 
  1. mongos> use admin 
  2. switched to db admin 
  3. mongos> db.runCommand({shardcollection : "nosql.fans",key : {uid:1}}) 
  4. "collectionsharded" : "nosql.fans""ok" : 1 } 
PS: 
1). 操作必须切换到admin数据库下
2). 分片的collection系统要创建好索引
3). 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许
 
4.查看分片状态
 
  1. mongos> use nosql 
  2. mongos> db.fans.stats() 
  3.     "sharded" : true
  4.     "flags" : 1, 
  5.     "ns" : "nosql.fans"
  6.     "count" : 100, 
  7.     "numExtents" : 2, 
  8.     "size" : 5968, 
  9.     "storageSize" : 20480, 
  10.     "totalIndexSize" : 24528, 
  11.     "indexSizes" : { 
  12.         "_id_" : 8176, 
  13.         "uid0_1" : 8176, 
  14.         "uid_1" : 8176 
  15.     }, 
  16.     "avgObjSize" : 59.68, 
  17.     "nindexes" : 3, 
  18.     "nchunks" : 1, 
  19.     "shards" : { 
  20.         "shard1" : { 
  21.             "ns" : "nosql.test"
  22.             "count" : 100, 
  23.             "size" : 5968, 
  24.             "avgObjSize" : 59.68, 
  25.             "storageSize" : 20480, 
  26.             "numExtents" : 2, 
  27.             "nindexes" : 3, 
  28.             "lastExtentSize" : 16384, 
  29.             "paddingFactor" : 1, 
  30.             "flags" : 1, 
  31.             "totalIndexSize" : 24528, 
  32.             "indexSizes" : { 
  33.                 "_id_" : 8176, 
  34.                 "uid0_1" : 8176, 
  35.                 "uid_1" : 8176 
  36.             }, 
  37.             "ok" : 1 
  38.         } 
  39.     }, 
  40.     "ok" : 1 
  41. mongos> 
 些时分片没有发生变化!
再插入比较多的数据:
  1. mongos> use nosql 
  2. switched to db nosql 
  3. mongos> for(var i=200;i<200003;i++)db.fans.save({uid:i,uname:'nosqlfans'+i}); 
  4. mongos> db.fans.stats() 
  5.     "sharded" : true
  6.     "flags" : 1, 
  7.     "ns" : "nosql.fans"
  8.     "count" : 200002, 
  9.     "numExtents" : 12, 
  10.     "size" : 12760184, 
  11.     "storageSize" : 22646784, 
  12.     "totalIndexSize" : 12116832, 
  13.     "indexSizes" : { 
  14.         "_id_" : 6508096, 
  15.         "uid_1" : 5608736 
  16.     }, 
  17.     "avgObjSize" : 63.80028199718003, 
  18.     "nindexes" : 2, 
  19.     "nchunks" : 10, 
  20.     "shards" : { 
  21.         "shard1" : { 
  22.             "ns" : "nosql.fans"
  23.             "count" : 9554, 
  24.             "size" : 573260, 
  25.             "avgObjSize" : 60.00209336403601, 
  26.             "storageSize" : 1396736, 
  27.             "numExtents" : 5, 
  28.             "nindexes" : 2, 
  29.             "lastExtentSize" : 1048576, 
  30.             "paddingFactor" : 1, 
  31.             "flags" : 1, 
  32.             "totalIndexSize" : 596848, 
  33.             "indexSizes" : { 
  34.                 "_id_" : 318864, 
  35.                 "uid_1" : 277984 
  36.             }, 
  37.             "ok" : 1 
  38.         }, 
  39.         "shard2" : { 
  40.             "ns" : "nosql.fans"
  41.             "count" : 190448, 
  42.             "size" : 12186924, 
  43.             "avgObjSize" : 63.990821641602956, 
  44.             "storageSize" : 21250048, 
  45.             "numExtents" : 7, 
  46.             "nindexes" : 2, 
  47.             "lastExtentSize" : 10067968, 
  48.             "paddingFactor" : 1, 
  49.             "flags" : 1, 
  50.             "totalIndexSize" : 11519984, 
  51.             "indexSizes" : { 
  52.                 "_id_" : 6189232, 
  53.                 "uid_1" : 5330752 
  54.             }, 
  55.             "ok" : 1 
  56.         } 
  57.     }, 
  58.     "ok" : 1 
  59. mongos> 
 
当再次插入大量数据时。。自动分片处理了!!所以OK!!!
 
八.停止所有服务脚本
  1. [root@mon1 sh]# cat /opt/mongodb/sh/stop.sh 
  2. #!/bin/sh 
  3. check=`ps aux|grep mongo|grep configdb|awk '{print $2;}'|wc -l` 
  4. echo $check 
  5. while [ $check -gt 0 ] 
  6. do 
  7.        # echo $check 
  8.         no=`ps aux|grep mongo|grep configdb|awk '{print $2;}'|sed -n '1p'
  9.         kill -3 $no 
  10.         echo "kill $no mongo daemon is ok." 
  11.         sleep 2 
  12.         check=`ps aux|grep mongo|grep configdb|awk '{print $2;}'|wc -l` 
  13.         echo "stopping mongo,pls waiting..." 
  14. done 
  15.   
  16. check=`ps aux|grep mongo|grep configsvr|awk '{print $2;}'|wc -l` 
  17. echo $check 
  18. while [ $check -gt 0 ] 
  19. do 
  20.        # echo $check 
  21.         no=`ps aux|grep mongo|grep configsvr|awk '{print $2;}'|sed -n '1p'
  22.         kill -3 $no 
  23.         echo "kill $no mongo daemon is ok." 
  24.         sleep 2 
  25.         check=`ps aux|grep mongo|grep configsvr|awk '{print $2;}'|wc -l` 
  26.         echo "stopping mongo,pls waiting..." 
  27. done 
  28.   
  29. check=`ps aux|grep mongo|grep shardsvr|awk '{print $2;}'|wc -l` 
  30. echo $check 
  31. while [ $check -gt 0 ] 
  32. do 
  33.        # echo $check 
  34.         no=`ps aux|grep mongo|grep shardsvr|awk '{print $2;}'|sed -n '1p'
  35.         kill -3 $no 
  36.         echo "kill $no mongo daemon is ok." 
  37.         sleep 2 
  38.         check=`ps aux|grep mongo|grep shardsvr|awk '{print $2;}'|wc -l` 
  39.         echo "stopping mongo,pls waiting..." 
  40. done 
  41.   
  42. echo "all mongodb stopped!"   
九.分片管理
1.listshards:列出所有的Shard 
  1. >use admin 
  2. >db.runCommand({listshards:1}) 
2.移除shard 
  1. >use admin 
  2. >db.runCommand( { removeshard : "shard1/192.168.8.30:27021,192.168.8.31:27021" } ) 
  3. >db.runCommand( { removeshard : "shard2/192.168.8.30:27022,192.168.8.31:27022" } ) 
对于移除的分片后,我们再加入相同分片时,会加不进去,可以按如下方法进行: 
  1. mongos> use config 
  2. switched to db config 
  3. mongos> show collections 
  4. changelog 
  5. chunks 
  6. collections 
  7. databases 
  8. lockpings 
  9. locks 
  10. mongos 
  11. settings 
  12. shards 
  13. system.indexes 
  14. version 
  15. mongos> db.shards.find() 
  16. "_id" : "shard1""host" : "shard1/192.168.8.30:27021,192.168.8.31:27021,192.168.8.32:27021""maxSize" : NumberLong(20480) } 
  17. "_id" : "shard2""host" : "shard2/192.168.8.30:27022,192.168.8.31:27022,192.168.8.32:27022""maxSize" : NumberLong(20480) } 
 要做的就是删除shards表中的信息,把移除的shard键值删除掉!再重新加入shard
如:db.shards.remove({"_id":"shard2"})
 
3.查看Sharding信息
> printShardingStatus()
 
PRIMARY> db.system.replset.find()
PRIMARY> rs.isMaster()
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

关于mongos接入高可用的介绍请看下回分解!!!!

  评论这张
 
阅读(519)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018