MongoDB --- 主从复制

简介

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

更多内容请到官网了解

部署及测试

ip port 角色
10.10.10.56 27017 master
10.10.10.56 27018 slave

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://blog.csdn.net/yanggd1987/article/details/52044333

 

 

你可能感兴趣的:(------,MongoDB,数据库)