MongoDB實戰系列之六:mongodb的高可用集羣設計實戰

環境:
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

本文鏈接地址:MongoDB實戰系列之六:mongodb的高可用集羣設計實戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章