このトピックでは、Alibaba Cloud E-MapReduce (EMR) の ClickHouse クラスターで OSS を使用してホット/コールドデータ分離を実装する方法について説明します。この方法により、ホットデータとコールドデータを自動的に管理し、パフォーマンスを維持しながらコンピューティングリソースとストレージリソースを最適化してコストを削減できます。
前提条件
E-MapReduce (EMR) コンソールで、EMR V5.7.0 以降を実行する ClickHouse クラスターが作成されている必要があります。詳細については、「ClickHouse クラスターの作成」をご参照ください。
制限事項
このトピックで説明する操作は、EMR V5.7.0 以降の ClickHouse クラスターにのみ適用されます。
手順
手順1:EMR コンソールでのディスク追加
-
ClickHouse サービスの設定ページに移動します。
-
上部メニューで、リージョンとリソースグループを選択します。
-
[EMR on ECS] ページで、対象のクラスターを見つけ、Services 列の Services をクリックします。
-
Services ページで、ClickHouse セクションの Configure をクリックします。
-
Configure ページで、[server-metrika] タブをクリックします。
-
[storage_configuration] のパラメーターを変更します。
-
[ディスク] で、ディスクを追加します。
次のコードは、必要な設定を示しています。
<disk_oss> <type>s3</type> <endpoint>http(s)://${yourBucketName}.${yourEndpoint}/${yourPathPrefix}</endpoint> <access_key_id>${YOUR_ACCESS_KEY_ID}</access_key_id> <secret_access_key>${YOUR_ACCESS_KEY_SECRET}</secret_access_key> <send_metadata>false</send_metadata> <metadata_path>${yourMetadataPath}</metadata_path> <cache_enabled>true</cache_enabled> <cache_path>${yourCachePath}</cache_path> <skip_access_check>false</skip_access_check> <min_bytes_for_seek>1048576</min_bytes_for_seek> <thread_pool_size>16</thread_pool_size> <list_object_keys_size>1000</list_object_keys_size> </disk_oss>次の表にパラメーターを示します。
パラメーター
必須
説明
disk_oss
はい
ディスクのカスタム名です。
type
はい
ディスクタイプです。これを s3 に設定します。
endpoint
はい
OSS サービスのエンドポイントです。形式は http(s)://${yourBucketName}.${yourEndpoint}/${yourPathPrefix} です。
説明endpoint パラメーターの値は http または https で始まる必要があります。形式では、
${yourBucketName}は OSS バケット名、${yourEndpoint}は OSS エンドポイント、${yourPathPrefix}は OSS のパスプレフィックスです。例:http://clickhouse.oss-cn-hangzhou-internal.aliyuncs.com/testaccess_key_id
はい
Alibaba Cloud アカウントの AccessKey ID です。
AccessKey ID の取得方法については、「AccessKey ペアの取得」をご参照ください。
secret_access_key
はい
Alibaba Cloud アカウントの AccessKey Secret です。
このキーは、OSS の署名文字列を暗号化および検証します。AccessKey Secret の取得方法については、「AccessKey ペアの取得」をご参照ください。
send_metadata
いいえ
OSS ファイルの操作時にメタデータを追加するかどうかを指定します。有効な値:
-
true:メタデータを追加します。
-
false (デフォルト):メタデータを追加しません。
metadata_path
いいえ
ローカルファイルと OSS オブジェクト間のマッピングのストレージパスです。
デフォルト値:${path}/disks/<disk_name>/
説明<disk_name>はディスク名で、この例では disk_oss です。cache_enabled
いいえ
キャッシュを有効にするかどうかを指定します。有効な値:
-
true (デフォルト):キャッシュを有効にします。
-
false:キャッシュを無効にします。
キャッシュは次のように機能します。
-
キャッシュは、拡張子が .idx、.mrk、.mrk2、.mrk3、.txt、.dat のファイルのローカルキャッシュにのみ使用されます。他の拡張子のファイルは、キャッシュからではなく OSS から直接読み取られます。
-
ローカルキャッシュには容量制限がありません。最大容量はストレージディスクの容量です。
-
ローカルキャッシュは、最近使用されていない (LRU) などのポリシーによってクリアされません。代わりに、ファイルのライフサイクルにわたって保持されます。
-
データが最初に読み取られるとき、キャッシュにまだ存在しない場合は、OSS からキャッシュにダウンロードされます。
-
データが最初に書き込まれるとき、OSS にアップロードされる前にローカルにキャッシュされます。
-
オブジェクトが OSS から削除されると、ローカルキャッシュからもクリアされます。オブジェクトが OSS で名前変更されると、ローカルキャッシュでも名前変更されます。
cache_path
いいえ
キャッシュパスです。
デフォルト値:${path}/disks/<disk_name>/cache/
skip_access_check
いいえ
ディスクのロード時に読み取り/書き込み権限のチェックをスキップするかどうかを指定します。有効な値:
-
true:チェックをスキップします。
-
false (デフォルト):チェックを実行します。
min_bytes_for_seek
いいえ
シーク操作の最小バイト数です。値がこのしきい値を下回る場合、直接シークではなく、読み取りとスキップの操作が実行されます。デフォルト値:1048576。
thread_pool_size
いいえ
ディスクが
restoreコマンドを実行するために使用するスレッドプールのサイズです。デフォルト値:16。list_object_keys_size
いいえ
特定のプレフィックスに対して、リストリクエストごとに返されるオブジェクトの最大数です。デフォルト値:1000。
-
-
[ポリシー] に新しいポリシーを追加します。
ポリシーの内容は次のとおりです。
<oss_ttl> <volumes> <local> <!-- デフォルトのストレージポリシー配下のすべてのディスクを含める --> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </local> <remote> <disk>disk_oss</disk> </remote> </volumes> <move_factor>0.2</move_factor> </oss_ttl>説明この設定をデフォルトのポリシーに直接追加することもできます。
-
-
クライアント設定をデプロイします。
-
ClickHouse サービスのConfigureページで、Deploy Client Configurationをクリックします。
-
[CLICKHOUSE クライアント設定のデプロイ] ダイアログボックスで、アクションの理由を入力し、OK をクリックします。
-
Confirm ダイアログボックスで、OK をクリックします。
-
-
Deploy the client configuration.
-
On the [Configure] page of the ClickHouse service, click [Deploy Client Configuration].
-
In the [Deploy CLICKHOUSE Client Configuration] dialog box, enter a reason for the action and click [OK ].
-
In the [Confirm] dialog box, click [OK ].
-
手順2:設定の検証
-
SSH を使用して ClickHouse クラスターにログインします。詳細については、「クラスターへのログイン」をご参照ください。
-
次のコマンドを実行して、ClickHouse クライアントを起動します。
clickhouse-client -h core-1-1 -m説明この例では、
core-1-1ノードにログインします。複数のコアノードがある場合は、そのいずれか 1 つにログインできます。 -
次のコマンドを実行して、ディスク情報を表示します。
select * from system.disks;出力例:
┌─name─────┬─path────────────────────────────────┬───────────free_space─┬──────────total_space─┬─keep_free_space─┬─type──┐ │ default │ /var/lib/clickhouse/ │ 83868921856 │ 84014424064 │ 0 │ local │ │ disk1 │ /mnt/disk1/clickhouse/ │ 83858436096 │ 84003938304 │ 10485760 │ local │ │ disk2 │ /mnt/disk2/clickhouse/ │ 83928215552 │ 84003938304 │ 10485760 │ local │ │ disk3 │ /mnt/disk3/clickhouse/ │ 83928301568 │ 84003938304 │ 10485760 │ local │ │ disk4 │ /mnt/disk4/clickhouse/ │ 83928301568 │ 84003938304 │ 10485760 │ local │ │ disk_oss │ /var/lib/clickhouse/disks/disk_oss/ │ 18446744073709551615 │ 18446744073709551615 │ 0 │ s3 │ └──────────┴─────────────────────────────────────┴──────────────────────┴──────────────────────┴─────────────────┴───────┘ -
次のコマンドを実行して、ディスクのストレージポリシーを表示します。
select * from system.storage_policies;出力例:
┌─policy_name─┬─volume_name─┬─volume_priority─┬─disks─────────────────────────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┬─prefer_not_to_merge─┐ │ default │ single │ 1 │ ['disk1','disk2','disk3','disk4'] │JBOD │ 0 │ 0 │ 0 │ │ oss_ttl │ local │ 1 │ ['disk1','disk2','disk3','disk4'] │JBOD │ 0 │ 0.2 │ 0 │ │ oss_ttl │ remote │ 2 │ ['disk_oss'] │JBOD │ 0 │ 0.2 │ 0 │ └─────────────┴─────────────┴─────────────────┴───────────────────────────────────┴─────────────┴────────────────────┴─────────────┴─────────────────────┘出力がこの例と同様であれば、ディスクは正しく設定されています。
手順3:ホット/コールドデータ分離の実装
既存テーブルの変更
-
次のコマンドを実行して、テーブルの現在のストレージポリシーを確認します。
SELECT storage_policy FROM system.tables WHERE database='<yourDatabaseName>' AND name='<yourTableName>';ここで、
<yourDatabaseName>はデータベース名、<yourTableName>はテーブル名です。コマンドが default を返した場合、テーブルはデフォルトのポリシーを使用しています。次の手順でこのポリシーを拡張できます。
<default> <volumes> <single> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </single> </volumes> </default> -
現在のストレージポリシーを拡張します。
EMR コンソールで、ClickHouse の設定で
defaultストレージポリシーにリモートボリュームを追加します。<default> <volumes> <single> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </single> <!-- 以下は新規のリモートボリューム --> <remote> <disk>disk_oss</disk> </remote> </volumes> <!-- 複数のボリュームがある場合は move_factor を指定する必要があります --> <move_factor>0.2</move_factor> </default> -
次のコマンドを実行して、古いデータを
remoteボリュームに移動する TTL ルールを設定します。ALTER TABLE <yourDatabaseName>.<yourTableName> MODIFY TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote'; -
次のコマンドを実行して、ディスク間でのデータパーツの分散を確認します。
select partition,name,path from system.parts where database='<yourDatabaseName>' and table='<yourTableName>' and active=1出力例:
┌─partition───────────┬─name─────────────────────┬─path──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 2022-01-11 19:55:00 │ 1641902100_1_90_3_193 │ /var/lib/clickhouse/disks/disk_oss/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902100_1_90_3_193/ │ │ 2022-01-11 19:55:00 │ 1641902100_91_96_1_193 │ /var/lib/clickhouse/disks/disk_oss/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902100_91_96_1_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_97_124_2_193 │ /mnt/disk3/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_97_124_2_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_125_152_2_193 │ /mnt/disk2/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_125_152_2_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_153_180_2_193 │ /mnt/disk4/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_153_180_2_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_181_186_1_193 │ /mnt/disk3/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_181_186_1_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_187_192_1_193 │ /mnt/disk4/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_187_192_1_193/ │ └─────────────────────┴──────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────┘ 7 rows in set. Elapsed: 0.002 sec.説明出力がこの例と同様の場合、データは時間に基づいてホット層とコールド層に分離されます。ホットデータはローカルディスクに保存され、コールドデータは OSS に保存されます。
出力では、/var/lib/clickhouse/disks/disk_oss はコールドデータ (metadata_path パラメーターに対応) のパスです。/mnt/disk{1..4}/clickhouse のようなパスは、ローカルディスク (ホットデータ) を指します。
新規テーブルの作成
-
構文
CREATE TABLE <yourDatabaseName>.<yourTableName> [ON CLUSTER cluster_emr] ( column1 Type1, column2 Type2, ... ) Engine = MergeTree() -- または Replicated*MergeTree() PARTITION BY <yourPartitionKey> ORDER BY <yourPartitionKey> TTL <yourTtlKey> TO VOLUME 'remote' SETTINGS storage_policy='oss_ttl';説明ここで、<yourPartitionKey> は ClickHouse のパーティションキーで、<yourTtlKey> はデータがコールドになるタイミングを決定する TTL 式です。
-
例
CREATE TABLE test.test ( `id` UInt32, `t` DateTime ) ENGINE = MergeTree() PARTITION BY toStartOfFiveMinute(t) ORDER BY id TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote' SETTINGS storage_policy='oss_ttl';説明この例では、テーブルは過去 5 分以内に生成されたデータをローカルディスクに保存します。5 分後、ClickHouse はデータをリモートボリュームである OSS に移動します。
関連設定
-
server-config
merge_tree.allow_remote_fs_zero_copy_replication:
trueに設定すると、リモートストレージ (DiskOSS など) 上のReplicated*MergeTreeテーブルがデータパーツを共有できるようになります。レプリカ間でデータをコピーする代わりに、各レプリカは OSS 上の共有データを指す独自のメタデータのみを保存します。 -
server-users
-
profile.${your-profile-name}.s3_min_upload_part_size:OSS へのマルチパートアップロードにおける単一パーツの最小サイズです。
-
profile.${your-profile-name}.s3_max_single_part_upload_size:書き込みバッファー内のデータ量がこの値を超えると、ClickHouse はマルチパートアップロードを使用します。詳細については、「」をご参照ください。
-