MongoDB在Linux环境下的分片集群由三大核心组件构成,需提前规划部署:
工作原理:根据分片键的值范围将数据划分为多个chunk(如{name:1}的range分片,数据按name字段的字母顺序分布),每个chunk对应一个分片。
适用场景:数据有明显范围特征且需频繁进行范围查询(如时间戳、地理位置、用户年龄区间)。例如,按createdate字段分片,可快速查询某个月份的所有订单。
优缺点:
工作原理:对分片键的值应用哈希函数(如MD5、SHA-1),将哈希结果映射到固定范围的chunk(如0~2^64-1),实现数据均匀分布。
适用场景:数据无明显范围特征、需要随机写入或无特定范围查询需求(如用户ID、设备ID)。例如,按userid字段哈希分片,可避免新用户集中写入同一分片。
优缺点:
工作原理:通过标签(Zone)将分片与特定数据范围关联(如Asia标签对应country: "China"的数据),mongos会根据分片键的标签将数据路由到对应分片。
适用场景:需根据地理位置、数据中心、业务模块等逻辑条件分配数据(如国内用户数据存储在上海分片,海外用户存储在新加坡分片)。
优缺点:
分片键是分片策略的核心,直接影响集群性能。需遵循以下原则:
userid、orderid),避免低基数字段(如gender、country),否则会导致数据分布不均。_id),这类字段会导致新数据集中写入同一分片,形成热点。status、region),使查询能通过分片键直接定位到目标分片,减少跨分片查询。{region:1, userid:1}),结合范围和哈希的优点(如按地区范围划分,再按用户ID哈希,兼顾范围查询与数据均匀性)。--configsvr参数和复制集名称(如rs.initiate({_id: "configReplSet", members: [{_id:0, host:"192.168.1.1:27019"}, {_id:1, host:"192.168.1.2:27019"}, {_id:2, host:"192.168.1.3:27019"}]}))。--shardsvr参数和复制集名称(如rs.initiate({_id: "shard1", members: [{_id:0, host:"192.168.1.4:27018"}, {_id:1, host:"192.168.1.5:27018"}]}))。mongos --configdb configReplSet/192.168.1.1:27019,192.168.1.2:27019,192.168.1.3:27019 --port 28017)。sh.enableSharding("<database>")命令(如sh.enableSharding("testdb")),指定需要分片的数据库。db.person.createIndex({userid: "hashed"}),哈希分片需使用"hashed"索引类型)。sh.shardCollection("<database>.<collection>", <shardKey>)命令(如sh.shardCollection("testdb.person", {userid: "hashed"}),范围分片则使用{userid:1})。mongodump导出数据,创建新分片集合后重新导入。sh.setBalancerState(false)临时关闭,避免迁移影响业务性能。sh.status()命令定期查看分片状态(如chunk分布、分片负载);通过mongostat监控写入负载,及时调整分片策略。