TTL(有効期限)によるデータ管理
TTLの概要
TTL(time-to-live)は、特定の時間が経過した後に行やカラムを移動、削除、または集約する機能を指します。「time-to-live」という表現は、古いデータの削除にのみ適用されるように聞こえますが、TTLにはいくつかのユースケースがあります:
- 古いデータの削除:驚くことではありませんが、指定された時間が経過した後に行やカラムを削除できます。
- ディスク間のデータ移動:一定時間が経過した後に、ストレージボリューム間でデータを移動できます - ホット/ウォーム/コールドアーキテクチャを展開するのに便利です。
- データの集約:古いデータを削除する前に、さまざまな役立つ集約や計算に集約できます。
TTLは、テーブル全体または特定のカラムに適用できます。
TTL構文
TTL
句は、カラム定義の後やテーブル定義の最後に出現することができます。時間の長さを定義するためにINTERVAL
句を使用します(データ型はDate
またはDateTime
である必要があります)。例えば、以下のテーブルは、TTL
句を持つ2つのカラムを持っています:
- xカラムはtimestampカラムから1か月の有効期限があります。
- yカラムはtimestampカラムから1日の有効期限があります。
- インターバルが経過すると、カラムは期限切れになります。ClickHouseは、そのデータ型のデフォルト値でカラムの値を置き換えます。データ部分内の全てのカラム値が期限切れになると、ClickHouseはファイルシステムからこのカラムを削除します。
TTLルールは変更または削除できます。詳細はテーブルTTLの操作ページを参照してください。
TTLイベントのトリガー
期限切れの行の削除または集約は即時には行われず、テーブルのマージ中のみ発生します。テーブルがアクティブにマージされていない場合(何らかの理由で)、TTLイベントをトリガーする2つの設定があります:
merge_with_ttl_timeout
:削除TTLでマージを再実行する前の最小遅延(秒)。デフォルトは14400秒(4時間)です。merge_with_recompression_ttl_timeout
:再圧縮TTL(削除前にデータを集約するルール)でマージを再実行する前の最小遅延(秒)。デフォルト値:14400秒(4時間)。
したがって、デフォルトでは、あなたのTTLルールは少なくとも4時間ごとにテーブルに適用されます。TTLルールをより頻繁に適用したい場合は、上記の設定を変更してください。
あまり良い解決策ではありませんが(また、頻繁には使用することを推奨しません)、OPTIMIZE
を使用してマージを強制することもできます:
OPTIMIZE
は、テーブルのパーツの予定外のマージを初期化し、FINAL
はテーブルがすでに単一のパーツである場合に再最適化を強制します。
行の削除
特定の時間が経過した後にテーブルから全行を削除するには、テーブルレベルでTTLルールを定義します:
さらに、レコードの値に基づいてTTLルールを定義することも可能です。これは、WHERE条件を指定することで簡単に実装できます。複数の条件が許可されています:
カラムの削除
全行を削除するのではなく、バランスとアドレスのカラムだけを期限切れにしたいとします。customers
テーブルを修正して、両方のカラムのTTLを2時間に設定しましょう:
ロールアップの実装
特定の時間が経過した後に行を削除したいが、報告目的のために一部のデータを保持したいとします。すべての詳細を必要とせず、過去のデータの集約結果をいくつか保持したい場合、TTL
表現にGROUP BY
句を追加し、集約結果を保存するためのカラムをテーブルに追加することで実装できます。
以下のhits
テーブルでは、古い行を削除したいが、行を削除する前にhits
カラムの合計と最大値を保持したいとします。それらの値を保存するフィールドが必要で、合計と最大値をロールアップするTTL
句にGROUP BY
句を追加する必要があります。
hits
テーブルに関するいくつかの注意事項:
TTL
句のGROUP BY
カラムはPRIMARY KEY
の接頭辞でなければならず、日付の開始時刻で結果をグループ化したいと考えています。したがって、toStartOfDay(timestamp)
が主キーに追加されました。- 集約結果を保存するために、
max_hits
とsum_hits
という2つのフィールドを追加しました。 max_hits
とsum_hits
のデフォルト値をhits
に設定することは、SET
句の定義に基づいて、私たちのロジックが機能するために必要です。
ホット/ウォーム/コールドアーキテクチャの実装
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
テーブルを使用して、データが期待されるディスクに移動したかどうかを確認します:
レスポンスは以下のようになります:
関連コンテンツ
- ブログ & ウェビナー: ClickHouseでデータライフサイクルを管理するためのTTLの使用