TTL (有効期限) を使用したデータ管理
有効期限の概要
有効期限 (TTL) は、特定の時間が経過した後に行やカラムを移動、削除、または集約する機能を指します。「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
テーブルを修正し、両方のカラムに2時間の TTL を追加しましょう:
集約の実装
特定の時間が経過した後に行を削除したいが、報告目的のために一部のデータを保持したいとします。詳細は必要なく、過去のデータのいくつかの集約結果を取得したいのです。これは、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内で古いデータを移動することを心配する必要はありません。
大量のデータを扱う際の一般的な実践は、データが古くなるにつれてそのデータを移動することです。TO DISK
および TO VOLUME
句を使用して、ClickHouseでホット/ウォーム/コールドアーキテクチャを実装するための手順は次のとおりです。(ちなみに、ホットとコールドだけでなく、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 を使用する