温馨提示×

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() 持续观察分布与负载。

0