TTL(有効期限)を用いたデータ管理
TTLの概要
TTL(有効期限)とは、特定の時間が経過した後に行やカラムを移動、削除、または要約する機能を指します。「有効期限」という表現は古いデータの削除にのみ適用されるように思えますが、TTLにはいくつかのユースケースがあります:
- 古いデータの削除:驚くことではありませんが、指定された時間間隔の後に行やカラムを削除できます。
- ディスク間でのデータ移動:一定の時間が経過した後、ストレージボリューム間でデータを移動できます - ホット/ウォーム/コールドアーキテクチャを展開するのに便利です。
- データのロールアップ:古いデータを削除する前に、さまざまな有用な集計や計算にロールアップします。
TTLは、テーブル全体または特定のカラムに適用できます。
TTLの構文
TTL
句は、カラム定義の後および/またはテーブル定義の最後に現れることがあります。INTERVAL
句を使用して時間の長さ(Date
またはDateTime
データ型である必要があります)を定義します。例えば、以下のテーブルにはTTL
句を持つ2つのカラムがあります:
- xカラムはタイムスタンプカラムから1ヶ月の有効期限があります。
- yカラムはタイムスタンプカラムから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
は、すでに1つのパーツになっている場合の再最適化を強制します。
行の削除
特定の期間経過後にテーブルから完全な行を削除するには、テーブルレベルでTTLルールを定義します:
さらに、レコードの値に基づいてTTLルールを定義することも可能です。これは、where条件を指定することによって簡単に実装できます。複数の条件を許可します:
カラムの削除
行全体を削除する代わりに、残高と住所のカラムだけが期限切れになることを望むとしましょう。customers
テーブルを変更し、両方のカラムに2時間のTTLを追加します:
ロールアップの実装
特定の期間経過後に行を削除したいが、報告の目的で一部のデータを保持したいとします。すべての詳細を必要とするわけではありません - 歴史的データのいくつかの集計結果だけが必要です。これは、TTL式にGROUP BY
句を追加し、集計結果を保存するためのテーブル内のいくつかのカラムを追加することで実装できます。
次のhits
テーブルで古い行を削除したいが、行を削除する前にhits
カラムの合計と最大値を保持したいとします。それらの値を格納するフィールドが必要で、合計と最大値をロールアップするTTL句にGROUP BY
句を追加する必要があります:
hits
テーブルに関するいくつかの注意事項:
- TTL句内の
GROUP BY
カラムはPRIMARY KEY
のプレフィックスでなければならず、日始の時刻で結果をグループ化したいので、toStartOfDay(timestamp)
が主キーに追加されました。 - 集計結果を格納する2つのフィールド
max_hits
とsum_hits
を追加しました。 SET
句の定義に基づいてmax_hits
とsum_hits
のデフォルト値をhits
に設定することが必要です。
ホット/ウォーム/コールドアーキテクチャの実装
ClickHouse Cloudを使用している場合、レッスン内の手順は適用されません。ClickHouse Cloud内で古いデータを移動することについて心配する必要はありません。
大量のデータを扱う際の一般的な慣行は、データが古くなるにつれてそれを移動させることです。以下は、TTLコマンドのTO DISK
およびTO VOLUME
句を使用してClickHouseでホット/ウォーム/コールドアーキテクチャを実装する手順です。(ちなみに、ホットおよびコールドである必要はありません - TTLを使用して、さまざまなユースケースに応じてデータを移動できます。)
TO DISK
およびTO VOLUME
オプションは、ClickHouseの設定ファイルに定義されたディスクやボリュームの名前を指します。ディスクを定義する新しいファイルmy_system.xml
(任意のファイル名で)を作成して、ボリュームを定義します。XMLファイルは/etc/clickhouse-server/config.d/
に配置して、設定をシステムに適用します:
- 上記の設定は、ClickHouseが読み書きできるフォルダを指す三つのディスクに言及しています。ボリュームは一つ以上のディスクを含むことができます - 三つのディスクそれぞれのためにボリュームを定義しました。ディスクを確認してみましょう:
- では、ボリュームを確認しましょう:
- 次に、ホット、ウォーム、コールドのボリューム間でデータを移動させる
TTL
ルールを追加します:
- 新しい
TTL
ルールを具現化させる必要がありますが、確認のために強制することもできます:
system.parts
テーブルを使用して、データが期待通りのディスクに移動したことを確認します:
応答は以下のようになります: