mongodb的复制使用的oplog,类似于mysql复制的binlog,不同的是oplog是保存在local数据库中的.
需要合理的设置oplog的大小,如果此大小没有设置那么mongodb将会使用可用空间的5%来存放oplog.官方建议64位系统至少分配1G大小.
当slave端落后太多master端的时候,复制会终止,此时需要管理员手工来重启mongodb然后使用resync来重新同步.
此外你可以设置autoresync参数,当复制终止10秒后mongodb会自动重启复制,slave端会每隔10分钟自动重新同步一次.
注意官方现在强烈不建议使用master-slave复制模式,建议使用replica sets复制.
参数介绍
这里介绍的mongodb的主从复制,并不是复制集replica sets,复制的参数如下:
Replication options: --oplogSize arg 操作日志大小,单位M Master/slave options (old; use replica sets instead): --master 指定角色为master mode --slave 指定角色为slave mode --source arg 当角色为slave的时候使用,格式为:<server:port> --only arg 当角色为slave的时候使用,指定单独同步的数据库,默认为同步所有数据库. --slavedelay arg 指定一个应用日志的延时,单位秒 --autoresync
创建mongo仓库
vim /etc/yum.repos.d/mongodb-org-3.2.repo [mongodb-org-3.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
主从服务器配置
#安装
yum install -y mongodb-org
#修改配置
egrep -v '^$|^#' /etc/mongod.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
net:
  port: 27017
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.
security:
  authorization: enabled
配置keyFile文件
(官网介绍)密钥文件的内容作为共享密码的成员复制集。密钥文件的内容必须相同副本集的所有成员。你可以使用任何方法生成一个密钥文件选择。密钥文件的内容必须是6 - 1024个字符长。
openssl rand -base64 512 >> /var/lib/mongo/mongo.key chmod 600 /var/lib/mongo/mongo.key
启动服务
#主服务器启动 mongod --master -f /etc/mongod.conf --keyFile /var/lib/mongo/mongo.key #从服务器启动 mongod --slave --source master_ip:27017 -f /etc/mongod.conf --keyFile /var/lib/mongo/mongo.key
测试
主服务器创建账号
#!/bin/bash
mongo_connect="mongo 127.0.0.1/admin"  
cmd_use_admin="db = db.getSiblingDB('admin');"  
cmd_create_user="db.createUser({\"user\":\"sa\", \"pwd\":\"123456\", \"roles\":[\"root\"]});"  
echo $cmd_use_admin > dbcmd.js  
echo $cmd_create_user >> dbcmd.js  
execute="$mongo_connect dbcmd.js"  
echo "#!/bin/sh" > createDBUser.sh  
echo $execute >> createDBUser.sh  
sh createDBUser.sh && rm -f createDBUser.sh
主库插入一条数据
use test
db.xxoo.save({xx:00});
从库查看是否同步
use test db.test.find()
主库宕机如何将从库切为主库
方式一
- 停止从库
kill -2 PID - 删除从数据目录中的 local.
`rm -rf /data/mongodb/data/db/local.` - 以 –master 模式启动从库 (注意修改原有端口)
mongod --master -f /etc/mongod.master.conf 
方式二
- 备份从库
 - 重建主库,导入新数据
参考:https://docs.mongodb.com/v3.2/replication/ 
https://blog.imdst.com/mongodb-yi-di-zhu-cong-tong-bu-pei-zhi/