ClickHouse

TTL e Storage

ClickHouse e' un potente Columnar Database SQL Open Source con ottime prestazioni sulle attivita' OLAP (On-Line Analytical Processing).

In questa paginetta vediamo la clausola TTL che e' possibile indicare nelle CREATE TABLE e che consente di gestire in modo semplice ed ottimale la storicizzazione dei dati.
Con la TTL indicando un intervallo di tempo e' possibile specificare sia quando migrare i dati su uno storage differente che quando cancellarli definitivamente.

La clausola TTL e' disponibile dalla versione 19.6, il formato che descriviamo in questa paginetta e' quello che consente anche la gestione dello storage e che e' disponibile dalla versione 20.1.

Introduzione

ClickHouse e' il recente database colonnare sviluppato da Yandex adatto alle attivita' OLAP. Con il termine OLAP (On-Line Analytical Processing) si indicano tecniche ed architetture adatte ad analizzare grandi basi dati in tempi molto brevi.

Quando si opera su grandi quantita' di dati la gestione dello spazio e' fondamentale. L'Engine MergeTree di ClickHouse utilizza in modo nativo il partitioning e quindi una prima semplice ed efficiente soluzione e' quella di utilizzare i comandi di ALTER... DROP PARTITION. Si tratta di una modalita' molto comune presente nella maggioranza dei database relazionali.
Nelle ultime versioni tuttavia in ClickHouse sono state inserite funzionalita' specifiche per gestire in modo ottimale lo svecchiamento dei dati sfruttando Storage differenti e specifiche clausole per la cancellazione. Queste funzionalita' sono piu' tipiche dei TSDB (Time Series Database) e rendono particolarmente efficace la gestione di grandi quantita' di dati organizzati per data.

TTL

Vediamo subito un esempio:

CREATE TABLE example_table ( d DateTime, a Int ) ENGINE = MergeTree PARTITION BY toYYYYMM(d) ORDER BY d TTL d TO VOLUME 'fast', d + INTERVAL 3 MONTH TO VOLUME 'slow', d + INTERVAL 12 MONTH DELETE;

L'idea e' semplice! I dati appena inseriti vanno sul volume con i dischi piu' performanti, dopo tre mesi vengono migrati su dischi piu' economici ed infine dopo un anno vengono automaticamente cancellati.

E' tutto cosi' semplice?
Si, ma bisogna configurare correttamente ClickHouse [NdA ed utilizzare le versioni piu' recenti].

E' comunque ancora valida la sintassi semplifica che effettua solo la storicizzazione dei dati (cancellazione):

CREATE TABLE table1y ( d DateTime, a Int ) ENGINE = MergeTree PARTITION BY toYYYYMM(d) ORDER BY d TTL d + INTERVAL 12 MONTH;

Nel caso in cui non si disponga di storage differenti ovviamente la clausola TTL ha il solo scopo di effettuare la storicizzazione dei dati. Tuttavia e' consigliabile indicare comunque DELETE come nel primo esempio.

Storage

Con la configurazione di default, ClickHouse usa un path di default, su un disco di default, su un volume di default, con una policy di default:

:) SELECT * FROM system.disks ┌─name────┬─path─────────────────┬──free_space─┬──total_space─┬─keep_free_space─┐ │ default │ /var/lib/clickhouse/ │ 37705834496 │ 468514799616 │ 0 │ └─────────┴──────────────────────┴─────────────┴──────────────┴─────────────────┘ :) SELECT * FROM system.storage_policies ┌─policy_name─┬─volume_name─┬─volume_priority─┬─disks───────┬─max_data_part_size─┬─move_factor─┐ │ default │ default │ 1 │ ['default'] │ 0 │ 0 │ └─────────────┴─────────────┴─────────────────┴─────────────┴────────────────────┴─────────────┘

Andiamo ad aggiungere i nuovi dischi!

Tralasciamo gli aspetti sistemistici... per ClickHouse e' sufficiente siano directory differenti accessibili all'utente clickhouse.
E' possibile farlo nel file config.xml ma e' in realta' consigliabile utilizzare un file specifico (eg. storage.xml) nella directory config.d:

<yandex> <storage_configuration> <disks> <disk_ssd1> <path>/mnt/fast_ssd1/clickhouse</path> </disk_ssd1> <disk_hdd1> <path>/mnt/hdd1/clickhouse</path> <keep_free_space_bytes>10485760</keep_free_space_bytes> </disk_hdd1> <disk_hdd2> <path>/mnt/hdd2/clickhouse</path> <keep_free_space_bytes>10485760</keep_free_space_bytes> </disk_hhd2> </disks> <policies> <default> <volumes> <default> <disk>default</disk> </default> <fast> <disk>disk_ssd1</disk> </fast> <slow> <disk>disk_hdd1</disk> <disk>disk_hdd2</disk> </slow> </volumes> </default> </policies> </storage_configuration> </yandex>

Con un riavvio o con il comando SYSTEM RELOAD CONFIG o in automatico sono disponibili i nuovi dischi!

