Mongodb主从复制

简介

   Mongodb的replication主要有两种:主从和副本集(replica set)。主从的原理和mysql类似,主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
   现在mongodb官方建议用副本集替代主从复制,但是这不妨碍我们从主从复制入门,了解mongdob的replication。

更多内容请到官网了解

部署及测试

ipport角色
10.10.10.5627017master
10.10.10.5627018slave

1.安装mongodb

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz
 tar -zxvf mongodb-linux-x86_64-amazon-3.2.8.tgz -C /usr/local/mongodb

2.创建目录并启动

mkdir -p /data/{mongodb27017,mongodb27018}
#master:
/usr/local/mongodb/bin/mongod --master --port 27017 --dbpath=/data/mongodb27017/ --logpath /data/mongodb27017/mongodb.log &
#slave:
/usr/local/mongodb/bin/mongod --slave --source 10.10.10.56:27017 --port 27018 --dbpath=/data/mongodb27018/ --logpath /data/mongodb27018/mongodb.log &

其中:
–master 表示主服务器
–slave 表示从服务器
–dbpath 表示数据文件路径
–logpath 表示日志文件,必须为具体的文件
–source 指定主服务器的ip和端口,格式为ip:port
还有其他参数可以在master-slave中设置:
–only 从节点->指定复制某个数据库,默认是复制全部数据库;
–slavedelay 从节点->设置主数据库同步数据的延迟时间,单位为秒;
–fastsync 从节点->以主数据库的节点快照为节点,启动从数据库;
–oplogSize 主节点->设置oplog的大小(主节点操作记录,存储在local数据库的oplog中),默认为当前可用磁盘空间的5%
–autoresync 从节点->当slave上的数据过时,自动进行同步

4.主从读写测试

/usr/local/mongodb/bin/mongo --port 27017
> db.isMaster()
{
    "ismaster" : true,
    "maxBsonObjectSize" : 16777216,
    "maxMessageSizeBytes" : 48000000,
    "maxWriteBatchSize" : 1000,
    "localTime" : ISODate("2016-07-27T02:31:40.108Z"),
    "maxWireVersion" : 4,
    "minWireVersion" : 0,
    "ok" : 1
}
> db.test.insert({"test1":"hello1"})
WriteResult({ "nInserted" : 1 })
> show collections
test
> db.test.find()
{ "_id" : ObjectId("57981eefda4f8b0d7284232e"), "test1" : "hello1" }

/usr/local/mongodb/bin/mongo --port 27018
> db.test.find()
Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }
> rs.slaveOk()
> db.test.find()
{ "_id" : ObjectId("57981eefda4f8b0d7284232e"), "test1" : "hello1" }

从以上看出数据已经复制。
另,在日志中通过看到“pair: initial sync complete”,也说明同步已经完成。

当主加上–master后,mongodb会生成local.oplog.$main集合,用于slave同步。

> use local
switched to db local
> show collections
me
oplog.$main
startup_log

当从加上–sources上后,我们会看到

> use local
switched to db local
> show collections
me
oplog.$main
sources
startup_log
> db.sources.find()
{ "_id" : ObjectId("57981bc8498cafa07fbdd209"), "host" : "10.10.10.56:27017", "source" : "main", "syncedTo" : Timestamp(1469599950, 1) }
> 

注意:默认情况下,slave是不允许读写数据的,这个和replica set(副本集)一样,但是我们可以通过设置db.getMongo().setSlaveOk()或rs.slaveOk(),让slave允许读。

5.主从切换

(1).杀掉master
(2).在slave上测试是否可写

db.test.insert({“test2”:”hello2”})
WriteResult({ “writeError” : { “code” : 10107, “errmsg” : “not master” } })
从以上看出,主从无法完成自动切换,需要手动干预。
(3).停止slave,添加–master 重新启动
usr/local/mongodb/bin/mongod –master –port 27018 –dbpath=/data/mongodb27018/ –logpath /data/mongodb27018/mongodb.log &
/usr/local/mongodb/bin/mongo –port 27018
db.isMaster()
{
“ismaster” : true,
“maxBsonObjectSize” : 16777216,
“maxMessageSizeBytes” : 48000000,
“maxWriteBatchSize” : 1000,
“localTime” : ISODate(“2016-07-27T03:25:57.722Z”),
“maxWireVersion” : 4,
“minWireVersion” : 0,
“ok” : 1
}
db.test.find()
{ “_id” : ObjectId(“57981eefda4f8b0d7284232e”), “test1” : “hello1” }
db.test.insert({“test2”:”hello2”})
WriteResult({ “nInserted” : 1 })
db.test.find()
{ “_id” : ObjectId(“57981eefda4f8b0d7284232e”), “test1” : “hello1” }
{ “_id” : ObjectId(“579829d9015b0c1ce6566194”), “test2” : “hello2” }
从以上看出,slave切换成master后,可以正常的读写数据了。

总结

1.当slave的oplog更新不及时导致落后master太多,将会导致slave不同步,replication会停止,此时必须通过管理员进行手动干预重启replication。此时有两种方法,一是使用resync;另一种是在slave上加–autoresync参数,允许slave在落后master10s后自动重启replicaiton。其中使用resync的效果和删除slave上的数据文件并重启同步一样。
为什么会出现以上情况呢?
因为oplog在启动时会有一个初始大小,随着数据的不断进入oplog会达到预定的大小,并且会重新循环对oplog进行重写。因此当slave落后太多,此时oplog若重写将导致数据不一致,因此同步将会停止。

从上得出,为避免以上状况发生,我们也可通过加到oplog来预防,我们可以设置启动master的参数–oplogSize,此参数默认大小为当前可用磁盘空间的5%,64位机器最小为1G,32位最小为50M

如何设置合适的oplog大小及请参考http://api.mongodb.com/wiki/current/Halted%20Replication.html

如何改变oplog大小:

$ # Stop mongod - killall mongod or kill -2 or ctrl-c) - then:
$ rm /data/db/local.*
$ mongod --oplogSize=8038 --master
Once you've changed the oplog size, restart with slave with --autoresync:
mongod --slave --autoresync

2.查看master的replication状态

> db.printReplicationInfo()
configured oplog size:   990MB
log length start to end: 15411secs (4.28hrs)
oplog first event time:  Wed Jul 27 2016 10:19:09 GMT+0800 (CST)
oplog last event time:   Wed Jul 27 2016 14:36:00 GMT+0800 (CST)
now:                     Wed Jul 27 2016 14:36:04 GMT+0800 (CST)

3.查看slave的replication状态

> db.printSlaveReplicationInfo()
source: 10.10.10.56:27017
    syncedTo: Wed Jul 27 2016 14:37:40 GMT+0800 (CST)
    10 secs (0 hrs) behind the freshest member (no primary available at the moment)
> 

4.若我们要将oplog调整至10G,由于mongodb在启动时需要较长的使劲按来pre-allocate oplog文件,此时mongodb无法对外服务。请参考http://api.mongodb.com/wiki/current/Halted%20Replication.html中的“Manually Allocating OpLog Files”部分。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值