クリックハウスの階層型倉庫
MergeTree ファミリーのテーブル エンジンは、複数のブロック デバイスにデータを格納できます。たとえば、あるテーブルのデータが暗黙的に「ホット」と「コールド」に分割されている場合に便利です。最新のデータは定期的に要求されますが、必要な容量はわずかです。逆に、ファットテールの履歴データはほとんど要求されません。
Amazon S3のようなリモートストレージバックエンドを使用すると、非常に効率的なストレージスキームとなります。これは、データを一定期間ローカルディスクに置き、その後オブジェクトストレージに移動させるストレージポリシーを可能にします。
設定例は次のようになります:
<storage_configuration>
<disks>
<fast_ssd>
<path>/mnt/fast_ssd/clickhouse/</path>
</fast_ssd>
<gcs>
<support_batch_delete>false</support_batch_delete>
<type>s3</type>
<endpoint>https://storage.googleapis.com/${BUCKET_NAME}/${ROOT_FOLDER}/</endpoint>
<access_key_id>${SERVICE_ACCOUNT_HMAC_KEY}</access_key_id>
<secret_access_key>${SERVICE_ACCOUNT_HMAC_SECRET}</secret_access_key>
<metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
</gcs>
...
</disks>
...
<policies>
<move_from_local_disks_to_gcs> <!-- policy name -->
<volumes>
<hot> <!-- volume name -->
<disk>fast_ssd</disk> <!-- disk name -->
</hot>
<cold>
<disk>gcs</disk>
</cold>
</volumes>
<move_factor>0.2</move_factor>
<!-- The move factor determines when to move data from hot volume to cold.
See ClickHouse docs for more details. -->
</moving_from_ssd_to_hdd>
....
</storage_configuration>
このストレージポリシーでは、hot
とcold
の2つのボリュームが定義されています。hot
ボリュームがdisk_size * move_factor
の占有率で満たされた後、データは Google Cloud Storage(GCS)に移動されます。
このストレージ・ポリシーがデフォルトでない場合は、ストレージ・ポリシーをアタッチしてテーブルを作成します。例えば
CREATE TABLE key_value_table (
event_date Date,
key String,
value String,
) ENGINE = MergeTree
ORDER BY (key)
PARTITION BY toYYYYMM(event_date)
SETTINGS storage_policy = 'move_from_local_disks_to_gcs'
この方法は、MergeTree テーブル エンジンでも使用できるテーブル TTL で可能です。
ClickHouse のドキュメントでは、ホット-ウォーム-コールドアーキテクチャの実装例でこの機能を詳しく説明しています。
上記の例と同様のアプローチを取ることができます。まず、ストレージポリシーを調整します:
<storage_configuration>
...
<policies>
<local_disk_and_gcs> <!-- policy name -->
<volumes>
<hot> <!-- volume name -->
<disk>fast_ssd</disk> <!-- disk name -->
</hot>
<cold>
<disk>gcs</disk>
</cold>
</volumes>
</local_disk_and_gcs>
....
</storage_configuration>
次に、以下のようにテーブルを作成します:
CREATE TABLE another_key_value_table (
event_date Date,
key String,
value String,
) ENGINE = MergeTree
ORDER BY (key)
PARTITION BY toYYYYMM(event_date)
TTL
event_date TO VOLUME 'hot',
event_date + INTERVAL 1 YEAR TO VOLUME 'cold'
SETTINGS storage_policy = 'local_disk_and_gcs';
これは、1年以上前のデータ(event_date
列に対して評価される)が GCS に移動されるようにテーブルを作成します。このような保存ポリシーは、最新のデータのみが頻繁にアクセスされる(監査イベントのような)追記のみのテーブルに役立ちます。データを完全に削除することもできます。
このガイドではTTLの変更について触れていませんが、それも可能です。詳細はClickHouseのTTLの変更に関するドキュメントを参照してください。