:) SELECT * FROM system.disks ┌─name──────┬─path──────────────────────┬───free_space─┬──total_space─┬─keep_free_space─┐ │ default │ /var/lib/clickhouse/ │ 37705834496 │ 468514799616 │ 0 │ │ disk_ssd1 │ /mnt/fast_ssd1/clickhouse │ 468514799616 │ 468514799616 │ 0 │ │ disk_hdd1 │ /mnt/hdd1/clickhouse/ │ 468514799616 │ 468514799616 │ 0 │ │ disk_hdd2 │ /mnt/hdd2/clickhouse/ │ 468514799616 │ 468514799616 │ 0 │ └───────────┴───────────────────────────┴──────────────┴──────────────┴─────────────────┘ :) SELECT * FROM system.storage_policies ┌─policy_name─┬─volume_name─┬─volume_priority─┬─disks─────────────────────┬─max_data_part_size─┬─move_factor─┐ │ default │ default │ 1 │ ['default'] │ 0 │ 0.1 │ │ default │ fast │ 2 │ ['disk_ssd1'] │ 0 │ 0.1 │ │ default │ slow │ 3 │ ['disk_hdd1','disk_hdd2'] │ 0 │ 0.1 │ └─────────────┴─────────────┴─────────────────┴───────────────────────────┴────────────────────┴─────────────┘

A questo punto nella creazione di tabelle con TTL e' possibile indicare i volumi o i dischi di destinazione.

Variazioni sul tema

Le clausole TTL hanno la necessita' di una colonna di tipo Date o DateTime e della specifica di un intervallo di tempo.
Non e' necessario che la colonna scelta sia quella di partizionamento o di SORT, anche se sono quelle piu' utilizzate.
Intervalli piu' brevi di DAY non sono significativi per le TTL.

Le TTL possono essere definite per tabelle o per singole colonne. Infatti in ClickHouse ogni singola colonna e' memorizzata su una struttura differente e potrebbero essere presenti informazioni di importanza diversa nella stessa colonna. Le TTL per colonna possono essere usate solo per cancellare i dati e non possono essere definite sulle colonne chiave.
Per semplicita' in questa paginetta abbiamo sempre utilizzato la definizione per tabella...

Inizialmente la clausola TTL consentiva di indicare solo la cancellazione, la gestione dello storage e' stata inserita successivamente. In ogni caso puo' essere utilizzata per l'uno, per l'altro o per entrambe gli scopi.
Se viene modificato un TTL di una tabella con un ALTER TABLE vanno cambiate tutte le condizioni precedentemente impostate:
 ALTER TABLE big_table MODIFY TTL timestamp + toIntervalMonth(12) to disk 'slow', timestamp + toIntervalMonth(36) DELETE;

Le indicazioni della clausola TTL non sono eseguite immediatamente ma solo quando occore un Merge.
Dal punto di vista tecnico la cancellazione e la MOVE sono implementati in modo differente ed utilizzano thread distinti e con timeout molto ampi (eg. un giorno). Le cancellazioni sono a tutti gli effetti delle mutation mentre le policy sui volumi sono semplici MOVE part: hanno quindi un impatto differente sul carico.
Anche se non consigliabile e' comunque possibile forzare le riorganizzazioni con comandi quali:

ALTER TABLE... MOVE PART|PARTITION... TO VOLUME|DISK... 

ALTER TABLE table MODIFY SETTING merge_with_ttl_timeout = 3600

OPTIMIZE TABLE table FINAL

ALTER TABLE table MATERIALIZE TTL

CREAT TABLE... SETTINGS storage_policy = 'custom_policy'

Le molteplici possibilita' delle policy non sono state descritte in questa breve paginetta.

La documentazione ufficiale tutti i dettagli.

Avvertenze per l'uso

La gestione automatica dello storage con le clausole TTL non e' complessa... ma va eseguita con attenzione.

La prima avvertenza: le clausole TTL cancellano per davvero e per sempre, occhio!
Ovviamente le directory assegnate al database debbono essere assegnate all'utente unix clickhouse ed avere le permission corrette.
Il disco "default" non si puo' indicare nella configurazione dello storage: e' quello del parametro PATH e non va modificato.
La policy di default va dichiarata e DEVE contenere anche il disco di default.

Se si commette qualche errore di configurazione...
Beh, non e' un problema: ClickHouse non parte piu'! Si deve mettere a posto a mano "aggiustando" il contenuto nelle directory dei dischi configurati.

Varie ed eventuali

La funzionalita' dei TTL e' recente e costamentemente arricchita; le principali milestone sono: (19.6 2019-05) introduzione TTL, (19.15 2019-10) Tiered storage, (20.1 2020-01) TTL move TO, (20.3 2020-03) ALTER... MATERIALIZE TTL.

Il documento Introduzione a ClickHouse contiene una presentazione sulle funzioni di base, il documento Architettura di ClickHouse contiene una presentazione dell'architettura, DBA scripts contiene alcuni dei comandi piu' utili per il DBA.
Naturalmente la fonte piu' completa di informazioni e' la documentazione ufficiale.


Titolo: ClickHouse TTL e Storage
Livello: Avanzato (3/5)
Data: 1 Aprile 2020 🐟
Versione: 1.0.0 - 1 Aprile 2020
© Autore: mail [AT] meo.bogliolo.name