MongoDB的主从仲裁模式是一种复制架构,用于提高数据的可用性和容错能力。在主从仲裁模式中,数据在多个MongoDB实例之间复制和同步,其中包括一个主节点(Primary)、多个从节点(Secondary)和一个仲裁节点(Arbiter)。

  • 主节点(Primary):主节点是负责处理所有写操作的节点,它接收来自客户端的写请求,并将这些写操作复制到所有从节点。主节点还负责处理读操作,可以直接响应客户端的读请求。

  • 从节点(Secondary):从节点是主节点的备份,它们复制主节点的数据并提供读操作的能力。从节点通常用于读操作,不处理写操作。如果主节点发生故障,从节点可以被提升为新的主节点来继续提供服务。

  • 仲裁节点(Arbiter):仲裁节点不存储数据,它的主要作用是在主节点和从节点之间进行投票选举,帮助系统做出决策。仲裁节点不参与数据复制,仅用于解决选举过程中的投票冲突。

在MongoDB的主从仲裁模式中,主节点负责处理写操作,从节点用于读操作和故障恢复,而仲裁节点则帮助系统进行选举和故障处理。这种架构提高了系统的可用性和容错能力,确保即使某个节点发生故障,系统仍然能够继续正常运行。

注解:自动化部署docker mongo主备仲裁集群环境。

前置条件:

服务器

主从仲裁

IP地址

Center7

Mongo-master

192.168.1.100

Center7

Mongo-slave

192.168.1.200

Center7

Mongo-arbiterOnly

192.168.1.300

部署Docker底层环境

参考此篇文章自动化安装docker底层环境

部署Mongo集群

创建数据目录

mkdir -p /data/docker/mongo

Docker命令行启动Mongo容器

主节点

docker run -itd --name mongo-primary --restart=always --privileged=true -v /data/docker/mongo/config:/data/configdb -v /data/docker/mongo/db:/data/db --network=host mongo:4.0.5 --bind_ip 0.0.0.0 --replSet mongo-rep

从节点

docker run -itd --name mongo-secondary1 --restart=always --privileged=true -v /data/docker/mongo/config:/data/configdb -v /data/docker/mongo/db:/data/db --network=host mongo:4.0.5 --bind_ip 0.0.0.0 --replSet mongo-rep

仲裁节点

docker run -itd --name mongo-secondary2 --restart=always --privileged=true -v /data/docker/mongo/config:/data/configdb -v /data/docker/mongo/db:/data/db --network=host mongo:4.0.5 --bind_ip 0.0.0.0 --replSet mongo-rep

说明:

  • docker run: 运行 Docker 容器的命令。

  • -itd: 交互式操作、分配伪终端、后台运行容器的参数组合。

  • --name mongo-primary: 为容器指定名称为 "mongo-primary"。

  • --restart=always: 容器退出时始终重新启动容器。

  • --privileged=true: 赋予容器特权,允许执行特殊操作。

  • -v /data/docker/mongo/config:/data/configdb: 挂载本地主机的 /data/docker/mongo/config 目录到容器内的 /data/configdb 目录,用于存储配置文件。

  • -v /data/docker/mongo/db:/data/db: 挂载本地主机的 /data/docker/mongo/db 目录到容器内的 /data/db 目录,用于存储数据库文件。

  • --network=host: 使用主机网络模式,容器使用主机的网络命名空间。

  • mongo:4.0.5: 使用 MongoDB 镜像版本为 4.0.5。

  • --bind_ip 0.0.0.0: 设置 MongoDB 监听所有网络接口上的连接。

  • --replSet mongo-rep: 配置 MongoDB 实例作为名为 "mongo-rep" 的复制集的一部分。

初始化高可用集群环境 - 主节点

docker exec mongo-primary mongo --eval 'printjson(rs.initiate({_id:"mongo-rep", version:1, members:[{_id:0, host:"192.168.1.100:27017", priority:6}, {_id:1, host:"192.168.1.200:27017", priority:3}, {_id:2, host:"192.168.1.300:27017", arbiterOnly:true}]}))

说明:

  • 在这个命令中,rs.initiate() 函数用于初始化一个新的复制集,设置了复制集的名称、版本和成员列表,包括主节点、从节点和仲裁节点。

插入测试数据 - 主节点

docker exec mongo-primary mongo xiaopalu --eval 'printjson(db.comment.insert({"articleid":"10000","content":"今天天气真好,阳光明媚","userid":"1001","nickname":"Rose","createdatetime":new Date(),"likenum":NumberInt(10),"state":null}))'

说明:

  • 这个命令向名为 "xiaopalu" 的数据库中的 "comment" 集合插入一条信息,包含内容、用户ID、昵称、创建时间、状态信息。

查看测试数据 - 从节点

docker exec mongo-primary mongo xiaopalu --eval 'printjson(db.comment.findOne())'

说明:

  • 这个命令用于在 "comment" 集合中查找主节点创建的信息内容。

完成!