mongodb-cluster-docker-compose:一键搭建MongoDB分片集群,支持自动初始化与副本集配置

docker-compose for mongodb cluster sharded with replication

Branch9Tags0
This repository is empty

MongoDB [自动初始化] Docker Compose 分片集群

星标历史

星标历史图表

PSS 风格(主-次-次)

  • 需要PSA?请查看这里
  • 如果需要设置使用 keyfile 认证的分片集群,请查看这里

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 容器。

– Docker Hub (来源在这里在这里)


注意:

如果您想要修改配置文件,在 Windows 上您可能需要将那些文件保存为 Unix(LF)模式的行结束转换。您可以使用 notepad++ 来完成这个操作 编辑菜单 => 行结束转换 => Unix


❓ Mongo 组件 🔝

  • 配置服务器(3 个成员副本集):configsvr01,configsvr02,configsvr03
  • 3 个分片(每个是一个3个成员的 PSS 副本集):
    • shard01-a,shard01-b, shard01-c
    • shard02-a,shard02-b, shard02-c
    • shard03-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 文件夹中的某些入口文件,自动初始化分片集群/副本...

验证

  1. 检查集群初始化:
  • 在启动集群之后,初始化过程可能需要大约30秒。
  • 如果过程耗时更长,请检查容器日志以进行故障排除。
  1. 执行验证命令:使用以下命令来验证分片状态:
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集成 -> 启用与所需发行版的集成)。

WSL2集成设置

链接: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

📺 屏幕截图 🔝


👌 捐赠 ^^ 🔝

如果您喜欢我的作品并愿意提供支持,您随时可以请我喝杯咖啡 ☕️

在 ko-fi.com 请我喝咖啡

我将不胜感激 ❤️❤️❤️


📚 参考文献 🔝

Introduction

Docker-Compose 用于部署具有复制集的MongoDB分片集群【此简介由AI生成】

Customize your domain