MongoDB实战系列之六:mongodb的高可用集群设计实战

来源:互联网 发布:淘宝运营视频教程 编辑:程序博客网 时间:2024/04/29 06:19

环境:
CentOS 6.0 x64

md01: 10.0.0.11
md02: 10.0.0.12
md03: 10.0.0.14
md04: 10.0.0.15
md05: 10.0.0.16
md06: 10.0.0.17

设计思路:

md01、md02、md03 做一组复制集
md04、md05、md06 做一组复制集
再把这两组复制集用分片做成 shard1、shard2 用LVS 调用 

下载安装mongodb

  1. cd /root/tools 
  2. wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.0.tgz 
  3. tar zxvf mongodb-linux-x86_64-2.0.0.tgz 
  4. mv mongodb-linux-x86_64-2.0.0 /elain/apps/mongodb-linux-x86_64-2.0.0 
  5. ln -s /elain/apps/mongodb-linux-x86_64-2.0.0 /elain/apps/mongodb 
  6. ln -s /elain/apps/mongodb/bin/*  /bin/ 

#添加用户组 

  1. /usr/sbin/groupadd -g 690 mongodb 
  2. /usr/sbin/useradd -g mongodb mongodb -u 690 -s /sbin/nologin 

各节点hosts文件 添加:

  1. true > /etc/hosts 
  2. echo -ne " 
  3. 10.0.0.11     md01 
  4. 10.0.0.12     md02 
  5. 10.0.0.14     md03 
  6. 10.0.0.15     md04 
  7. 10.0.0.16     md05 
  8. 10.0.0.17     md06 
  9. >>/etc/hosts 
副本集配置:启动各节点:md01
  1. mkdir -p /elain/logs/mongodb/ 
  2. mkdir -p /elain/data/mongodb/db 
  3. /elain/apps/mongodb/bin/mongod --rest --replSet elain/md01:27017 --fork --port 27017 --dbpath /elain/data/mongodb/db/ --logpath /elain/logs/mongodb/mongodb.log 

md02

  1. mkdir -p /elain/logs/mongodb/ 
  2. mkdir -p /elain/data/mongodb/db 
  3. /elain/apps/mongodb/bin/mongod --rest --replSet elain/md02:27017 --fork --port 27017 --dbpath /elain/data/mongodb/db/ --logpath /elain/logs/mongodb/mongodb.log 

md03

  1. mkdir -p /elain/logs/mongodb/ 
  2. mkdir -p /elain/data/mongodb/db 
  3. /elain/apps/mongodb/bin/mongod --rest --replSet elain/md03:27017 --fork --port 27017 --dbpath /elain/data/mongodb/db/ --logpath /elain/logs/mongodb/mongodb.log 

#启动仲裁节点
在md02上

  1. mkdir /elain/data/mongodb/arb 
  2. /elain/apps/mongodb/bin/mongod --fork --rest --replSet elain --dbpath /elain/data/mongodb/arb --port 27015 --logpath /elain/logs/mongodb/mongodb.log 

初始化节点:
md01:(登录其中任何一个节点操作皆可)

  1. > rs.initiate({ 
  2.     _id : "elain", 
  3.     members : [ 
  4.     {_id : 1, host : "md01:27017"}, 
  5.     {_id : 2, host : "md02:27017"}, 
  6.     {_id : 3, host : "md03:27017"}, 
  7.     {_id : 4, host : "md02:27015", "arbiterOnly": true}, 
  8.     ] 
  9.     }); 

#验证

  1. PRIMARY> rs.status() 

也可浏览:http://10.0.0.11:28017/_replSet  查看状态

查看副本集状态

  1. >rs.status() 
  2. >user local; 
  3. >rs.isMaster() 
  4. >db.system.replset.find() 

查看当前主库:

  1. >db.$cmd.findOne({ismaster:1}); 

另一组副本集同理操作即可;这里为省篇幅就不再写出,但切记两复制集名称不可以重复
启动并配置三台Config Server

#md01,03,05上执行

  1. mkdir -p /elain/data/mongodb/config/ 
  2. /elain/apps/mongodb/bin/mongod --configsvr --dbpath /elain/data/mongodb/config/ --port 20000 --logpath /elain/logs/mongodb/config.log --logappend --fork 

5、部署并配置三台Routing Server

指定所有的config sever地址参数,chunkSize是分割数据时每块(Chunk)的单位大小

#md02,md04,md06

  1. /elain/apps/mongodb/bin/mongos --configdb md01:20000,md03:20000,md05:20000 --port 30000 --chunkSize 100 --logpath /elain/logs/mongodb/mongos.log --logappend --fork 

6、命令行添加分片

连接到mongs服务器,并切换到admin

  1. /elain/apps/mongodb/bin/mongo 10.0.0.11:30000/admin 
  1. db.runCommand( { 
  2.     addshard : "elain/md01:27017", 
  3.     name:"shard1", 
  4.     maxsize:2048, 
  5.     allowLocal:true } ); 
  6.  
  7. db.runCommand( { 
  8.     addshard : "chujq/md04:27017", 
  9.     name:"shard2", 
  10.     maxsize:2048, 
  11.     allowLocal:true } ); 

注:添加复制集elain,其中包含一个服务器md01:27017(还饿别的服务器,如md02、md03),如果md01挂了,mongos会知道它所连接的是一个复制集,并会使用新的主节点(md02或md03)

  1. db.runCommand( { listshards : 1 } ); 

如果列出(sharding)了以上二个你加的shards,表示shards已经配置成功

导入数据:

  1. mongoimport -d elain -c elain --type csv --headerline --file /root/bak/test.csv --host md02:30000 

注:数据自备,我这里是从生产环境下MYSQL里导出的一些真实数据来做测试

#激活数据库分片

  1. db.runCommand( { enablesharding : "elain" } ); 
  2. mongos> db.runCommand( { enablesharding : "elain" } ); 
  3. { "ok" : 1 } 
  4.  
  5. mongos> show dbs 
  6. config  0.1875GB 
  7. elain   0.453125GB 
  8. test    (empty) 

#进入数据库,建立索引,为分片做准备

  1. /elain/apps/mongodb/bin/mongo 10.0.0.12:30000/admin 
  2.  
  3. use elain; 
  4. db.elain.ensureIndex({"client_userid":1}); 

查看索引:

  1. mongos> db.elain.find({"client_userid" : 151512}).explain(); 
  2.         "cursor" : "BtreeCursor client_userid_1", 
  3.         "nscanned" : 3, 
  4.         "nscannedObjects" : 3, 
  5.         "n" : 3, 
  6.         "millis" : 0, 
  7.         "nYields" : 0, 
  8.         "nChunkSkips" : 0, 
  9.         "isMultiKey" : false, 
  10.         "indexOnly" : false, 
  11.         "indexBounds" : { 
  12.                 "client_userid" : [ 
  13.                         [ 
  14.                                 151512, 
  15.                                 151512 
  16.                         ] 
  17.                 ] 
  18.         } 

#添加分片:

  1. use admin; 
  2. db.runCommand( { shardcollection : "elain.elain",key : {client_userid: 1} } ) 
  3.  
  4. mongos> db.runCommand( { shardcollection : "elain.elain",key : {client_userid: 1} } ) 
  5. { "collectionsharded" : "elain.elain", "ok" : 1 } 

#查看分片状态

  1. use elain; 
  2. db.elain.stats(); 
  3.  
  4. mongos> db.elain.stats(); 
  5.         "sharded" : true, 
  6.         "flags" : 1, 
  7.         "ns" : "elain.elain", 
  8.         "count" : 507372, 
  9.         "numExtents" : 10, 
  10.         "size" : 84375328, 
  11.         "storageSize" : 97849344, 
  12.         "totalIndexSize" : 29253728, 
  13.         "indexSizes" : { 
  14.                 "_id_" : 16474640, 
  15.                 "client_userid_1" : 12779088 
  16.         }, 
  17.         "avgObjSize" : 166.29874727024747, 
  18.         "nindexes" : 2, 
  19.         "nchunks" : 1, 
  20.         "shards" : { 
  21.                 "shard2" : { 
  22.                         "ns" : "elain.elain", 
  23.                         "count" : 507372, 
  24.                         "size" : 84375328, 
  25.                         "avgObjSize" : 166.29874727024747, 
  26.                         "storageSize" : 97849344, 
  27.                         "numExtents" : 10, 
  28.                         "nindexes" : 2, 
  29.                         "lastExtentSize" : 26099712, 
  30.                         "paddingFactor" : 1, 
  31.                         "flags" : 1, 
  32.                         "totalIndexSize" : 29253728, 
  33.                         "indexSizes" : { 
  34.                                 "_id_" : 16474640, 
  35.                                 "client_userid_1" : 12779088 
  36.                         }, 
  37.                         "ok" : 1 
  38.                 } 
  39.         }, 
  40.         "ok" : 1 

在分片后新写数据第一次:

  1. mongos> db.elain.stats(); 
  2.         "sharded" : true, 
  3.         "flags" : 1, 
  4.         "ns" : "elain.elain", 
  5.         "count" : 676496, 
  6.         "numExtents" : 12, 
  7.         "size" : 112500436, 
  8.         "storageSize" : 129179648, 
  9.         "totalIndexSize" : 47551616, 
  10.         "indexSizes" : { 
  11.                 "_id_" : 21968912, 
  12.                 "client_userid_1" : 25582704 
  13.         }, 
  14.         "avgObjSize" : 166.29874529930703, 
  15.         "nindexes" : 2, 
  16.         "nchunks" : 8, 
  17.         "shards" : { 
  18.                 "shard1" : { 
  19.                         "ns" : "elain.elain", 
  20.                         "count" : 0, 
  21.                         "size" : 0, 
  22.                         "storageSize" : 8192, 
  23.                         "numExtents" : 1, 
  24.                         "nindexes" : 2, 
  25.                         "lastExtentSize" : 8192, 
  26.                         "paddingFactor" : 1, 
  27.                         "flags" : 1, 
  28.                         "totalIndexSize" : 16352, 
  29.                         "indexSizes" : { 
  30.                                 "_id_" : 8176, 
  31.                                 "client_userid_1" : 8176 
  32.                         }, 
  33.                         "ok" : 1 
  34.                 }, 
  35.                 "shard2" : { 
  36.                         "ns" : "elain.elain", 
  37.                         "count" : 676496, 
  38.                         "size" : 112500436, 
  39.                         "avgObjSize" : 166.29874529930703, 
  40.                         "storageSize" : 129171456, 
  41.                         "numExtents" : 11, 
  42.                         "nindexes" : 2, 
  43.                         "lastExtentSize" : 31322112, 
  44.                         "paddingFactor" : 1, 
  45.                         "flags" : 1, 
  46.                         "totalIndexSize" : 47535264, 
  47.                         "indexSizes" : { 
  48.                                 "_id_" : 21960736, 
  49.                                 "client_userid_1" : 25574528 
  50.                         }, 
  51.                         "ok" : 1 
  52.                 } 
  53.         }, 
  54.         "ok" : 1 

分片后新写数据第二次:

  1. mongos> db.elain.stats(); 
  2.         "sharded" : true, 
  3.         "flags" : 1, 
  4.         "ns" : "elain.elain", 
  5.         "count" : 1189194, 
  6.         "numExtents" : 23, 
  7.         "size" : 194533928, 
  8.         "storageSize" : 252874752, 
  9.         "totalIndexSize" : 87262448, 
  10.         "indexSizes" : { 
  11.                 "_id_" : 43692544, 
  12.                 "client_userid_1" : 43569904 
  13.         }, 
  14.         "avgObjSize" : 163.58468677103988, 
  15.         "nindexes" : 2, 
  16.         "nchunks" : 8, 
  17.         "shards" : { 
  18.                 "shard1" : { 
  19.                         "ns" : "elain.elain", 
  20.                         "count" : 396370, 
  21.                         "size" : 62195348, 
  22.                         "avgObjSize" : 156.91234957236924, 
  23.                         "storageSize" : 86114304, 
  24.                         "numExtents" : 11, 
  25.                         "nindexes" : 2, 
  26.                         "lastExtentSize" : 20881408, 
  27.                         "paddingFactor" : 1, 
  28.                         "flags" : 1, 
  29.                         "totalIndexSize" : 35949872, 
  30.                         "indexSizes" : { 
  31.                                 "_id_" : 17954496, 
  32.                                 "client_userid_1" : 17995376 
  33.                         }, 
  34.                         "ok" : 1 
  35.                 }, 
  36.                 "shard2" : { 
  37.                         "ns" : "elain.elain", 
  38.                         "count" : 792824, 
  39.                         "size" : 132338580, 
  40.                         "avgObjSize" : 166.9205019020615, 
  41.                         "storageSize" : 166760448, 
  42.                         "numExtents" : 12, 
  43.                         "nindexes" : 2, 
  44.                         "lastExtentSize" : 37588992, 
  45.                         "paddingFactor" : 1, 
  46.                         "flags" : 1, 
  47.                         "totalIndexSize" : 51312576, 
  48.                         "indexSizes" : { 
  49.                                 "_id_" : 25738048, 
  50.                                 "client_userid_1" : 25574528 
  51.                         }, 
  52.                         "ok" : 1 
  53.                 } 
  54.         }, 
  55.         "ok" : 1 

分片后新写数据第三次:

  1. mongos> db.elain.stats(); 
  2.         "sharded" : true, 
  3.         "flags" : 1, 
  4.         "ns" : "elain.elain", 
  5.         "count" : 1376876, 
  6.         "numExtents" : 23, 
  7.         "size" : 225576604, 
  8.         "storageSize" : 252874752, 
  9.         "totalIndexSize" : 100826432, 
  10.         "indexSizes" : { 
  11.                 "_id_" : 50249696, 
  12.                 "client_userid_1" : 50576736 
  13.         }, 
  14.         "avgObjSize" : 163.83218532387812, 
  15.         "nindexes" : 2, 
  16.         "nchunks" : 10, 
  17.         "shards" : { 
  18.                 "shard1" : { 
  19.                         "ns" : "elain.elain", 
  20.                         "count" : 494202, 
  21.                         "size" : 77551984, 
  22.                         "avgObjSize" : 156.92365469990003, 
  23.                         "storageSize" : 86114304, 
  24.                         "numExtents" : 11, 
  25.                         "nindexes" : 2, 
  26.                         "lastExtentSize" : 20881408, 
  27.                         "paddingFactor" : 1, 
  28.                         "flags" : 1, 
  29.                         "totalIndexSize" : 42057344, 
  30.                         "indexSizes" : { 
  31.                                 "_id_" : 21600992, 
  32.                                 "client_userid_1" : 20456352 
  33.                         }, 
  34.                         "ok" : 1 
  35.                 }, 
  36.                 "shard2" : { 
  37.                         "ns" : "elain.elain", 
  38.                         "count" : 882674, 
  39.                         "size" : 148024620, 
  40.                         "avgObjSize" : 167.70021548159343, 
  41.                         "storageSize" : 166760448, 
  42.                         "numExtents" : 12, 
  43.                         "nindexes" : 2, 
  44.                         "lastExtentSize" : 37588992, 
  45.                         "paddingFactor" : 1, 
  46.                         "flags" : 1, 
  47.                         "totalIndexSize" : 58769088, 
  48.                         "indexSizes" : { 
  49.                                 "_id_" : 28648704, 
  50.                                 "client_userid_1" : 30120384 
  51.                         }, 
  52.                         "ok" : 1 
  53.                 } 
  54.         }, 
  55.         "ok" : 1 

分片后新写数据第四次(DOWN 掉md04的mongo服务)

  1. mongos> db.elain.stats(); 
  2.         "sharded" : true, 
  3.         "flags" : 1, 
  4.         "ns" : "elain.elain", 
  5.         "count" : 1686310, 
  6.         "numExtents" : 26, 
  7.         "size" : 275761376, 
  8.         "storageSize" : 353116160, 
  9.         "totalIndexSize" : 129033632, 
  10.         "indexSizes" : { 
  11.                 "_id_" : 63265888, 
  12.                 "client_userid_1" : 65767744 
  13.         }, 
  14.         "avgObjSize" : 163.52946729842083, 
  15.         "nindexes" : 2, 
  16.         "nchunks" : 10, 
  17.         "shards" : { 
  18.                 "shard1" : { 
  19.                         "ns" : "elain.elain", 
  20.                         "count" : 740264, 
  21.                         "size" : 116213588, 
  22.                         "avgObjSize" : 156.98938216636228, 
  23.                         "storageSize" : 141246464, 
  24.                         "numExtents" : 13, 
  25.                         "nindexes" : 2, 
  26.                         "lastExtentSize" : 30072832, 
  27.                         "paddingFactor" : 1, 
  28.                         "flags" : 1, 
  29.                         "totalIndexSize" : 61810560, 
  30.                         "indexSizes" : { 
  31.                                 "_id_" : 32556832, 
  32.                                 "client_userid_1" : 29253728 
  33.                         }, 
  34.                         "ok" : 1 
  35.                 }, 
  36.                 "shard2" : { 
  37.                         "ns" : "elain.elain", 
  38.                         "count" : 946046, 
  39.                         "size" : 159547788, 
  40.                         "avgObjSize" : 168.64696642657967, 
  41.                         "storageSize" : 211869696, 
  42.                         "numExtents" : 13, 
  43.                         "nindexes" : 2, 
  44.                         "lastExtentSize" : 45109248, 
  45.                         "paddingFactor" : 1, 
  46.                         "flags" : 1, 
  47.                         "totalIndexSize" : 67223072, 
  48.                         "indexSizes" : { 
  49.                                 "_id_" : 30709056, 
  50.                                 "client_userid_1" : 36514016 
  51.                         }, 
  52.                         "ok" : 1 
  53.                 } 
  54.         }, 
  55.         "ok" : 1 

总结:通过以上四次的写数据测试,我们可以看到分片是成功的,每次写数据,shard1、shard2都有数据写入,且,在下面的复制集中DOWN 掉任意一台,不影响整个架构的正常服务。

删除片操作

  1. mongos> db.runCommand({"removeshard" : "10.0.0.11:27011"}); 
  2.         "msg" : "draining started successfully", 
  3.         "state" : "started", 
  4.         "shard" : "shard2", 
  5.         "ok" : 1 

再执行,可看到removeshard的挪动进度

  1. mongos> db.runCommand({"removeshard" : "10.0.0.11:27011"}); 
  2.         "msg" : "draining ongoing", 
  3.         "state" : "ongoing", 
  4.         "remaining" : { 
  5.                 "chunks" : NumberLong(3), 
  6.                 "dbs" : NumberLong(0) 
  7.         }, 
  8.         "ok" : 1 
  9.   

转载请注明: 转载自http://www.elain.org

原创粉丝点击