MongoDB实现高可用【Docker版】
mongo一主多从+ keepalived(自动切换)MongoDB复制原理至少需要两个节点、其中一个是主节点,负责处理客户请求,其余是从节点,负责复制主节点的数据主节点记录所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己数据副本执行这些操作,从而保证从节点的数据与主节点一致。MongoDB主从复制优点 (不推荐使用)从节点可以提供数据查询、由从节点执行备份、避免主节点的数据锁定当
·
mongo一主多从+ keepalived(自动切换)
MongoDB复制原理
- 至少需要两个节点、其中一个是主节点,负责处理客户请求,其余是从节点,负责复制主节点的数据
- 主节点记录所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己数据副本执行这些操作,从而保证从节点的数据与主节点一致。
MongoDB主从复制优点 (不推荐使用)
从节点可以提供数据查询、
由从节点执行备份、避免主节点的数据锁定
当主节点故障时可进行手动切换从节点(即从库不会自动升级到主库)
Replica Sets副本集(推荐使用)
弥补主从复制的缺点(从库不会自动主库)[version >=1.6],支持故障自动切换、自动修复成员节点、其余从节点自动跟随新上任的主节点。
配置Replica Sets副本集
至少三台
[guest@localhost ~]$ cat /root/mongo01/conf/mongodb.conf
dbpath=/data/db
#fork=true 容器不需要加
logpath=/var/log/mongodb/mongodb.log
logappend=true
port=27050 # 从节点为27051、27052
bind_ip=0.0.0.0
replSet=rs1
>>>启动master
[guest@localhost ~]$ docker run -itd --name mongo01 -v /root/mongo01/conf:/data/configdb -v /root/mongo01/db:/data/db -p 27050:27050 mongo -f /data/configdb/mongodb.conf
>>>启动从节点1
[guest@localhost ~]$ docker run -itd --name mongo02 -v /root/mongo02/conf:/data/configdb -v /root/mongo02/db:/data/db -p 27051:27051 mongo -f /data/configdb/mongodb.conf
>>>启动从节点2
[guest@localhost ~]$ docker run -itd --name mongo03 -v /root/mongo03/conf:/data/configdb -v /root/mongo03/db:/data/db -p 27052:27052 mongo -f /data/configdb/mongodb.conf
>>>任意一台机进入mongo
[guest@localhost ~]$ mongo --host 172.17.0.2 --port 27050
>config={"_id":"rs1", "members":[{"_id": 0, "host": "172.17.0.2:27050"},{"_id": 1, "host": "172.17.0.3:27051"},{"_id": 2, "host": "172.17.0.4:27052"}]}
>rs.initiate(config)
rs1:PRIMARY>rs.status() # 查看集群状态及信息
rs1:PRIMARY>rs.isMaster() # 查看当前主机的信息及集群简略信息
测试数据同步
- master插入数据后进行slave进行查看
rs1:PRIMARY> use test
rs1:PRIMARY> use db.js.save({"name":"haha"})
- 默认slave不允许操作,需要允许slave查看数据
rs1:SECONDARY> db.getMongo().setSecondaryOk()
rs1:SECONDARY> use test
rs1:SECONDARY> db.js.find()
测试高可用
- 关闭master
[guest@localhost ~]$ docker stop mongo01
[guest@localhost ~]$ docker exec -it mongo03 /bin/bash
eqke229s2oo1k3l1k31# mongo --host 172.17.0.4 --port 27051
rs1:SECONDARY> rs.isMaster()
{
...
"hosts" : [
"172.17.0.2:27050",
"172.17.0.3:27051",
"172.17.0.4:27052"
],
"setName" : "rs1", # 集群名
"ismaster" : false, # 是否主节点
"secondary" : true, # 是否从节点
"primary" : "172.17.0.3:27051", # 主节点
"me" : "172.17.0.4:27052", # 当前主机IP
...
}
rs1:SECONDARY> rs.status()
...
- 故障主节点恢复(故障主节点恢复成从节点)
[guest@localhost ~]$ docker start mongo01
[guest@localhost ~]$ docker exec -it mongo01 /bin/bash
rs1:SECONDARY> db.getMongo().setSecondaryOk()
rs1:SECONDARY> rs.isMaster()
从节点恢复独立
- 删除配置文件的replSet=rs1,并重启服务
更多推荐



所有评论(0)