MongoDB 主从复制
环境:
Win 7
MongoDB软件位置:D:\Program Files (x86)\mongodb
主库数据文件位置:D:\MongoData\7777
主库端口: 7777
主库启动配置文件: D:\MongoData\7777.cnf
从库数据文件位置:D:\MongoData\8888
从库端口: 8888
从库启动配置文件: D:\MongoData\8888.cnf
MongoDB 的最新版本已不再推荐此方案。
配置文件设置
主库配置文件
dbpath=D:\MongoData\7777 port=7777 bind_ip=127.0.0.1 master=true |
从库配置文件
dbpath=D:\MongoData\8888 port=8888 bind_ip=127.0.0.1 slave=true source=127.0.0.1:7777 |
启动数据库
在命令窗口
mongod –config D:\MongoData\7777.cnf
先在主库上插入一条数据
C:\Users\Dillon>mongo 127.0.0.1:7777 MongoDB shell version: 2.0.9 connecting to: 127.0.0.1:7777/test > use zd switched to db zd > db.persons.insert({name:"zd"}) > db.persons.find(); { "_id" : ObjectId("534a706360baf06eb370f7ff"), "name" : "zd" } |
启动从库
mongod –config D:\MongoData\8888.cnf
查询从库的记录
C:\Users\Dillon>mongo 127.0.0.1:8888 MongoDB shell version: 2.0.9 connecting to: 127.0.0.1:8888/test > show dbs local 0.078125GB zd 0.078125GB > use zd switched to db zd > show collections; persons system.indexes > db.persons.find(); { "_id" : ObjectId("534a706360baf06eb370f7ff"), "name" : "zd" } |
主从同步实验
在主库插入一条新的记录
> db.book.insert({name:"MongoDB"}) |
在从库中查询
> db.book.find(); { "_id" : ObjectId("534a70f660baf06eb370f800"), "name" : "MongoDB" } |
Slave顶替Master
如果上面的主服务器7777宕了,此时需要用8888机器来顶替master服务,步骤如下:
停止B进程(mongod)
删除B数据目录中的local.*
以--master模式启动B
首先将
C:\Users\Dillon>mongod --config D:\MongoData\7777.cnf
所在的cmd进程ctrl +C,停止掉,模拟7777主库宕机。
此时在备库的cmd终端上有如下显示信息
Sun Apr 13 19:43:57 [replslave] repl: sleep 3 sec before next pass
Sun Apr 13 19:44:00 [replslave] repl: from host:127.0.0.1:7777
Sun Apr 13 19:44:01 [replslave] repl: couldn't connect to server 127.0.0.1:7777
现在停止8888从库进程
所在的cmd进程ctrl +C,停止掉8888从机
进入D:\MongoData\8888,删除目录中的local.*
删除这两项
配置新的配置文件
dbpath=D:\MongoData\8888 port=8888 bind_ip=127.0.0.1 master=true |
再次启动从库
C:\Users\Dillon>mongod --config D:\MongoData\8888B.cnf Sun Apr 13 19:49:28 [initandlisten] MongoDB starting : pid=6940 port=8888 dbpath =D:\MongoData\8888 master=1 64-bit host=Dillon-PC Sun Apr 13 19:49:28 [initandlisten] db version v2.0.9, pdfile version 4.5 Sun Apr 13 19:49:28 [initandlisten] git version: 7e34cb36a6ae64d527c0b0da81fa967 606c55433 Sun Apr 13 19:49:28 [initandlisten] build info: windows sys.getwindowsversion(ma jor=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB _VERSION=1_42 Sun Apr 13 19:49:28 [initandlisten] options: { bind_ip: "127.0.0.1", config: "D: \MongoData\8888B.cnf", dbpath: "D:\MongoData\8888", master: "true", port: 8888 } Sun Apr 13 19:49:28 [initandlisten] journal dir=D:/MongoData/8888/journal Sun Apr 13 19:49:28 [initandlisten] recover : no journal files present, no recovery needed Sun Apr 13 19:49:28 [initandlisten] ****** Sun Apr 13 19:49:28 [initandlisten] creating replication oplog of size: 8418MB... Sun Apr 13 19:49:28 [initandlisten] ****** Sun Apr 13 19:49:28 [initandlisten] waiting for connections on port 8888 Sun Apr 13 19:49:29 [websvr] admin web console waiting for connections on port 9888 |
验证新的主库插入数据的操作
C:\Users\Dillon>mongo 127.0.0.1:8888 MongoDB shell version: 2.0.9 connecting to: 127.0.0.1:8888/test > show dbs local 10.0732421875GB zd 0.078125GB > use zd switched to db zd > show collections book persons system.indexes > db.persons.insert({name:"Dillon"}) > db.persons.find(); { "_id" : ObjectId("534a706360baf06eb370f7ff"), "name" : "zd" } { "_id" : ObjectId("534a7a1a8f3b19faafd337ff"), "name" : "Dillon" } > |
新的主库设置完毕!
切换Master/Slave角色
假设已经具备主机A和从机B,此时想切换它们的角色,步骤如下:(假设A是健康的)
1) 用sync命令暂停A上的内存数据保存在磁盘中
2) 确定B是从机,关闭B上的服务
3) 清空B上的local.*文件
4) 用-master选项重启B服务
5) 在B上执行一次写操作,初始化oplog,获得一个同步起始点
6) 关闭B服务,此时B已经有了新的local.*文件
7) 关闭A服务,并且用B上新的local.*文件来代替A上的local.*文件(如果文件过大,可以先将文件压缩)
8) 用-master选项重启B服务
9) 在启动slave时选项上加一个-fastsync选项来重启A服务
如果A不是健康的,但是硬件是健康的,那么跳过上面的前两步,并且用B上所有文件去替换A上的文件,重启服务。
主从复制相关参数
主从复制的其他设置项 Master --master master模式 --oplogSize arg size limit (in MB) for op log Slave --slave slave模式 --source arg source指定master位置 --only arg单独指定备份某一database --slavedelay arg指定与Master延迟时间(秒) --autoresync当Slave数据过时后自动重连
|