Docker中搭建Mongo副本集 实现数据库的事务处理

在Docker中安装 Mongo

拉取镜像

docker pull mongo:latest

创建网络组,用于固定这几个容器的IP,防止计算器或者Docker重启后,导致IP变动,副本集关联失败.

docker network create --subnet=172.19.0.0/16 mongo-cluster

创建3个 实例

docker run --net mongo-cluster --ip 172.19.0.2 -p 27017:27017 --name mongo1 -d mongo --replSet rs0
docker run --net mongo-cluster --ip 172.19.0.3 -p 27018:27017 --name mongo2 -d mongo --replSet rs0
docker run --net mongo-cluster --ip 172.19.0.4 -p 27019:27017 --name mongo3 -d mongo --replSet rs0

在这里插入图片描述
进入 实例容器 配置副本集

docker exec -it  mongo1 mongosh

然后,将上面 docker inspect 获得的3个实例ip ,替换下面代码的ip,对副本集初始化.

rs.initiate({ "_id": "rs0", "members": [{ "_id": 0,"host": "172.19.0.2:27017"}, { "_id": 1, "host": "172.19.0.3:27017"}, {"_id": 2,"host": "172.19.0.4:27017"}] })

完成初始化后,查看副本集是否正常.

rs.status()

在这里插入图片描述
在members 数组中将包含3 个对象.与初始化中提供的IP 端口一致.

把主集的优先级升到最高,防止重启Docker 或者计算机后主集和副集因为启动速度不同 而自动切换.

cfg = rs.conf()
cfg.members[0].priority = 100 
rs.reconfig(cfg)

现在可以开始测试副本集是否自动同步.

docker exec -it mongodb01 #进入主集
mongosh #链接mongo
show dbs  #查看数据表
use test #生成test表 并插入 测试数据
db.test.insert({name:"data1"})
db.test.find()

在这里插入图片描述
你将在主集实例中看到 插入的 第一条测试数据.

quit

从主集容器中退出,去到子集中 查看 是否已同步.

 docker exec -it mongodb02 mongosh
use test
db.test.find()

你将会看到和主集相同的结果,或者出现这个错误.
在这里插入图片描述
解决方案:

rs.secondaryOk()
然后再
db.test.find() 

如果得到更显再mongodb01中相同的记录,代表 副本集创建完成.
远程客户端连接服务器如果失败,记得请再连接字符串中加入:
directConnection=true

mongodb://127.0.0.1:27017/?directConnection=true