分类目录归档:mongodb

MongoDB的主从部署

             

主从同步:

md01    10.0.0.11        master
md02    10.0.0.12        slave
md03    10.0.0.14        slave

#建立数据库目录

  1. mkdir -p /elain/apps/mongodb/ 
  2. mkdir -p /elain/data/mongodb/db/ 
  3. mkdir -p /elain/logs/mongodb/ 

注:  
1、不需要像mysql一样复制完整数据过去,丛库启动会制动复制主库完整数据。
2、丛库自动配置为只读。
3、mongodb第一次启动时间较长,需要注意等待。
4、管理命令多数都要在admin库中执行 use admin

相关参数:./mongod --help
--autoresync 当发现从服务器的数据不是最新时,开始从主服务器请求同步数据
--slavedelay 同步延迟,单位:秒

主-从
作为主服务器启动

  1. /elain/apps/mongodb/bin/mongod --fork --master --oplogSize=4096 --port 27001 --dbpath /elain/data/mongodb/db --logpath /elain/logs/mongodb/mongodb.log 

作为从服务器启动,并指明主服务器地址。--autoresync为强制从主服务器同步全部数据

  1. /elain/apps/mongodb/bin/mongod --fork --slave --source 10.0.0.11:27001 --port 27001 --dbpath /elain/data/mongodb/db --logpath /elain/logs/mongodb/mongodb.log  

注:可以在启动从时加以下常用参数
--slavedelay 10      #延时复制 单位为秒
--autoresync         #自动重新同步
--only               #复制指定的数据库,默认复制所有的库
--oplogSize          #主节点的oplog日志大小,单位为M,建议设大点(更改oplog大小时,只需停主库,删除local.*,然后加--oplogSize=* 重新启动即可,*代表大小)

如果发现主从不同步,从上手动同步

  1. db.runCommand({"resync":1}) 

状态查询

  1. db.runCommand({"isMaster":1})  

#主还是从

在丛库上查询主库地址

  1. > use local; 
  2. switched to db local 
  3. > db.sources.find(); 
  4. { "_id" : ObjectId("4e9105515d704346c8796407"), "host" : "10.0.0.11:27001", "source" : "main", "syncedTo" : { "t" : 1318155992000, "i" : 1 } } 

#查看各Collection状态

  1. db.printCollectionStats(); 

#查看主从复制状态

  1. db.printReplicationInfo(); 

测试主从
在主服务器新建数据库

  1. mongo --port 27001 
  2. >show dbs 
  3. >use elaindb 
  4. >db.blog.save({title:"new article"}) 

在从服务器上查看同步数据

  1. mongo --port 27001 

#在从库插入数据的操作 会提示 not master

  1. > use elaindb; 
  2. switched to db elaindb 
  3. > db.blog.find(); 
  4. { "_id" : ObjectId("4e9174b48443c8ef12b30c56"), "title" : "new article" } 

#查看主从同步信息:

  1. > db.printReplicationInfo(); 
  2. this is a slave, printing slave replication info. 
  3. source:   10.0.0.11:27001 
  4.          syncedTo: Sun Oct 09 2011 18:37:12 GMT+0800 (CST) 
  5.                  = 19 secs ago (0.01hrs) 
  1. >db.printSlaveReplicationInfo(); 

#此为同步过来的数据,测试成功

附加:

添加及删除源:
启动从节点时可以用--source指定主节点,也可以在shell中配置这个源,

启动一个从,端口为27002

  1. /elain/apps/mongodb/bin/mongod --fork --slave  --port 27002 --dbpath /elain/data/mongodb/testdb --logpath /elain/logs/mongodb/mongodb.log 

登录:

  1. mongo --port 27002 
  2.  
  3. [root@md03 ~]# mongo --port 27002 
  4. MongoDB shell version: 2.0.0 
  5. connecting to: 127.0.0.1:27002/test 
  6. > show dbs 
  7. local   (empty) 

添加到从节点上

  1. >use local 
  2. >db.sources.insert({"host": "10.0.0.11:27001"}); 

#查看显示正在同步

  1. > db.sources.find(); 
  2. { "_id" : ObjectId("4e9111e1c29bbd9b9cd31d4e"), "host" : "10.0.0.11:27001", "source" : "main", "syncedTo" : { "t" : 1318156782000, "i" : 246 }, "dbsNextPass" : { "testdb" : true, "testdb1" : true } } 

#同步完成后

  1. > db.sources.find(); 
  2. { "_id" : ObjectId("4e9111e1c29bbd9b9cd31d4e"), "host" : "10.0.0.11:27001", "source" : "main", "syncedTo" : { "t" : 1318156782000, "i" : 256 } } 

更改源:(假设10.0.0.12也为主库)

  1. db.sources.insert({"host": "10.0.0.12:27001"}); 
  2. db.sources.remove({"host": "10.0.0.11:27001"}); 

若复制中使用了认证,需在local库中添加repl用户来复制

  1. >user local; 
  2. > db.addUser("repl", "elain123"); 

附录一、Slave 顶替 Master
如果主服务器 10.0.0.11 宕机了,
此时需要用 10.0.0.12 机器来顶替 master 服务,

步骤如下:
#停止 10.0.0.12 进程(mongod)

  1. kill -2 `ps -ef|grep mongod|grep -v grep|awk '{print $2}'` 

#删除 10.0.0.12 数据目录中的 local.*

  1. rm -rf /elain/data/mongodb/db/local.* 

#以--master 模式启动 10.0.0.12

  1. /elain/apps/mongodb/bin/mongod --fork --master --oplogSize=4096 --port 27001 --dbpath /elain/data/mongodb/db --logpath /elain/logs/mongodb/mongodb.log 

附录二、切换 Master/Slave 角色
切换主库10.0.0.11和从库10.0.0.12的角色

步骤如下:(命令略)

用 fsync 命令暂停 主库 上的写操作,
关闭 从库 上的服务
清空 从库 上的 local.*文件
用-master 选项重启 从库 服务
在 从库 上执行一次写操作,初始化 oplog,获得一个同步起始点
关闭 从库 服务,此时 从库 已经有了新的 local.*文件
关闭 主库 服务,并且用 从库 上新的 local.*文件来代替 主库 上的 local.*文件(建议先压缩再COPY)
用-master 选项重启 从库 服务
在启动slave的选项上加一个-fastsync 选项来重启 主库 服务
 

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

本文链接地址:MongoDB实战系列之三:MongoDB的主从部署

 

本文出自 “elain的技术博客” 博客,请务必保留此出处http://elain.blog.51cto.com/3339379/760266

            

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. db.runCommand( {
  7.     addshard : "chujq/md04:27017",
  8.     name:"shard2",
  9.     maxsize:2048,
  10.     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. mongos> show dbs
  5. config  0.1875GB
  6. elain   0.453125GB
  7. test    (empty)

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

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

查看索引:

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

#添加分片:

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

#查看分片状态

  1. use elain;
  2. db.elain.stats();
  3. mongos> db.elain.stats();
  4. {
  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
  41. }

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

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

分片后新写数据第二次:

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

分片后新写数据第三次:

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

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

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

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

删除片操作

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

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

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

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

本文链接地址:MongoDB实战系列之六:mongodb的高可用集群设计实战

本文出自 “elain的技术博客” 博客,请务必保留此出处http://elain.blog.51cto.com/3339379/770114