docker-compose for mongodb cluster sharded with replication
MongoDB [自动初始化] Docker Compose 分片集群
星标历史
PSS 风格(主-次-次)
DeepWIKI
https://deepwiki.com/minhhungit/mongodb-cluster-docker-compose
📖 目录
警告(Windows 和 OS X)
默认的 Docker 设置在 Windows 和 OS X 上使用 VirtualBox 虚拟机来托管 Docker 守护进程。 不幸的是,VirtualBox 用于宿主机系统和 Docker 容器之间共享文件夹的机制与 MongoDB 使用的内存映射文件不兼容(请参阅 vbox bug, docs.mongodb.org 以及相关的 jira.mongodb.org bug)。 这意味着无法将数据目录映射到宿主机来运行 MongoDB 容器。
注意:
如果您想要修改配置文件,在 Windows 上您可能需要将那些文件保存为 Unix(LF)模式的行结束转换。您可以使用 notepad++ 来完成这个操作 编辑菜单 => 行结束转换 => Unix
❓ Mongo 组件 🔝
- 配置服务器(3 个成员副本集):
configsvr01,configsvr02,configsvr03 - 3 个分片(每个是一个3个成员的
PSS副本集):shard01-a,shard01-b,shard01-cshard02-a,shard02-b,shard02-cshard03-a,shard03-b,shard03-c
- 2 个路由器(mongos):
router01,router02

✨ 安装 🔝
👉 一行命令(便捷)
docker-compose up -d && while true; do docker exec -it router-01 bash -c "echo 'sh.status()' | mongosh --port 27017" && break || sleep 2; done
👉 逐步手动操作指南
启动所有容器
我必须再次提醒,以防你错过了 😊 如果你需要设置使用密钥文件认证的集群,请查看这里
克隆这个仓库,在仓库文件夹中打开 PowerShell 或 cmd 并运行:
docker-compose up -d
该命令将触发 /scripts 文件夹中的某些入口文件,自动初始化分片集群/副本...
验证
- 检查集群初始化:
- 在启动集群之后,初始化过程可能需要大约30秒。
- 如果过程耗时更长,请检查容器日志以进行故障排除。
- 执行验证命令:使用以下命令来验证分片状态:
while true; do docker exec -it router-01 bash -c "echo 'sh.status()' | mongosh --port 27017" && break || sleep 2; done
- 该命令会在 router-01 容器中持续使用 sh.status() 检查分片状态。
- 如果状态获取未成功,它将每2秒重试一次。
- 若需进一步了解,请查看此步骤 ✅ 验证)
✨ 为您的数据库启用分片/分片键 🔝
docker-compose exec router01 mongosh --port 27017
// Enable sharding for database `MyDatabase`
sh.enableSharding("MyDatabase")
// Setup shardingKey for collection `MyCollection`**
db.adminCommand( { shardCollection: "MyDatabase.MyCollection", key: { oemNumber: "hashed", zipCode: 1, supplierId: 1 }, numInitialChunks: 3 } )
✔️ 完成!!!
顺便一提,如果您想尝试从运行 Docker 的宿主机连接到 MongoDB 集群,以下是 MongoDB 的连接字符串,以便您用 MongoDB Compass 进行连接。
mongodb://127.0.0.1:27117,127.0.0.1:27118
若您是一名.NET开发者,这里提供了一个MongoDB集群中READ/WRITE数据的示例:https://github.com/minhhungit/mongodb-cluster-docker-compose/tree/master/client
注意事项
如果您遇到错误信息“docker.errors.DockerException: Error while fetching server API version”,并且使用了WSL(Windows Subsystem for Linux),则需要为所需的发行版在Windows Docker Desktop中启用“WSL集成”(设置 -> 资源 -> WSL集成 -> 启用与所需发行版的集成)。

