MongoDB Shard Docker 部署
部署环境
主机地址 | 主机配置 | 主机系统 |
---|---|---|
Mongodb1/192.168.31.135 | 2CPU 4GB | Debian12 |
Mongodb2/192.168.31.109 | 2CPU 4GB | Debian12 |
Mongodb3/192.168.31.165 | 2CPU 4GB | Debian12 |
镜像版本
mongodb/mongodb-community-server:5.0.27-ubuntu2004
部署集群
部署 Config Server 集群
分别在三台上启动 Config Server 容器
# mongodb1
docker run -d --name configsvr1 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v configsvr1_data:/data/configdb \
-p 27019:27019 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --configsvr --replSet configReplSet --bind_ip_all
# mongodb2
docker run -d --name configsvr2 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v configsvr2_data:/data/configdb \
-p 27019:27019 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --configsvr --replSet configReplSet --bind_ip_all
# mongodb3
docker run -d --name configsvr3 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v configsvr3_data:/data/configdb \
-p 27019:27019 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --configsvr --replSet configReplSet --bind_ip_all
初始化 Config Server 复制集
- 登录 configsvr1 容器
docker exec -it configsvr1 mongo --port 27019
- 执行初始化脚本
rs.initiate({
_id: "configReplSet",
configsvr: true,
members: [
{ _id: 0, host: "192.168.31.135:27019" },
{ _id: 1, host: "192.168.31.109:27019" },
{ _id: 2, host: "192.168.31.165:27019" }
]
})
- 验证状态
rs.status()
部署 Shard Server 集群
在 mongo1 上部署容器
docker run -d --name shard1_node1 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v shard1_node1_data:/data/db \
-p 27018:27018 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --shardsvr --replSet shard1ReplSet --bind_ip_all
docker run -d --name shard2_node1 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v shard2_node1_data:/data/db \
-p 27017:27018 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --shardsvr --replSet shard2ReplSet --bind_ip_all
docker run -d --name shard3_node1 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v shard3_node1_data:/data/db \
-p 27016:27018 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --shardsvr --replSet shard3ReplSet --bind_ip_all
在 mongo2 上部署容器
docker run -d --name shard1_node2 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v shard1_node2_data:/data/db \
-p 27018:27018 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --shardsvr --replSet shard1ReplSet --bind_ip_all
docker run -d --name shard2_node2 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v shard2_node2_data:/data/db \
-p 27017:27018 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --shardsvr --replSet shard2ReplSet --bind_ip_all
docker run -d --name shard3_node2 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v shard3_node2_data:/data/db \
-p 27016:27018 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --shardsvr --replSet shard3ReplSet --bind_ip_all
在 mongo3 上部署容器
docker run -d --name shard1_node3 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v shard1_node3_data:/data/db \
-p 27018:27018 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --shardsvr --replSet shard1ReplSet --bind_ip_all
docker run -d --name shard2_node3 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v shard2_node3_data:/data/db \
-p 27017:27018 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --shardsvr --replSet shard2ReplSet --bind_ip_all
docker run -d --name shard3_node3 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
-v shard3_node3_data:/data/db \
-p 27016:27018 \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 \
mongod --shardsvr --replSet shard3ReplSet --bind_ip_all
将 shard1 shard2 shard3 容器初始化并验证
docker exec -it shard1_node1 mongo --port 27018
rs.initiate({
_id: "shard1ReplSet",
members: [
{ _id: 0, host: "192.168.31.135:27018" },
{ _id: 1, host: "192.168.31.109:27018" },
{ _id: 2, host: "192.168.31.165:27018" }
]
})
rs.status()
docker exec -it shard2_node1 mongo --port 27018
rs.initiate({
_id: "shard2ReplSet",
members: [
{ _id: 0, host: "192.168.31.135:27017" },
{ _id: 1, host: "192.168.31.109:27017" },
{ _id: 2, host: "192.168.31.165:27017" }
]
})
rs.status()
docker exec -it shard3_node1 mongo --port 27018
rs.initiate({
_id: "shard3ReplSet",
members: [
{ _id: 0, host: "192.168.31.135:27016" },
{ _id: 1, host: "192.168.31.109:27016" },
{ _id: 2, host: "192.168.31.165:27016" }
]
})
rs.status()
部署 Mongos 路由器
docker run -d --name mongos -p 27015:27017 \
--log-opt max-size=100m --log-opt max-file=3 --restart=unless-stopped \
mongodb/mongodb-community-server:5.0.27-ubuntu2004 mongos --bind_ip_all --configdb configReplSet/192.168.31.135:27019,192.168.31.109:27019,192.168.31.165:27019
关联 Shard 集群至 Config 集群
docker exec -it mongos mongo
sh.addShard("shard1ReplSet/192.168.31.135:27018,192.168.31.109:27018,192.168.31.165:27018")
sh.addShard("shard2ReplSet/192.168.31.135:27017,192.168.31.109:27017,192.168.31.165:27017")
sh.addShard("shard3ReplSet/192.168.31.135:27016,192.168.31.109:27016,192.168.31.165:27016")
数据库手动指定分片
使能分片数据库
sh.enableSharding("metadata")
指定分片集合
# sh.shardCollection("mydatabase.mycollection", { myfield: 1 })
sh.shardCollection("metadata.file-10-million", { key: 1 })
查看分片分布
# db.collection.getShardDistribution()
db['file-10-million'].getShardDistribution()