MongoDB 有主从复制和副本集两种主从复制模式, 主从复制最大的问题就是无法自动故障转移, MongoDB 副本集解决了主从模式无法自动故障转义的特点, 因此是复制的首选.
对于简单的主从复制无法自动故障转移的缺陷, 各个数据库都在改进, MySQL 推出的 MGR,Redis 的哨兵, MongoDB 的复制集.
对于主从复制模式:
MongoDB 的主从配置异常简单,
如果是非安全认证模式, 只需要在主节点增加 master = true,
从节点增加 slave = true 和 source = ip:port 两个节点, 分别启动即可, 不管主节点是否存在数据以及存在多少数据, 从节点以 slave 的方式启动, 就会自动同步主节点的数据.
相比 MySQL 的主从模式(各种原因导致的主从事务不一致), 简单的不是一点半点.
- port=12345 #端口
- dbpath= /usr/local/MongoDB/db #数据库存文件存放目录
- logpath= /usr/local/MongoDB/db/MongoDB.log #日志文件存放路径
- logappend=true #使用追加的方式写日志
- fork=true #守护程序的方式启用, false 即不在后台运行
- maxConns=100 #最大同时连接数
- journal=true #每次写入会记录一条操作日志(通过 journal 可以重新构造出写入的数据).
- storageEngine=wiredTiger #存储引擎有 mmapv1,wiretiger,mongorocks
- bind_ip= 10.104.174.247 #这样就可外部访问了, 例如从 win10 中去连虚拟机中的 MongoDB
- # 复制只需要增加 master= true
- master= true
- # 如果开启了安全认证, 需要增加如下两个节点.
- auth=true #启用验证
- keyFile= /usr/local/MongoDB/db/keyfile #添加 keyfile
- oplogSize=2048 #oplog 大小
安全认证模式:
关于安全认证模式, 纠结了好久, MongoDB 是这样的:
1, 对于单实例的 MongoDB,(创建用户之后)开启安全认证需要增加 auth = true 配置即可,
2, 主从或者副本集模式下,(创建用户之后)如果要开启安全认证, 必须要加上 keyFile(设置可以 file 之后 auth 参数才有效), 二者必须同时配置, 否则 (主从 or 副本集) 就不成功.
需要注意的是, 如果在主节点创建了用户, 主从节点以开启安全认证方式启动, 主节点的用户信息同样可以同步到从节点, 因此从节点并不需要再重新创建用户信息.
副本的初始化:
MongoDB 的副本在启动的时候会自动从主节点的 oplog 中读取数据, 从而完成初始化, 这一点非常省心.
当然, 可能存在主节点数据超过 oplog 大小或者说主节点 oplog 发生了重用(覆盖), 那么就无法通过 oplog 自动做到主从的同步, 此时可以可以:
1, 以 autoresync = true 的方式重启副本.
2, 删除从节点的数据文件然后重新启动从节点.
3, 删除从节点的数据文件, 直接 copy 主节点的数据文件到从节点(个人认为这种方式更加简单高效), 启动从节点即可.
三种方式都可以达到完整同步主节点数据的目的.
如下是 MongoDB slave 节点同步数据的模式, 来自于: https://www.cnblogs.com/daizhj/archive/2011/06/20/2050916.html
副本集搭建
由于 MongoDB 副本会自动从主节点 (或者相邻的最近节点) 同步数据, 不会出现事务冲突之类错误, 因此副本集的配置也很简单, 这一点要比 MySQL 的各种配置简单太多.
主节点生成 keyfile:
openssl rand -base64 100> /usr/local/MongoDB/db/keyfile -- 文件内容采 base64 编码, 一共 100 个字符
修改文件权限:
chmod 600 /usr/local/MongoDB/db/keyfile
复制改 keyfile 至各个节点, 然后启动各个节点.
搭建副本集需要移除掉主从复制的一些配置项(主节点的 master = true, 从节点的 slave,source 等配置项), 如下是一个最简单的配置项.
- port=8000 #端口
- dbpath= /usr/local/MongoDB/db #数据库存文件存放目录
- logpath= /usr/local/MongoDB/db/MongoDB.log #日志文件存放路径
- logappend=true #使用追加的方式写日志
- fork=true #守护程序的方式启用, false 即不在后台运行
- maxConns=100 #最大同时连接数
- auth=true #启用验证
- journal=true #每次写入会记录一条操作日志(通过 journal 可以重新构造出写入的数据).
- # 即使宕机, 启动时 wiredtiger 会先将数据恢复到最近一次的 checkpoint 点, 然后重放后续的 journal 日志来恢复.
- storageEngine=wiredTiger #存储引擎有 mmapv1,wiretiger,mongorocks
- bind_ip= 10.104.174.247
- keyFile= /usr/local/MongoDB/db/keyfile #添加 keyfile
- #master= true
- oplogSize=2048 #oplog
- replSet= rstest #副本集名称
主节点副本集初始化
rs.initiate()
(数秒之后)同时发现 rstest:SECONDARY > 变为 rstest:PRIMARY>
加入新节点
- rs.add("10.104.174.247:9000")
- rs.add("10.104.174.247:10000")
rs.status() 查看副本集主从节点的状态
- "health" : 1, //1 表明正常; 0 表明异常
- "state" : 1, // 1 表明是 Primary; 2 表明是 Secondary;
- "stateStr" : "PRIMARY", // 表明此机器是主库
rs.isMaster()查看主节点信息
副本集也可以通过定义主机集合的方式
- config_rs1={
- _id:'rs1',members:[
- {
- _id:1,host:'10.104.174.247:8000',priority:1
- },
- {
- _id:2,host:'10.104.174.247:9000'
- },
- {
- _id:3,host:'10.104.174.247:1000'
- }]
- }
- rs.initiate(config_rs1) // 初始化配置
来源: http://www.linuxidc.com/Linux/2018-11/155606.htm