如何在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 一款专业的视频字幕制作和视频处理工具

相关推荐
2601_962299242 小时前
Azure python操作系统列表
python·操作系统·azure·虚拟机·存储配置文件
知行合一。。。2 小时前
RAG--03--Milvus基本用法
数据库·oracle·milvus
TDengine (老段)3 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
学术 学术 Fun3 小时前
如何用 API 与 Webhook 批量把图表图片转换成 VSDX
python·自动化·api·visio
上学的小垃圾4 小时前
01-数据库系统概述
数据库
2601_962100544 小时前
python包和模块的内容整理
python·模块·导入·虚拟环境·
二进制漫游记5 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996225 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
-今昭-5 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
2601_962381586 小时前
【转】Python渗透测试工具:sqlmap
python·渗透测试·sql注入·sqlmap·数据库安全