iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
Software Development

ClickHouse 系列:從資料庫底層架構到軟體應用實踐系列 第 21

Day 21 | ClickHouse 系列:TTL 資料清理與儲存成本優化

  • 分享至 

  • xImage
  •  

隨著時間的資料量成長,如何免去手工、使用自動化進行過期資料清理與儲存成本控制,成為大型數據系統設計中不可忽視的一環。ClickHouse 提供了 TTL(Time To Live)資料清理機制,不僅能自動刪除過期資料,還能將資料移動至冷儲存 (如 S3、HDD),有效降低儲存成本。

什麼是 TTL?

TTL (Time To Live) 是指設定資料的「生命週期」,當資料達到指定條件時,ClickHouse 會自動進行清理(刪除)或儲存層級移動 (Move to Volume)。

TTL 可以套用在:

  1. 整行資料 (Row TTL) → 自動刪除過期資料。
  2. 欄位資料 (Column TTL) → 針對指定欄位進行清理。
  3. Volume TTL → 將資料從 SSD 移至 HDD/S3 等不同 Volume 以降低儲存成本。

範例

1. Row TTL:自動刪除過期資料

CREATE TABLE events
(
    EventDate DateTime,
    UserID UInt64,
    Action String
) ENGINE = MergeTree
PARTITION BY toYYYYMM(EventDate)
ORDER BY (UserID, EventDate)
TTL EventDate + INTERVAL 7 DAY;

這會讓資料在 EventDate 超過 7 天後,自動被清除。

2. Column TTL:指定欄位過期清除

CREATE TABLE logs
(
    EventDate DateTime,
    UserID UInt64,
    Action String,
    TempField String TTL EventDate + INTERVAL 1 DAY
) ENGINE = MergeTree
ORDER BY UserID;

TempField 欄位資料會在 1 天後被清除,但行資料仍會保留。

3. Volume TTL:自動分層存儲 (Hot → Cold Storage)

// config.xml
<storage_configuration>
    <disks>
        <disk_ssd>
            <path>/var/lib/clickhouse/ssd/</path>
        </disk_ssd>
        <disk_hdd>
            <path>/var/lib/clickhouse/hdd/</path>
        </disk_hdd>
    </disks>
    <policies>
        <tiered_policy>
            <volumes>
                <hot>
                    <disk>disk_ssd</disk>
                </hot>
                <cold>
                    <disk>disk_hdd</disk>
                    <max_data_part_size_bytes>5000000000</max_data_part_size_bytes>
                </cold>
            </volumes>
        </tiered_policy>
    </policies>
</storage_configuration>
CREATE TABLE events_tiered
(
    EventDate DateTime,
    UserID UInt64,
    Action String
) ENGINE = MergeTree
ORDER BY (UserID, EventDate)
SETTINGS storage_policy = 'tiered_policy'
TTL EventDate + INTERVAL 7 DAY TO VOLUME 'cold';
  • 前 7 天資料會放在 SSD (Hot)
  • 超過 7 天後資料會自動移動到 HDD (Cold)

TTL 清理原理與執行時機

觸發時機 說明
背景合併 (Merge) TTL 清理與 Volume 移動是在 Merge 階段一併處理。
ALTER TABLE FREEZE 可以手動強制觸發。
清理非即時性 TTL 並非即時刪除,取決於背景合併頻率與資源情況。

建議:

  • 調整 merge_with_ttl_timeoutmerge_with_recompression_ttl_timeout 設定,縮短 TTL 觸發時間。
  • 查看 system.part_log 可追蹤哪些 Data Part 進行了 TTL 動作。

案例

即時行為數據保留 7 天

CREATE TABLE user_behavior
(
    EventDate DateTime,
    UserID UInt64,
    Action String
) ENGINE = MergeTree
ORDER BY (UserID, EventDate)
TTL EventDate + INTERVAL 7 DAY;

詳細 Log 移至冷存儲,保留近 3 天的熱資料

CREATE TABLE logs_tiered
(
    EventDate DateTime,
    LogID UUID,
    Details String
) ENGINE = MergeTree
ORDER BY (LogID, EventDate)
SETTINGS storage_policy = 'tiered_policy'
TTL EventDate + INTERVAL 3 DAY TO VOLUME 'cold';

監控與驗證 TTL 執行情況

  1. 查詢資料片段 TTL 狀態:
SELECT table, partition_id, min(min_ttl), min(max_ttl)
FROM system.parts
WHERE active = 1
GROUP BY table, partition_id;
  1. 強制清理 (不建議頻繁使用):
OPTIMIZE TABLE events FINAL;
  1. 追蹤 Part 變化紀錄 (system.part_log):
SELECT * FROM system.part_log WHERE event_type = 'MergeParts' AND table = 'events';

結語

TTL 不只是過期資料清理,更是控制 ClickHouse 儲存資源分層 (SSD → HDD → S3) 的重要利器。適當設計 TTL 策略,能幫助你在效能與成本之間取得最佳平衡。(老闆也會很愛你的)


上一篇
Day 20 | ClickHouse 系列:Sampling 抽樣查詢與統計技術原理
下一篇
Day 22 | ClickHouse 系列:儲存政策(Storage Policies)與磁碟資源分層策略
系列文
ClickHouse 系列:從資料庫底層架構到軟體應用實踐30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言