需先安装docker与docker compose,拉取mongo:6.0镜像,创建命名卷,再通过docker-compose.yml定义config server、3个shard及mongos服务,依次初始化副本集、添加分片、启用分片并验证。

准备基础环境与镜像
确保宿主机已安装 Docker 和 Docker Compose,MongoDB 分片集群至少需要 3 类服务:配置服务器(config server)、分片节点(shard)和路由节点(mongos)。官方推荐使用 MongoDB 6.0+ 镜像,它原生支持分片初始化脚本。拉取镜像时建议指定版本,避免使用 latest:
docker pull mongo:6.0- 不建议混用不同大版本(如 5.x 和 6.x),否则 config server 协议不兼容
- 若需持久化,提前创建命名卷:
docker volume create mongo-configdb、docker volume create mongo-shard1等
编写 docker-compose.yml 构建多节点拓扑
一个最小可用的 3 分片集群可包含:1 个 config server 副本集(3 节点)、3 个 shard 副本集(每 shard 至少 1 主 2 副,此处简化为单节点 shard 用于测试)、1 个 mongos。以下为精简版 docker-compose.yml 示例(生产环境应拆分网络、调整资源限制):
version: '3.8'
services:
# 配置服务器副本集(必须是奇数节点,最小 1)
config1:
image: mongo:6.0
command: mongod --configsvr --replSet configReplSet --bind_ip_all --port 27019
ports: ["27019:27019"]
volumes: ["mongo-configdb:/data/configdb"]
<h1>分片节点(shard1, shard2, shard3 各自独立副本集)</h1><p>shard1:
image: mongo:6.0
command: mongod --shardsvr --replSet shard1ReplSet --bind_ip_all --port 27018
ports: ["27018:27018"]
volumes: ["mongo-shard1:/data/db"]</p><p>shard2:
image: mongo:6.0
command: mongod --shardsvr --replSet shard2ReplSet --bind_ip_all --port 27017
ports: ["27017:27017"]
volumes: ["mongo-shard2:/data/db"]</p><p>shard3:
image: mongo:6.0
command: mongod --shardsvr --replSet shard3ReplSet --bind_ip_all --port 27016
ports: ["27016:27016"]
volumes: ["mongo-shard3:/data/db"]</p><h1>路由服务(mongos,不存数据,仅转发)</h1><p>mongos:
image: mongo:6.0
command: mongos --configdb configReplSet/config1:27019 --bind_ip_all --port 27017
ports: ["27017:27017"]
depends_on: [config1, shard1, shard2, shard3]
</p>
⚠️ 注意:mongos 的端口不要和任意 shard 冲突;config server 必须先启动并完成初始化才能启动 mongos。
初始化副本集与启用分片
容器启动后需手动初始化各副本集,并将分片加入集群。按顺序执行以下步骤(使用 docker exec -it <container> mongo</container> 进入):
-
初始化 config server 副本集:
rs.initiate({ _id: "configReplSet", configsvr: true, members: [{ _id: 0, host: "config1:27019" }] }) -
初始化每个 shard 副本集(分别进入 shard1/shard2/shard3 容器):
rs.initiate({ _id: "shard1ReplSet", members: [{ _id: 0, host: "shard1:27018" }] })
同理替换shard2ReplSet/shard3ReplSet和对应 host -
连接 mongos 并添加分片(进入 mongos 容器):
mongos> sh.addShard("shard1ReplSet/shard1:27018")mongos> sh.addShard("shard2ReplSet/shard2:27017")mongos> sh.addShard("shard3ReplSet/shard3:27016") -
验证分片状态:
mongos> sh.status()—— 应显示 3 个 shard、chunks 分布及 balancer 状态
创建分片集合与测试写入
分片生效前,需对数据库和集合显式启用分片,并指定分片键。例如对 mydb.users 按 _id 哈希分片:
- 启用数据库分片:
sh.enableSharding("mydb") - 对集合分片(需有索引支持):
sh.shardCollection("mydb.users", { _id: "hashed" }) - 插入测试数据验证分片效果:
for (let i=0; i - 检查分片分布:
sh.status()或db.users.getShardDistribution()
注意:分片键一旦设定不可更改;生产环境推荐使用高基数、写入均匀的字段(如 userId),避免用单调递增的 _id 导致热点分片。










