现在有三台主机 192.168.122.174 docker1
192.168.122.136 docker2
192.168.122.115 docker 3
docker容器默认的是bridge网络 同主机的容器可以互通 我们下面得用overlay网络
创建overlay网络
docker network create --driver overlay --attachable mongo555
初始化docker swarm
docker1作为主节点初始化
docker swarm init --advertise-addr 192.168.122.174
在主节点上创建 MongoDB 服务
在主节点上创建第一个 MongoDB 服务,并将其配置为副本集的主节点:
docker service create --name mongo1 --network mongo555 \
--constraint 'node.hostname == docker1' \
--publish published=27017,target=27017 \
mongo:4.4.29 mongod --replSet rs0
主节点继续操作
docker service create --name mongo2 --network mongo555 \
--constraint 'node.hostname == docker2' \
--publish published=27018,target=27017 \
mongo:4.4.29 mongod --replSet rs0
docker service create --name mongo3 --network mongo555 \
--constraint 'node.hostname == docker3' \
--publish published=27019,target=27017 \
mongo:4.4.29 mongod --replSet rs0
初始化副本集
连接到 MongoDB 主节点 mongo1
,然后初始化副本集:
docker exec -it $(docker ps -q -f name=mongo1) mongo
在 MongoDB shell 中,执行以下命令以添加副本集成员:
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "192.168.122.174:27017" }, // mongo1
{ _id: 1, host: "192.168.122.136:27018" }, // mongo2
{ _id: 2, host: "192.168.122.115:27019" } // mongo3
]
});
这里 mongo2
和 mongo3
的主机地址与端口需要与创建服务时的端口一致。
测试副本集的高可用性
连接到 mongo1
,插入测试数据:
use testDB
db.testCollection.insert({ name: "MongoDB Test", createdAt: new Date() });
验证数据在副本集中的同步
可以通过连接到其他节点(mongo2
和 mongo3
)来验证数据的同步情况:
连接到 docker2
docker exec -it $(docker ps -q -f name=mongo2) mongo --host 192.168.122.136 --port 27017
use testDB
db.testCollection.find();
连接到docker3
docker exec -it $(docker ps -q -f name=mongo3) mongo --host 192.168.122.115 --port 27017
use testDB
db.testCollection.find();