MongoDB [自动init]与Docker组成的碎片集群
星历史
PSS样式(主要 – 次级 – 次要)
- 需要PSA吗?在这里检查
- 如果您需要使用KeyFile身份验证设置群集,请在此处检查
Deepwiki
https://*deepwiki.*c*om/minhhungit/mongodb–cluster–docker–compose
目录
- ❓mongo组件?
- 安装
- 在线命令
- 逐步手动
- 为数据库启用碎片/碎片键
- ✅验证
- 验证碎片集群的状态
- 验证每个碎片的副本设置的状态
- 检查数据库状态
- ?更多命令
- 普通启动
- 重置群集
- 清理Docker-Compose
- 截屏
- ?捐赠^^
- 反思
警告(Windows&OS X)
Windows和OS X上的默认Docker设置使用VirtualBox VM托管Docker守护程序。不幸的是,VirtualBox用来在主机系统和Docker容器之间共享文件夹的机制与MongoDB使用的内存映射文件不兼容(请参见Vbox Bug,docs.mongodb.org和相关的jira.mongodb.org bug)。这意味着不可能运行将数据目录映射到主机的mongoDB容器。
– Docker Hub(来源此处或此处)
笔记:
如果要修改配置文件,在Windows上,您可能需要使用EOL转换UNIX(LF)模式保存这些文件。您可以使用Notepad ++进行编辑菜单=> EOL转换=> unix
❓mongo组件?
- config Server(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
安装?
在线命令(便利)
克隆此存储库,在存储夹上打开PowerShell或CMD并运行:
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
该命令将在 /脚本文件夹中触发某些入门点文件以自动启动shard cluster /replicas …
核实
- 检查群集初始化:
- 开始群集后,初始化可能需要大约30秒。
- 如果过程需要更长的时间,请检查容器日志是否进行故障排除。
- 运行验证命令:使用以下命令验证碎片状态:
while true ; do docker exec -it router-01 bash -c \" echo \'sh.status()\' | mongosh --port 27017 \" && break || sleep 2 ; done
- 此命令使用路由器-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 } )
✔️完成了!!!
顺便说一句,如果您想尝试将MongoDB群集与主机计算机(正在运行Docker)连接MongoDB群集,这是MongoDB连接字符串
mongodb://127.0.0.1:27117,127.0.0.1:27118
如果您是.NET开发人员,则在MongoDB群集中有一个示例读/写数据:https://github.com/minhhungit/mongodb-cluster-docker-docker-docker-compose/tree/master/master/client
笔记
如果遇到错误“ Docker.errors.dockerexception:获取服务器API版本时的错误”,并且使用的WSL(Windows子系统为Linux)需要在Windows Docker Desktop中启用“ WSL”的“ WSL”(wsl -> resative-> Resources-> wsl-> wsl集成 – >启用与Distos的集成)。
链接:https://stackoverflow.com/a/65347214/3007147
如果您收到“ e query [thread1] syntaxerror:未终止的字符串literal @(shellHelp2)”之类的错误,则可能是由于:
在UNIX上,如果您的脚本具有DOS/Windows端线(CRLF)而不是线路(LF)的UNIX端(LF),则将获得此错误。
要修复它,请在脚本文件夹中修改脚本文件,删除newline,将多行更改为一行。
或在记事本++编辑菜单中使用UNIX模式保存文件=> eol Conversion => 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或Docker-Compose -D来实现随后的启动-D
✦重置群集?
要删除所有数据并重新定位集群,请确保容器被停止,然后:
docker-compose rm
✦清理Docker-Compose?
docker-compose down -v --rmi all --remove-orphans
屏幕截图?
?捐赠^^?
如果您喜欢我的作品并且想支持,那么您可以随时给我买咖啡☕️
我会很感激❤️❤️❤️
反向?
- https://git*h*ub*.com/jfollenfant/mongodb-sharding-docker-compose
- https://vibl**o.as*ia/p/cai-dat-mongo-cluster-voi-docker-m68z0nn25kg
