MongoDB 6按集合分片求助:分片键理解与集合分片配置
MongoDB分片配置解决方案
问题背景
- 集群部署:3台机器,每台部署1个config server节点、1个shard1节点、1个shard2节点,其中一台额外部署路由节点,集群运行正常
- 目标库表:
pisidg23数据库包含两个集合:se_temp:字段为InsertDate、Reading、SensorID(SensorID仅1-3个可选值)se_door:字段为InsertDate、From、To(From/To值范围1-10)
- 需求:将两个集合分别分配到独立分片,多数查询基于
InsertDate,当前配置未达预期 - 当前集群状态(
sh.status()输出):
shardingVersion { _id: 1, minCompatibleVersion: 5, currentVersion: 6, clusterId: ObjectId("647216f9180976b065bb2686") } --- shards [ { _id: 'shard1ReplSet', host: 'shard1ReplSet/X.X.X.X:27013,X.X.X.X:27011,X.X.X.X:27012', state: 1, topologyTime: Timestamp({ t: 1685198765, i: 3 }) }, { _id: 'shard2ReplSet', host: 'shard2ReplSet/X.X.X.X:27023,X.X.X.X:27021,X.X.X.X:27022', state: 1, topologyTime: Timestamp({ t: 1685198770, i: 3 }) } ] --- most recently active mongoses [ { '6.0.4': 1 } ] --- autosplit { 'Currently enabled': 'yes' } --- balancer { 'Currently running': 'yes', 'Currently enabled': 'yes', 'Failed balancer rounds in last 5 attempts': 0, 'Migration Results for the last 24 hours': 'No recent migrations' } --- databases [ { database: { _id: 'config', primary: 'config', partitioned: true }, collections: { 'config.system.sessions': { shardKey: { _id: 1 }, unique: false, balancing: true, chunkMetadata: [ { shard: 'shard1ReplSet', nChunks: 1024 } ], chunks: [ 'too many chunks to print, use verbose if you want to force print' ], tags: [] } } }, { database: { _id: 'pisidg23', primary: 'shard2ReplSet', partitioned: false, version: { uuid: new UUID("ce24dbdb-8eaf-4b83-9103-6636590e6efd"), timestamp: Timestamp({ t: 1685198773, i: 1 }), lastMod: 1 } }, collections: {} } ]
配置步骤
1. 启用数据库分片
当前pisidg23数据库partitioned为false,先开启分片支持:
sh.enableSharding("pisidg23")
2. 为集合配置定向分片
通过分片键+标签绑定,实现单个集合独占指定分片:
配置se_temp到shard1ReplSet
- 以
InsertDate为分片键启用集合分片(匹配查询模式,提升路由效率):
sh.shardCollection("pisidg23.se_temp", { InsertDate: 1 })
- 给目标分片打标签,并将集合全数据范围绑定到该标签:
// 给shard1添加标签 sh.addShardTag("shard1ReplSet", "temp_shard") // 将se_temp的所有数据范围映射到temp_shard标签 sh.addTagRange("pisidg23.se_temp", { InsertDate: MinKey }, { InsertDate: MaxKey }, "temp_shard")
配置se_door到shard2ReplSet
- 同样以
InsertDate为分片键启用集合分片:
sh.shardCollection("pisidg23.se_door", { InsertDate: 1 })
- 给shard2打标签并绑定集合全数据范围:
sh.addShardTag("shard2ReplSet", "door_shard") sh.addTagRange("pisidg23.se_door", { InsertDate: MinKey }, { InsertDate: MaxKey }, "door_shard")
3. 验证配置
执行sh.status()查看更新后的集群状态,此时pisidg23会显示partitioned: true,两个集合会关联对应分片标签,数据将定向存储到指定分片。
内容的提问来源于stack exchange,提问作者Alexandre Torres
相关产品推荐
相关产品推荐

