时间序列分片必须用 range 而非 hashed 索引,因需按时间范围(如按月)路由查询;分片键须为单调递增的 Date/ISODate 类型时间字段,且需预先建索引;冷热分离依赖 sh.addShardTag() 与 sh.addTagRange() 的严格顺序配合,边界值类型必须一致,查询条件类型也须匹配分片键。时间序列分片必须用 hashed 索引?错,range 才是核心时间跨度分片不是靠哈希打散,而是靠时间字段的有序性做范围切分。MongoDB 的 shardCollection 命令只接受 range 或 hashed 分片键,而时间序列场景下,range 是唯一能支撑"按月/按天路由"的方式------否则查 2024-06 的数据会扫全集群。常见错误现象:sh.addShardTag("shard01", "hot") 配了标签但查询没走对应节点,本质是分片键没对齐时间范围。分片键必须是时间字段(如 ts),且类型为 Date 或 ISODate;NumberLong 也可,但需确保单调递增、无重复不要用 _id 或复合键里混入非时间字段(比如 {ts: 1, region: 1}),否则范围无法连续,sh.splitAt() 会失效建集合前必须先在分片键上建索引:db.metrics.createIndex({ts: 1}),否则 shardCollection 报 Cannot shard collection without an index on the shard key冷热分离靠 sh.addShardTag() + sh.addTagRange(),但顺序不能反标签本身不路由,它只是"描述能力";真正生效的是 sh.addTagRange() 绑定的范围和标签之间的映射关系。如果先绑范围再加标签,或者标签名拼错,路由就静默失效------查冷数据仍发往热节点。使用场景:把 ts <= ISODate("2024-01-01") 的 chunk 全部迁到 shard-cold,热数据留在 shard-hot。必须先执行 sh.addShardTag("shard-cold", "cold"),再执行 sh.addTagRange("db.metrics", {ts: MinKey}, {ts: ISODate("2024-01-01")}, "cold")范围边界值必须与分片键类型严格一致:用 MinKey / MaxKey,别手写 null 或 new Date(0),否则报 Range must be valid迁移不是即时的:sh.status() 里看到 tags 已配,但 chunk 还在原节点,得等 balancer 下次触发或手动 sh.moveChunk()sh.splitAt() 手动切分 chunk,但时间点选错会导致数据倾斜自动分片靠插入触发,但时间序列写入集中在最新窗口(比如每秒写 2024-06-15T14:00:00Z),旧时间范围 chunk 一直不裂开,最终一个 chunk 几百 GB 卡死迁移。必须主动按时间点切分。 Zeemo AI 一款专业的视频字幕制作和视频处理工具
相关推荐
爱写代码的阿森17 分钟前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解Database_Cool_34 分钟前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移玉鸯1 小时前
Agent Hook:在概率推理之上,为 Agent 叠加确定性控制姜太小白1 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南weixin_446260852 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架窝子面2 小时前
手搓最简前后端协作-node我的xiaodoujiao2 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2吳所畏惧2 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?DFT计算杂谈2 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型