链接:https://stackoverflow.com/a/65347214/3007147
如果您遇到类似“E QUERY [thread1] SyntaxError: unterminated string literal @(shellhelp2)”的错误,问题可能是由于:
在Unix系统中,如果您的脚本使用的是Dos/Windows的行结束符(CRLF),而不是Unix的行结束符(LF),则会收到此错误。
要解决这个问题,请修改scripts文件夹中的脚本文件,删除换行符,将多行合并为单行。
或者,您可以在Notepad++中以Unix模式保存文件(编辑菜单 -> EOL转换 -> Unix)。
链接:https://stackoverflow.com/a/51728442/3007147
📋 验证 🔝
✅ 验证分片集群状态 🔝
docker-compose exec router01 mongosh --port 27017
sh.status()
示例结果:
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5d38fb010eac1e03397c355a")
}
shards:
{ "_id" : "rs-shard-01", "host" : "rs-shard-01/shard01-a:27017,shard01-b:27017,shard01-c:27017", "state" : 1 }
{ "_id" : "rs-shard-02", "host" : "rs-shard-02/shard02-a:27017,shard02-b:27017,shard02-c:27017", "state" : 1 }
{ "_id" : "rs-shard-03", "host" : "rs-shard-03/shard03-a:27017,shard03-b:27017,shard03-c:27017", "state" : 1 }
active mongoses:
"4.0.10" : 2
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
✅ 验证每个分片的副本集状态 🔝
您应当看到1个主节点,2个从节点。
docker exec -it shard-01-node-a bash -c "echo 'rs.status()' | mongosh --port 27017"
docker exec -it shard-02-node-a bash -c "echo 'rs.status()' | mongosh --port 27017"
docker exec -it shard-03-node-a bash -c "echo 'rs.status()' | mongosh --port 27017"
示例结果:
MongoDB shell version v4.0.11
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("dcfe5d8f-75ef-45f7-9595-9d72dc8a81fc") }
MongoDB server version: 4.0.11
{
"set" : "rs-shard-01",
"date" : ISODate("2019-08-01T06:53:59.175Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1564642438, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1564642438, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1564642438, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1564642438, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1564642428, 1),
"members" : [
{
"_id" : 0,
"name" : "shard01-a:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 390,
"optime" : {
"ts" : Timestamp(1564642438, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-08-01T06:53:58Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1564642306, 1),
"electionDate" : ISODate("2019-08-01T06:51:46Z"),
"configVersion" : 2,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "shard01-b:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 142,
"optime" : {
"ts" : Timestamp(1564642428, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1564642428, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-08-01T06:53:48Z"),
"optimeDurableDate" : ISODate("2019-08-01T06:53:48Z"),
"lastHeartbeat" : ISODate("2019-08-01T06:53:57.953Z"),
"lastHeartbeatRecv" : ISODate("2019-08-01T06:53:57.967Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "shard01-a:27017",
"syncSourceHost" : "shard01-a:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 2
},
{
"_id" : 2,
"name" : "shard01-c:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 142,
"optime" : {
"ts" : Timestamp(1564642428, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1564642428, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-08-01T06:53:48Z"),
"optimeDurableDate" : ISODate("2019-08-01T06:53:48Z"),
"lastHeartbeat" : ISODate("2019-08-01T06:53:57.952Z"),
"lastHeartbeatRecv" : ISODate("2019-08-01T06:53:57.968Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "shard01-a:27017",
"syncSourceHost" : "shard01-a:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 2
}
],
"ok" : 1,
"operationTime" : Timestamp(1564642438, 1),
"$gleStats" : {
"lastOpTime" : Timestamp(0, 0),
"electionId" : ObjectId("7fffffff0000000000000001")
},
"lastCommittedOpTime" : Timestamp(1564642438, 1),
"$configServerState" : {
"opTime" : {
"ts" : Timestamp(1564642426, 2),
"t" : NumberLong(1)
}
},
"$clusterTime" : {
"clusterTime" : Timestamp(1564642438, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
bye
✅ 检查数据库状态 🔝
docker-compose exec router01 mongosh --port 27017
use MyDatabase
db.stats()
db.MyCollection.getShardDistribution()
示例结果:
{
"raw" : {
"rs-shard-01/shard01-a:27017,shard01-b:27017,shard01-c:27017" : {
"db" : "MyDatabase",
"collections" : 1,
"views" : 0,
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 4096,
"numExtents" : 0,
"indexes" : 2,
"indexSize" : 8192,
"fsUsedSize" : 12439990272,
"fsTotalSize" : 62725787648,
"ok" : 1
},
"rs-shard-03/shard03-a:27017,shard03-b:27017,shard03-c:27017" : {
"db" : "MyDatabase",
"collections" : 1,
"views" : 0,
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 4096,
"numExtents" : 0,
"indexes" : 2,
"indexSize" : 8192,
"fsUsedSize" : 12439994368,
"fsTotalSize" : 62725787648,
"ok" : 1
},
"rs-shard-02/shard02-a:27017,shard02-b:27017,shard02-c:27017" : {
"db" : "MyDatabase",
"collections" : 1,
"views" : 0,
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 4096,
"numExtents" : 0,
"indexes" : 2,
"indexSize" : 8192,
"fsUsedSize" : 12439994368,
"fsTotalSize" : 62725787648,
"ok" : 1
}
},
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 12288,
"numExtents" : 0,
"indexes" : 6,
"indexSize" : 24576,
"fileSize" : 0,
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
},
"ok" : 1,
"operationTime" : Timestamp(1564004884, 36),
"$clusterTime" : {
"clusterTime" : Timestamp(1564004888, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
🔎 更多命令 🔝
docker exec -it mongo-config-01 bash -c "echo 'rs.status()' | mongosh --port 27017"
docker exec -it shard-01-node-a bash -c "echo 'rs.help()' | mongosh --port 27017"
docker exec -it shard-01-node-a bash -c "echo 'rs.status()' | mongosh --port 27017"
docker exec -it shard-01-node-a bash -c "echo 'rs.printReplicationInfo()' | mongosh --port 27017"
docker exec -it shard-01-node-a bash -c "echo 'rs.printSlaveReplicationInfo()' | mongosh --port 27017"
✦ 正常启动 🔝
集群仅需在首次运行时进行初始化。
之后的启动可以通过执行 docker-compose up 或者 docker-compose up -d 来实现。
✦ 重置集群 🔝
若要删除所有数据并重新初始化集群,请确保容器已停止,然后:
docker-compose rm
✦ 清理 docker-compose 🔝
docker-compose down -v --rmi all --remove-orphans
📺 屏幕截图 🔝




👌 捐赠 ^^ 🔝
如果您喜欢我的作品并愿意提供支持,您随时可以请我喝杯咖啡 ☕️
我将不胜感激 ❤️❤️❤️
📚 参考文献 🔝
Introduction
Docker-Compose 用于部署具有复制集的MongoDB分片集群【此简介由AI生成】