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,并重启服务
Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