- 首页 >
- 问答 >
-
云计算 >
- MongoDB配置中的sharding怎么设置
MongoDB配置中的sharding怎么设置
小樊
35
2025-12-17 11:32:58
MongoDB 分片配置步骤与要点
一 架构与前提
- 组件与职责
- Shard:存储实际数据,生产建议使用副本集实现高可用。
- Config Server 副本集(CSRS):保存集群元数据(如分片、chunk 信息),生产至少3 个成员。
- mongos 路由:客户端入口,负责请求路由与结果合并,通常部署2 个及以上以便高可用。
- 连接与命名
- 集群内所有节点需互通,优先使用DNS 主机名而非 IP;自 MongoDB 5.0 起仅配置 IP 的节点可能无法通过启动验证。
- 安全建议:生产启用身份验证与基于角色的访问控制(RBAC),内部通信推荐 x.509 证书。
二 部署步骤
- 1 部署配置服务器副本集(CSRS)
- 配置示例(命令行):
- mongod --configsvr --replSet cfgrs --dbpath /data/configdb --port 27019 --bind_ip localhost,cfg1.example.net
- 连接到任一配置服务器并初始化:
- rs.initiate({
_id: “cfgrs”,
configsvr: true,
members: [
{ _id: 0, host: “cfg1.example.net:27019” },
{ _id: 1, host: “cfg2.example.net:27019” },
{ _id: 2, host: “cfg3.example.net:27019” }
]
})
- 2 部署分片副本集(每个分片一个副本集)
- 配置示例(命令行):
- mongod --shardsvr --replSet shardrs0 --dbpath /data/shard0 --port 27018 --bind_ip localhost,shard0a.example.net
- mongod --shardsvr --replSet shardrs1 --dbpath /data/shard1 --port 27019 --bind_ip localhost,shard1a.example.net
- 分别连接并初始化各分片的副本集(rs.initiate),确保分片副本集名称与 CSRS 不同。
- 3 启动 mongos 路由
- 启动示例:
- mongos --configdb cfgrs/cfg1.example.net:27019,cfg2.example.net:27019,cfg3.example.net:27019 --port 27017 --bind_ip localhost,router.example.net
- 4 通过 mongos 添加分片
- 添加分片(副本集写法):
- sh.addShard(“shardrs0/shard0a.example.net:27018,shard0b.example.net:27018”)
- sh.addShard(“shardrs1/shard1a.example.net:27019,shard1b.example.net:27019”)
- 验证:sh.status() 查看分片与状态。
三 为数据库与集合启用分片
- 1 启用数据库分片
- sh.enableSharding(“mydb”)
- 2 为集合选择片键并创建索引
- 范围分片:db.orders.createIndex({ customerId: 1 })
- 哈希分片:db.sessions.createIndex({ sessionId: “hashed” })
- 3 对集合启用分片
- 范围分片:sh.shardCollection(“mydb.orders”, { customerId: 1 })
- 哈希分片:sh.shardCollection(“mydb.sessions”, { sessionId: “hashed” })
- 4 验证与观察
- sh.status() 查看 chunks 在各分片的分布;必要时调整均衡器活动窗口,在业务低峰期执行。
四 片键选择与版本能力
- 片键策略
- 范围分片:利于范围查询,但可能产生热点;适合片键非单调、基数大、重复低且有范围查询的场景。
- 哈希分片:写入更均衡,适合单调递增 ID、需要写分散的场景;范围查询需广播到多分片。
- 可用复合片键(如低基数字段 + 单调递增字段)平衡分布与查询。
- 片键可变更能力
- 4.4:可用 refineCollectionShardKey 为片键添加后缀字段优化。
- 5.0:可用 reshardCollection 完全更换片键(会重写数据,谨慎评估窗口与资源)。
五 生产注意事项
- 高可用与规模
- CSRS ≥ 3 成员;每个分片建议3 成员副本集;mongos ≥ 2 实例避免单点。
- 网络与命名
- 使用DNS 主机名;开放必要端口(如 27017/27018/27019);保证节点间双向可达。
- 安全
- 启用认证与RBAC,内部通信使用 x.509;限制来源 IP 与端口。
- 运维
- 在低峰期执行分片/重分片;按需设置均衡器活动窗口;通过 sh.status()、db.stats() 持续观察分布与负载。