时间序列分片必须用 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 一款专业的视频字幕制作和视频处理工具
相关推荐
woxihuan1234561 小时前
SQL处理大规模分组聚合的内存限制_调整服务器配置2401_833033621 小时前
如何用 http 模块创建一个基础的 Web 服务器处理请求CLX05052 小时前
golang如何实现群聊功能_golang群聊功能实现策略.txtzadyd3 小时前
vLLM Linux 双卡部署大模型服务器指南WiChP3 小时前
【V0.1B8】从零开始的2D游戏引擎开发之路米粒13 小时前
力扣算法刷题 Day 63 Bellman_ford 算法紫小米9 小时前
后端日志管理白雪茫茫10 小时前
监督学习、半监督学习、无监督学习算法详解つ安静与叛逆的小籹人11 小时前
小红书API:通过笔记ID获取笔记详情数据教程