如何在MongoDB中实现按时间跨度的分片路由_时间序列范围分片与冷热节点架构

时间序列分片必须用 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 一款专业的视频字幕制作和视频处理工具

相关推荐
Databend2 分钟前
AST Visitor API 迁移,怎么证明 AI 没改坏 SQL 语义?
数据库·ai编程
TDengine (老段)6 分钟前
TDengine DDL 完整参考 — Database/STable/Table/Column/Tag
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
xlxxy_7 分钟前
sap获取批次特性报表
java·linux·开发语言·前端·数据库·abap·mm
俺不中嘞17 分钟前
python常用函数
开发语言·python
栋***t18 分钟前
从“工具”到“基建”,麦塔在线考试系统经历的时代变局与定位逻辑
java·大数据·数据库·开源软件·无纸化
SelectDB技术团队25 分钟前
Agent 可观测性:Apache Doris / SelectDB 的技术能力、选型对比与实践
数据库·人工智能·agent·可观测·ai-native·apache doris·selectdb
csdn2015_28 分钟前
kafka如何确保消息不丢失
数据库·分布式·kafka
wefg128 分钟前
【MySQL】MySQL C API 访问 MySQL
数据库·mysql
薛定猫AI29 分钟前
【技术干货】大模型文档结构化提取实战:Python解析PDF发票并批量生成CSV
java·python·pdf
zhiSiBuYu051736 分钟前
RAG 性能优化与缓存策略实战指南
人工智能·python·机器学习