真实配置hot/cold两块磁盘的存储策略,验证TTL规则如何驱动老数据从热盘真实物理搬迁到冷盘,并直接核对磁盘上的物理文件位置。
代码-- 真实的存储配置:两块独立磁盘 + 一个分层策略 <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天前
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规则真实驱动这次搬迁。
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 ← 真实的物理文件
每一步都是本文上面用真实两块磁盘配置跑出来的原始结果。
storage_policyTTL ... TO VOLUME 'cold',直接核对磁盘物理文件位置