MongoDB 分片(Sharding)使用指南
MongoDB 分片是一种将数据分布在多个服务器上的方法,用于支持海量数据和高吞吐量操作。下面是 MongoDB 分片的基本使用方法和配置步骤:
分片集群组件
-
分片(Shards):存储实际数据的 MongoDB 实例
-
配置服务器(Config Servers):存储集群的元数据和配置信息
-
查询路由器(Mongos):客户端连接的入口,路由查询到正确的分片
分片集群搭建步骤
1. 启动配置服务器
mongod --configsvr --dbpath /data/configdb --port 27019 --replSet configReplSet
初始化配置服务器副本集:
rs.initiate({
_id: "configReplSet",
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 --dbpath /data/shard1 --port 27018 --replSet shardReplSet1
初始化分片副本集:
rs.initiate({
_id: "shardReplSet1",
members: [
{ _id: 0, host: "shard1a.example.net:27018" },
{ _id: 1, host: "shard1b.example.net:27018" },
{ _id: 2, host: "shard1c.example.net:27018", arbiterOnly: true }
]
})
3. 启动 mongos 路由器
mongos --configdb configReplSet/cfg1.example.net:27019,cfg2.example.net:27019,cfg3.example.net:27019 --port 27017
4. 添加分片到集群
连接到 mongos,然后执行:
sh.addShard("shardReplSet1/shard1a.example.net:27018,shard1b.example.net:27018")
启用数据库和集合的分片
1. 启用数据库分片
sh.enableSharding("yourDatabase")
2. 选择分片键并启用集合分片
sh.shardCollection("yourDatabase.yourCollection", { "shardKeyField": 1 } )
分片策略
-
范围分片(Ranged Sharding):基于值的范围分布数据
-
适合范围查询
-
可能导致数据分布不均匀
-
-
哈希分片(Hashed Sharding):使用哈希索引分布数据
-
数据分布更均匀
-
不支持范围查询
-
分片键选择建议
-
选择基数高(大量不同值)的字段
-
选择查询频繁使用的字段
-
避免单调递增的分片键(如时间戳、自增ID)
-
考虑使用复合分片键
监控分片集群
sh.status() // 查看分片状态
db.stats() // 查看数据库统计信息
db.collection.stats() // 查看集合统计信息
注意事项
-
分片键一旦选择就不能更改
-
分片前确保有足够的硬件资源
-
监控数据分布是否均衡
-
考虑预分割数据以避免初始热点问题
分片是 MongoDB 的高级功能,建议在生产环境使用前充分测试,并参考 MongoDB 官方文档获取最新配置信息。