业务系统跑上几年,几乎都会撞上同一堵墙:订单表、日志表、流水表数据量奔着几亿条去了,备份一次大半天,加索引要锁表,明明只查最近的数据,查询却越来越慢。想删数据,财务说要留七年;想留着,数据库眼看着要撑不住。
核心矛盾是:数据的访问频率随时间断崖式下降,但存储成本不分新旧一刀切。 最近三个月的数据撑起 95% 的查询,三年前的数据一年碰不了一次,却占着最贵的在线存储。冷热分离就是把这个错配纠正过来,主流有三条路线:应用层分表归档、数据库原生分区、独立归档库加对象存储。
原理: 不依赖数据库特性,在应用代码或中间件层面做拆分:热表只留近期数据,定时任务把到期数据搬迁到归档表(同库或异库),查询时按时间路由。分库分表中间件(ShardingSphere 等)天然支持这套玩法。
优点:
缺点:
适用场景: 已经在用分库分表中间件、或者表结构简单的系统。归档逻辑明确(比如纯按时间)的场景,这是最可控的路线。
原理: 利用数据库的分区表能力(MySQL Partitioning、PostgreSQL declarative partition),按时间分区,历史分区直接 detach 归档或转储,热分区保持小巧。对应用透明,查询还是一张表。
优点:
缺点:
适用场景: 查询模式高度按时间过滤、不想动应用代码的系统。日志类、流水类大表是最佳拍档。想靠它大幅降存储成本的会失望,它主要解决的是查询和运维效率。
原理: 热数据留在线库,冷数据通过数据管道(CDC 或定时 ETL)归档到独立的分析型存储(ClickHouse、Doris)或直接压缩进对象存储(COS、S3),需要查历史时走归档查询入口,常配合统一查询层对应用屏蔽差异。
优点:
缺点:
适用场景: 数据量大(TB 级以上)、冷数据访问极少、对成本敏感的系统。流水、日志、行为数据这类"写一次读稀有"的数据是天然用户。
场景特征 | 推荐方案 |
|---|---|
表结构简单、归档规则清晰、已用中间件 | 应用层分表归档 |
查询强时间过滤、不想改应用 | 数据库原生分区 |
TB 级数据、冷数据极少访问、成本敏感 | 归档库 + 对象存储 |
实际项目里经常组合使用:在线库用分区表保持轻快,超过一年的分区 detach 出来进对象存储。热、温、冷三级各得其所。
第一件:先定保留策略再谈技术方案。 各类数据留多久、什么粒度的查询要支持、合规要求几年,这些要业务、财务、法务签字确认。技术上什么都能存,问题是谁来为"留多久"拍板。策略没定就开工,最后必然变成"什么都不敢删"。
第二件:归档任务必须可校验、可补偿。 搬迁前后做行数和 checksum 比对,归档失败要能重跑。丢一条三年前的订单当时没人发现,发现的时候就是事故。
第三件:给冷数据留查询入口。 归档不等于封存:财务审计、客户查历史订单、监管调阅,这些需求一定会来。哪怕是个内部查询工具,也要在归档方案里预留,别把冷数据归档成"死数据"。
冷热分离的本质是按访问频率给数据安排不同价位的"住处",技术选型反而是后半场。真正决定成败的是三件事:保留策略谁拍板、搬迁过程怎么校验、冷数据怎么查。这三件事想清楚了,不管选哪条路线都翻不了车。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。