Mongodb在docker容器中的集群部署
1.拉取镜像
docker pull mongo
2.创建网络
docker network create mongo-rs
3创建容器
docker run --rm --network mongo-rs --name mongo1 -d -v /data/mongo1/db:/data/db -p 27021:27017 mongo:latest --replSet "rs0"
docker run --rm --network mongo-rs --name mongo2 -d -v /data/mongo2/db:/data/db -p 27022:27017 mongo:latest --replSet "rs0"
docker run --rm --network mongo-rs --name mongo3 -d -v /data/mongo3/db:/data/db -p 27023:27017 mongo:latest --replSet "rs0"
docker run --rm --network mongo-rs --name mongo4 -d -v /data/mongo4/db:/data/db -p 27024:27017 mongo:latest --replSet "rs0"
docker run --rm --network mongo-rs --name mongo5 -d -v /data/mongo5/db:/data/db -p 27025:27017 mongo:latest --replSet "rs0"
docker run --rm --network mongo-rs --name mongo6 -d -v /data/mongo6/db:/data/db -p 27026:27017 mongo:latest --replSet "rs0"
说明:
- -v 参数:将 docker 容器内部 /data/db 目录挂载在宿主机 /data/mongo4/db 目录,防止容器重启时,数据丢失
- --network: 将 docker 容器划入 mongo-rs 网桥;
- --replSet: 命名副本集名称为 rs0;
4.进入 mongo1 客户端
//进入客户端
docker exec -it mongo1 mongosh
//启动一个副本集(即采用 mongo1 作为主节点)
rs.initiate()
//新增副本节点
rs.add('mongo2:27017')
rs.add('mongo3:27017')
rs.add('mongo4:27017')
rs.add('mongo5:27017')
rs.add('mongo6:27017')
注意:
新版的使用:docker exec -it mongo1 mongosh --port 27021:.进入 mongo1 客户端。
旧版的使用:docker exec -it mongo1 mongo --port 27021:.进入 mongo1 客户端。
这个时候集群已经创建好啦!!!!
5.验证集群运作
在主节点 mongo1 添加一条数据:
replSet1:PRIMARY> db.car.insert({"name":"奥迪"})
WriteResult({ "nInserted" : 1 })
在从节点 mongo2 mongo3 查看数据是否同步:
replSet1:SECONDARY> rs.secondaryOk() // 先允许读取操作在从节点执行
replSet1:SECONDARY> db.car.find()
{ "_id" : ObjectId("605ca97350221c02825ceaa7"), "name" : "奥迪" }
6.部署完成后常用维护
//1.进入 mongo1 客户端:
docker exec -it mongo1 mongosh
//2.在 mongo shell 中执行以下命令
rs.initiate() //启动一个副本集(即采用 mongo1 作为主节点)
rs.conf() //查看每个节点中 host、arbiterOnly、hidden、priority、 votes、slaveDelay等属性
rs.add('mongo2:27021') //新增节点
rs.remove('mongo2:27021') //删除节点
rs.status() //查看副本集状态
替换副本集节点
cfg = rs.conf()
cfg.members[0].host = "mongo1:27021"
rs.reconfig(cfg)