TTL(Time To Live)を使ったデータ管理
TTL の概要
TTL (time-to-live) は、一定時間が経過した後に、行や列を移動・削除・ロールアップできる機能を指します。"time-to-live" という表現からは古いデータの削除だけを連想しがちですが、TTL にはいくつかのユースケースがあります。
- 古いデータの削除: 想像どおり、指定した時間の経過後に行や列を削除できます
- ディスク間でのデータ移動: 一定時間経過後にストレージボリューム間でデータを移動できます。ホット / ウォーム / コールド構成のアーキテクチャを実現する際に有用です
- データロールアップ: 古いデータを削除する前に、さまざまな有用な集約や計算結果にロールアップできます
TTL はテーブル全体にも特定の列にも適用できます。
TTL の構文
TTL 句は、列定義の後および/またはテーブル定義の末尾に記述できます。INTERVAL 句を使用して期間(Date または DateTime データ型である必要があります)を定義します。たとえば、次のテーブルには 2 つの列があり、
それぞれに TTL 句があります。
- x 列は、
timestamp列を基準として 1 か月の TTL(有効期限)を持ちます - y 列は、
timestamp列を基準として 1 日の TTL(有効期限)を持ちます - 期間が経過すると、その列は失効します。ClickHouse は、その列の値をデータ型のデフォルト値に置き換えます。あるデータパート内のその列の値がすべて失効すると、ClickHouse はファイルシステム上のそのデータパートからこの列を削除します。
TTL のルールは変更または削除できます。詳細は Manipulations with Table TTL ページを参照してください。
TTL イベントのトリガー
期限切れ行の削除や集約は即時には行われず、テーブルのマージ時にのみ実行されます。何らかの理由でマージが積極的に行われていないテーブルがある場合、TTL イベントをトリガーするための設定が 2 つあります:
merge_with_ttl_timeout: 削除 TTL を伴うマージを再度実行するまでの最小遅延時間(秒)。デフォルトは 14400 秒(4 時間)です。merge_with_recompression_ttl_timeout: 再圧縮 TTL(削除前にデータをロールアップするルール)を伴うマージを再度実行するまでの最小遅延時間(秒)。デフォルト値は 14400 秒(4 時間)です。
そのためデフォルトでは、TTL ルールは 4 時間に少なくとも 1 回、テーブルに対して適用されます。TTL ルールをより高頻度で適用したい場合は、上記の設定を変更してください。
あまり良い解決策ではなく(また頻繁に使用することは推奨しません)が、OPTIMIZE を使用してマージを強制することもできます。
OPTIMIZE はテーブルを構成するパーツのスケジュールされていないマージ処理を開始し、テーブルがすでに単一パーツである場合は FINAL によって再度の最適化が強制されます。
行の削除
一定時間が経過した後にテーブルから行全体を削除するには、テーブルレベルで TTL ルールを定義します。
さらに、レコードの値に基づいて TTL ルールを定義することも可能です。 これは、WHERE 句を指定することで容易に実現できます。 複数の条件を指定することができます。
列の削除
行全体を削除するのではなく、balance 列と address 列だけに有効期限を設定したいとします。customers テーブルを変更して、両方の列に 2 時間の TTL を設定してみましょう。
ロールアップの実装
一定時間が経過した行を削除しつつ、レポーティング用途のために一部のデータは保持しておきたいとします。すべての詳細が必要なわけではなく、履歴データに対するいくつかの集計結果だけで十分です。これは、集計結果を保存するためのいくつかの列をテーブルに追加し、TTL 式に GROUP BY 句を追加することで実装できます。
次の hits テーブルで、古い行は削除しつつ、行を削除する前に hits 列の合計値と最大値は保持しておきたいとします。その値を保存するための列が必要であり、さらに合計値と最大値をロールアップする GROUP BY 句を TTL 句に追加する必要があります。
hits テーブルに関する補足:
TTL句内のGROUP BY列はPRIMARY KEYの先頭部分である必要があり、さらに結果を日単位(1 日の開始時刻)でグループ化したいので、PRIMARY KEYにtoStartOfDay(timestamp)を追加しました- 集計結果を保存するために、
max_hitsとsum_hitsの 2 つのフィールドを追加しました SET句の定義に基づくロジックが正しく動作するようにするには、max_hitsとsum_hitsのデフォルト値をhitsに設定しておく必要があります
ホット/ウォーム/コールド アーキテクチャの実装
ClickHouse Cloud を使用している場合、このレッスンの手順は適用されません。ClickHouse Cloud では古いデータを移動する必要はありません。
大量のデータを扱う場合、データが古くなるにつれて格納場所を移動するのは一般的な運用手法です。ここでは、ClickHouse で TTL コマンドの TO DISK および TO VOLUME 句を使用して、ホット/ウォーム/コールド アーキテクチャを実装する手順を示します。(ちなみに、必ずしもホット/コールド構成に限られるわけではなく、TTL を使って任意のユースケースに合わせてデータを移動できます。)
TO DISKおよびTO VOLUMEオプションは、ClickHouse の設定ファイルで定義されているディスクまたはボリュームの名前を参照します。ディスクを定義するmy_system.xml(任意のファイル名で可)という新しいファイルを作成し、そのディスクを利用するボリュームを定義します。設定をシステムに適用するには、その XML ファイルを/etc/clickhouse-server/config.d/に配置します。
- 上記の設定では、ClickHouse が読み書きできるフォルダを指す 3 つのディスクを参照しています。ボリュームには 1 つ以上のディスクを含めることができますが、ここでは 3 つのディスクそれぞれに対してボリュームを定義しました。ディスクを確認してみましょう。
- それでは、ボリュームを確認しましょう:
- ここで、ホット、ウォーム、コールドの各ボリューム間でデータを移動させる
TTLルールを追加します。
- 新しい
TTLルールは通常自動的に反映されますが、念のため次のコマンドで即時に適用を強制できます:
system.partsテーブルで、データが期待どおりのディスクに移動されたことを確認します。
レスポンスは次のようになります。