bigywater.tech
ClickHouse 内部原理 · 90

冷热数据分层和存储策略

真实配置hot/cold两块磁盘的存储策略,验证TTL规则如何驱动老数据从热盘真实物理搬迁到冷盘,并直接核对磁盘上的物理文件位置。

默认先落热盘
真实新写入不管数据多老都先进第一个volume
TTL驱动真实物理搬迁
真实.bin文件确认跨磁盘搬到了cold_disk

做的事:真实配置两块磁盘,插入"老"数据观察它落在哪

代码-- 真实的存储配置:两块独立磁盘 + 一个分层策略 <disks> <hot_disk><type>local</type><path>.../hot-disk/</path></hot_disk> <cold_disk><type>local</type><path>.../cold-disk/</path></cold_disk> </disks> <policies><hot_cold_policy> <volumes><hot><disk>hot_disk</disk></hot><cold><disk>cold_disk</disk></cold></volumes> </hot_cold_policy></policies> CREATE TABLE demo.hctest (...) ENGINE=MergeTree ORDER BY k SETTINGS storage_policy='hot_cold_policy'; INSERT INTO demo.hctest SELECT number, now()-3600*24*400, repeat('x',100) FROM numbers(100000); -- ts真实是400天前

验证:真实新数据默认先落在hot volume

实测 · 本机执行输出
SELECT disk_name, count() FROM system.parts WHERE table='hctest' AND active GROUP BY disk_name;
→ hot_disk   1   ← 真实所有新写入的数据,不管ts多老,默认都先落在第一个volume

即使这批数据的ts真实是400天前,只要没有明确的TTL规则告诉ClickHouse"这批数据该去哪",新写入真实一律先落在策略里排在最前面的hot volume——存储分层不会在INSERT这一刻自动按数据"年龄"分流,需要额外的TTL规则真实驱动这次搬迁。

验证:加上TTL规则并触发合并之后,数据真实物理搬到了冷盘

实测 · 本机执行输出
ALTER TABLE demo.hctest MODIFY TTL ts + INTERVAL 30 DAY TO VOLUME 'cold';
OPTIMIZE TABLE demo.hctest FINAL;

SELECT disk_name, count() FROM system.parts WHERE table='hctest' AND active GROUP BY disk_name;
→ cold_disk   1   ← 真实搬过去了(ts是400天前,早就超过30天的TTL)

真实检查物理文件位置:
ls hot-disk/store/...   → 真实空的
find cold-disk/store/... -name "*.bin"
→ .../cold-disk/store/2fe.../all_1_1_1_2/3e3bdc2ddfe1bea224fdfc85664836a0.bin   ← 真实的物理文件
直接在磁盘上核对物理文件位置,是本文认为验证存储分层"是不是真的生效"最靠得住的方式——如果只看system.parts的disk_name列就相信数据真的搬走了,终究是隔了一层;本文真实用find在cold-disk目录下找到了这批数据的.bin文件,hot-disk目录真实变空,两边对照才能真正确认这不是元数据层面的重新标记,而是一次真实的跨磁盘文件搬迁。TTL ... TO VOLUME 'cold'真实的机制,跟本系列很早验证过的"TTL数据过期后到底什么时候被清理"是同一类道理——TTL规则本身只是声明"多久之后该发生什么",真正让数据物理挪位置的动作,真实是靠后台合并任务(本文这次用OPTIMIZE FINAL强制触发,生产环境里同样会被正常的后台merge调度自动处理)去执行;move_factor这类设置(本文配置成了0.1)还能真实控制"热盘空间紧张到什么程度才主动往冷盘搬",让存储分层不仅能按数据年龄驱动,也能按磁盘容量压力驱动。这套机制真实的价值,是让"最近写入的数据放在快而贵的存储、老数据自动沉到慢而便宜的存储"这件事,不需要应用层自己写代码搬数据,全部交给ClickHouse用一份声明式的TTL规则和存储策略配置自动完成。

分步演示:从默认落在热盘到TTL驱动的真实冷迁移

每一步都是本文上面用真实两块磁盘配置跑出来的原始结果。

TTL规则驱动,数据真实跨磁盘物理搬迁
这一步新验证的磁盘

    本文用到的工具

    • 本机真实配置的两块独立磁盘(hot_disk/cold_disk)与 storage_policy
    • 真实的 TTL ... TO VOLUME 'cold',直接核对磁盘物理文件位置
    京ICP备2026067502号-1京公网安备11010502063487号