セルフマネージドの ClickHouse クラスターは、安定性の欠如、スケーラビリティの不足、アップグレードの困難さ、ディザスタリカバリの脆弱性といった課題を抱えることがよくあります。そのため、多くのユーザーがセルフマネージドの ClickHouse クラスターをクラウド上の PaaS サービスへ移行しています。本トピックでは、セルフマネージドの ClickHouse クラスターから ApsaraDB for ClickHouse のコミュニティ互換エディションクラスターへの移行方法について説明します。
前提条件
-
宛先クラスター:
-
クラスターは Community-Compatible Edition です。
-
データベースアカウントとパスワードが必要です。ClickHouse アカウントを作成する方法については、「コミュニティ互換エディションクラスターのアカウント管理」をご参照ください。
-
アカウントには最高レベルの権限が必要です。権限を付与する方法については、「権限の変更」をご参照ください。
-
-
セルフマネージドクラスター:
-
データベースアカウントとパスワードが必要です。
-
アカウントにはデータベースおよびテーブルに対する読み取り権限と、SYSTEM コマンドを実行する権限が必要です。
-
-
宛先クラスターとセルフマネージドクラスターはネットワーク上で通信可能である必要があります。
セルフマネージドクラスターと宛先クラスターが同一 VPC 内にある場合、さらに宛先クラスターの全ノードの IP アドレスおよびその vSwitch の IPv4 CIDR ブロックをセルフマネージドクラスターのホワイトリストに追加する必要があります。
-
ApsaraDB for ClickHouse クラスターのホワイトリストを設定する方法については、「ホワイトリストの設定」をご参照ください。
-
セルフマネージドクラスターのホワイトリストを設定する方法については、該当製品のドキュメントをご参照ください。
-
ApsaraDB for ClickHouse クラスターの全ノードの IP アドレスを確認するには、
SELECT * FROM system.clusters;を実行します。 -
ApsaraDB for ClickHouse クラスターの vSwitch の IPv4 CIDR ブロックを取得するには、次の手順を実行します。
-
ApsaraDB for ClickHouse コンソールで、対象クラスターの クラスター情報 ページに移動します。ネットワーク情報 セクションで、VSwitch ID を取得します。
-
vSwitch リストで、インスタンス ID を使用して対象の vSwitch を検索し、その IPv4 CIDR ブロック を取得します。
-
セルフマネージドクラスターと宛先クラスターが異なる VPC にある場合、またはセルフマネージドクラスターがオンプレミスのデータセンターまたは他のクラウドプラットフォーム上にある場合は、事前にネットワーク接続を確立する必要があります。詳細については、「宛先クラスターとデータソース間のネットワーク接続を確立する方法」をご参照ください。
-
移行の検証
データ移行を開始する前に、ビジネスの互換性、パフォーマンス、および移行計画を検証するためにテスト環境を構築することを強く推奨します。検証が完了した後、本番環境でデータ移行を実施できます。この重要なステップにより、潜在的な問題を早期に特定・解決し、スムーズな移行を実現するとともに、本番環境への影響を回避できます。
-
データ移行タスクを作成します。詳細な手順については、本トピックをご参照ください。
-
クラウド移行の互換性、パフォーマンスボトルネックの分析、および移行成功のための情報については、「セルフマネージド ClickHouse のクラウド移行における互換性とパフォーマンスボトルネックの分析および対策」をご参照ください。
ソリューションを選択する
|
移行ソリューション |
メリット |
デメリット |
適用範囲 |
|
視覚的なインターフェイスを提供します。メタデータを手動で移行する必要はありません。 |
クラスター全体のフル移行および増分移行のみをサポートします。特定のデータベース、テーブル、または既存データの移行はできません。 |
クラスター全体の移行。 |
|
|
移行するデータベースおよびテーブルを制御できます。 |
手順が複雑で、メタデータを手動で移行する必要があります。 |
|
操作手順
コンソール移行
制限事項
宛先クラスターのバージョンは 21.8 以降である必要があります。
注意事項
移行中
-
移行中、宛先クラスターではマージプロセスが一時停止されますが、セルフマネージドクラスターでは継続されます。
説明移行タスクが長時間実行されると、宛先クラスターに過剰なメタデータが蓄積される可能性があります。移行タスクの実行期間は 5 日以内にすることを推奨します。5 日を超えるタスクは自動的にキャンセルされます。
-
宛先クラスターは
defaultクラスターである必要があります。セルフマネージドクラスターが別の名前を使用している場合、サービスは分散テーブル内のcluster定義を自動的にdefaultに変換します。
移行範囲
-
サポートされるオブジェクト
-
データベース、データディクショナリ、およびマテリアライズドビュー。
-
SQL で作成されたデータディクショナリは移行をサポートしますが、XML で作成されたものはサポートしません。
これを確認するには、次のステートメントを実行します:
SELECT * FROM system.dictionaries WHERE (database = '') OR isNull(database);。このステートメントが行を返す場合、XML を使用して作成されたデータディクショナリが存在することを示します。 -
データディクショナリが外部サービスにアクセスする場合、外部サービスが利用可能であり、かつクラスターがその許可リストに追加されていることを確認してください。データディクショナリのデータソースが現在の ClickHouse クラスター内の内部テーブルであり、定義内の
HOSTパラメーターが IP アドレスの場合、移行後に IP アドレスが変更されるため、ディクショナリへのアクセスが失敗する可能性があります。現在の ClickHouse クラスターのHOSTを再確認し、データディクショナリを手動で再作成する必要があります。
-
-
テーブルスキーマ:Kafka および RabbitMQ エンジンテーブルを除くすべてのテーブルスキーマ。
-
データ:MergeTree ファミリーのテーブルからの増分データ移行。
-
-
サポートされないオブジェクトおよびデータ
-
Kafka および RabbitMQ エンジンテーブルとそのデータ。
-
外部テーブルやログテーブルなど、非 MergeTree テーブルのデータ。
重要上記のサポートされない項目は、手動で移行する必要があります。
-
-
データ量の制限
-
コールドデータ:コールドデータの移行は低速です。長時間の移行による失敗を防ぐため、セルフマネージドクラスターからコールドデータをクリアし、合計データ量が 1 TB を超えないようにすることを推奨します。
-
ホットデータ:ホットデータの量が 10 TB を超える場合、移行タスクが失敗する可能性が高くなります。
データ量がこれらの制限を超える場合は、代わりに手動移行ソリューションをご検討ください。
-
クラスターへの影響
-
セルフマネージドクラスター:
-
セルフマネージドクラスターからのデータ読み取りにより、CPU およびメモリ使用量が増加します。
-
DDL 操作は許可されません。
-
-
宛先クラスター:
-
宛先クラスターへのデータ書き込みにより、CPU およびメモリ使用量が増加します。
-
移行中のデータベースおよびテーブルに対して DDL 操作は許可されません。
-
この制限は、他のデータベースおよびテーブルには適用されません。
-
マージプロセスは、移行中のデータベースおよびテーブルに対してのみ停止されます。
-
移行タスク開始前にクラスターが再起動されます。
-
移行完了後、クラスターは頻繁にマージ操作を実行します。これにより I/O 使用量が増加し、ビジネスリクエストのレイテンシが高くなる可能性があります。このレイテンシ増加による影響を考慮してください。マージ操作の具体的な継続時間を計算する必要があります。手順については、「移行後のマージ時間の計算」をご参照ください。
-
操作手順
ステップ 1:クラスターを確認し、システムテーブルを有効化する
データ移行を開始する前に、セルフマネージドクラスターの config.xml ファイルを変更して増分移行を有効化します。必要な変更内容は、system.part_log および system.query_log テーブルが有効化されているかどうかによって異なります。
システムテーブルが有効化されていない場合
system.part_log および system.query_log が有効化されていない場合は、config.xml ファイルに次の設定を追加します。
system.part_log
<part_log>
<database>system</database>
<table>part_log</table>
<partition_by>event_date</partition_by>
<order_by>event_time</order_by>
<ttl>event_date + INTERVAL 15 DAY DELETE</ttl>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
</part_log>
system.query_log
<query_log>
<database>system</database>
<table>query_log</table>
<partition_by>event_date</partition_by>
<order_by>event_time</order_by>
<ttl>event_date + INTERVAL 15 DAY DELETE</ttl>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>
システムテーブルが有効化されている場合
-
config.xml ファイル内の
system.part_logおよびsystem.query_logの設定が、次の内容と一致していることを確認します。不一致があると、データ移行が失敗したり、遅延したりする可能性があります。system.part_log
<part_log> <database>system</database> <table>part_log</table> <partition_by>event_date</partition_by> <order_by>event_time</order_by> <ttl>event_date + INTERVAL 15 DAY DELETE</ttl> <flush_interval_milliseconds>7500</flush_interval_milliseconds> </part_log>system.query_log
<query_log> <database>system</database> <table>query_log</table> <partition_by>event_date</partition_by> <order_by>event_time</order_by> <ttl>event_date + INTERVAL 15 DAY DELETE</ttl> <flush_interval_milliseconds>7500</flush_interval_milliseconds> </query_log> -
設定を変更した後、
drop table system.part_logおよびdrop table system.query_logステートメントを実行します。ビジネステーブルにデータを挿入すると、system.part_logおよびsystem.query_logテーブルが自動的に再作成されます。
ステップ 2:宛先クラスターの互換性を設定する
宛先クラスターをセルフマネージドクラスターと互換性のある状態に設定します。このステップにより、移行後のアプリケーション変更を最小限に抑えることができます。
-
宛先クラスターとセルフマネージドクラスターのバージョン番号を取得し、比較します。
宛先クラスターおよびセルフマネージドクラスターにログインし、それぞれで次のステートメントを実行してバージョン番号を取得します。ApsaraDB for ClickHouse へのログイン方法については、「データベースへの接続」をご参照ください。
SELECT version(); -
バージョンが異なる場合は、宛先クラスターにログインし、セルフマネージドクラスターのバージョンと一致するように互換性パラメーターを設定します。これにより、機能を可能な限り一致させることができます。例を以下に示します。
SET GLOBAL compatibility = '22.8';
ステップ 3:(任意)MaterializedMySQL エンジンを有効化する
セルフマネージドクラスターに MaterializedMySQL エンジンを使用するテーブルが含まれている場合は、次のステートメントを実行してこのエンジンを有効化します。
SET GLOBAL allow_experimental_database_materialized_mysql = 1;
ClickHouse コミュニティは MaterializedMySQL エンジンのメンテナンスを終了しています。クラウドへの移行後は、Data Transmission Service (DTS) を使用して MySQL データを同期することを推奨します。
MaterializedMySQL エンジンがメンテナンスされていないため、Data Transmission Service (DTS) は MySQL データを ApsaraDB for ClickHouse に同期する際に、MaterializedMySQL テーブルの代わりに ReplacingMergeTree テーブルを使用します。詳細については、「MaterializedMySQL 互換性」をご参照ください。
DTS を使用して MySQL データを ApsaraDB for ClickHouse に移行する方法については、次のトピックをご参照ください。
ステップ 4:Kafka/RabbitMQ エンジンテーブルの記録とクリーンアップ
移行を開始する前に、セルフマネージドクラスター内のすべての Kafka/RabbitMQ エンジンテーブルおよびそれらに依存する下流のマテリアライズドビューの定義を記録し、暗黙的テーブルを処理した後、これらのテーブルを削除して移行エラーを回避します。
-
セルフマネージドクラスターにログインし、すべての Kafka および RabbitMQ エンジンテーブルとその下流の依存関係を照会します。
/* create_table_query: テーブル定義 dependencies_database: このテーブルに依存するテーブルのデータベース dependencies_table: このテーブルに依存するテーブル dependencies_database および dependencies_table から、Kafka/RabbitMQ テーブルに依存するマテリアライズドビューを特定できます */ SELECT * FROM system.tables WHERE engine IN ('RabbitMQ', 'Kafka'); -
マテリアライズドビューの定義を確認し、そのターゲットテーブルが暗黙的テーブルかどうかをチェックします。
/* マテリアライズドビューの定義を表示します。 マテリアライズドビューのターゲットテーブルが暗黙的テーブルの場合、特に注意が必要です: マテリアライズドビューを削除すると、暗黙的テーブルも削除され、データ損失が発生します。 例:CREATE MATERIALIZED VIEW [db.]table_name [TO[db.]name] で TO を指定しない場合、 システムは自動的に暗黙的テーブルを作成します。形式は '.inner_id.<TABLE_UUID>' または '.inner.<TABLE>' の可能性があります */ SELECT * FROM system.tables WHERE database='<DATABASE>' AND name = '<MATERIALIZED_VIEW_NAME>'; -
マテリアライズドビューのターゲットテーブルが暗黙的テーブルの場合、後でマテリアライズドビューを削除してもデータ損失が発生しないように、ターゲットテーブルの名前を新しい名前に変更します。
-- データ保護のために暗黙的ターゲットテーブルの名前を新しい名前に変更 RENAME TABLE <DATABASE>.`.inner_id.<TABLE_UUID>` TO <DATABASE>.<new_target_table_name>; -
Kafka/RabbitMQ エンジンテーブルおよびそれらに依存する下流のマテリアライズドビューを削除します。
-- まずマテリアライズドビューを削除 DROP TABLE <DATABASE>.<MATERIALIZED_VIEW_NAME>; -- 次に Kafka/RabbitMQ エンジンテーブルを削除 DROP TABLE <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME>;
記録したすべての DDL ステートメントを保存してください。これらは、後でセルフマネージドクラスターおよび宛先クラスターの両方でこれらのテーブルを再構築するために必要になります。RENAME 操作を実行した場合は、マテリアライズドビューを再構築する際に TO 句でリネーム後のターゲットテーブルを指定します。詳細については、「CREATE MATERIALIZED VIEW」をご参照ください。
ステップ 5:データ移行タスクの作成
-
ApsaraDB for ClickHouse コンソールにログインします。
-
クラスターリストページで、Community Edition インスタンスのリストを選択し、宛先クラスターの ID をクリックします。
-
左側のナビゲーションウィンドウで、を選択します。
-
移行タスクページで、移行タスクの作成をクリックします。
-
ソースインスタンスと宛先インスタンスを設定します。
次の設定を構成し、次のステップの接続をテストしますをクリックします。
説明接続テストが成功した場合は、次のステップに進んでください。接続テストが失敗した場合は、表示されるプロンプトに基づいてソースおよび宛先インスタンスを再設定してください。

ソースクラスターパラメーター
パラメーター
説明
例
ソースアクセスモード
専用回線 / VPN Gateway / Smart Gateway / ESC セルフマネージド ClickHouseを選択します。
専用回線 / VPN Gateway / Smart Gateway / ESC セルフマネージド ClickHouse
クラスター名
ソースクラスターの名前。
名前には数字と小文字のみを使用できます。
source
配信元インスタンスクラスター名
SELECT * FROM system.clusters;を実行して、配信元インスタンスクラスター名を取得します。default
VPC IP アドレス
クラスター内の各シャードの IP アドレスとポート (TCP アドレス) をカンマ区切りで指定します。
重要ApsaraDB for ClickHouse クラスターの VPC ドメイン名または SLB アドレスは使用できません。
形式:
IP:PORT,IP:PORT,......クラスターの IP アドレスとポートを取得する方法は、データ移行のシナリオによって異なります。
クロスアカウントまたはクロスリージョン移行
次の SQL ステートメントを使用して、セルフマネージドクラスターの IP アドレスとポートを取得できます。
SELECT shard_num, replica_num, host_address as ip, port FROM system.clusters WHERE cluster = 'default' and replica_num = 1;ここで、
replica_num=1は最初のレプリカセットを選択します。他のレプリカセットを選択したり、各シャードから 1 つのレプリカを選択することもできます。Alibaba Cloud 以外の ClickHouse 移行
IP アドレスを Alibaba Cloud に簡単にマッピングできない場合は、次の SQL ステートメントを使用してセルフマネージドクラスターの IP アドレスとポートを取得できます。
SELECT shard_num, replica_num, host_address as ip, port FROM system.clusters WHERE cluster = '<cluster_name>' and replica_num = 1;パラメーターの説明は次のとおりです。
-
cluster_name:宛先クラスターの名前。
-
replica_num=1は最初のレプリカセットを選択します。他のレプリカセットを選択したり、各シャードから 1 つのレプリカを選択することもできます。
IP アドレスとポートがネットワーク変換を通じて Alibaba Cloud にマッピングされている場合は、対応するマッピング済みの IP アドレスとポートを設定する必要があります。
192.168.0.5:9000,192.168.0.6:9000
データベースアカウント
ソースクラスターのデータベースアカウント。
test
データベースパスワード
ソースクラスターのデータベースアカウントのパスワード。
test******
宛先クラスターパラメーター
パラメーター
説明
例
データベースアカウント
宛先クラスターのデータベースアカウント。
test
データベースパスワード
宛先クラスターのデータベースアカウントのパスワード。
test******
-
-
移行内容を確認します。
ページに表示される移行対象データの情報を慎重に確認し、次: 同期の事前検出と開始をクリックします。
-
システムはバックグラウンドで移行リンクの事前チェックを実行し、タスクを開始します。
システムはソースおよび宛先クラスターに対してインスタンスステータスの検出、ストレージスペースの検出、およびローカルおよび分散テーブルの検出を実行します。
-
事前チェックが成功した場合:
事前チェック成功後のページを次に示します。

-
データ移行プロセスがインスタンスに与える影響を慎重に確認します。
-
終了をクリックします。
重要-
[完了] をクリックすると、システムがタスクを作成して開始し、ステータスが「実行中」に変化します。タスクリストでタスクを確認できます。
-
タスク作成後は、タスクを監視する必要があります。移行の最終段階では、セルフマネージドクラスターへの書き込み操作を停止し、残りのデータベースおよびテーブルスキーマを移行する必要があります。詳細については、「移行タスクの監視とセルフマネージドクラスターへの書き込み停止」をご参照ください。
-
-
-
事前チェックが失敗した場合:エラーメッセージの指示に従って、データ移行タスクを再度実行します。事前チェック項目とその要件を次の表に示します。事前チェックのエラーメッセージとその解決策の詳細については、「移行事前チェックエラーと解決策」をご参照ください。
チェック項目
要件
インスタンスステータスの検出
ソースまたは宛先クラスターで管理タスク (スケールアウト、アップグレード、スペックダウンなど) が実行中の場合、データ移行タスクを開始できません。
ストレージスペースの検出
宛先クラスターの利用可能なストレージ容量は、セルフマネージドクラスターの使用済みストレージ容量の少なくとも 1.2 倍である必要があります。
ローカルおよび分散テーブルの検出
セルフマネージドクラスターのローカルテーブルに対応する分散テーブルが存在しない、または複数存在する場合、チェックは失敗します。これを解決するには、余分な分散テーブルを削除するか、ローカルテーブルに対して一意の分散テーブルを作成してください。
-
-
ステップ 6:移行の実現可能性を評価する
ソースクラスターの書き込み速度が 20 MB/s 未満 の場合、このステップはスキップできます。
ソースクラスターの書き込み速度が 20 MB/s を超える 場合、移行の実現可能性を評価するために宛先クラスターの実際の書き込み速度を確認する必要があります。移行を成功させるには、宛先クラスターの書き込み速度がソースクラスターの書き込み速度に追いつく必要があります。次の手順を実行してください。
-
宛先クラスターの TairPDBShardingIOBandwidth を確認して、実際の書き込み速度を判断します。TairPDBShardingIOBandwidth の確認方法については、「クラスターモニタリングデータの表示」をご参照ください。
-
宛先クラスターとソースクラスターの書き込み速度を比較します。
-
宛先クラスターの書き込み速度がソースクラスターよりも 大きい 場合:移行は 成功する 可能性が高いです。ステップ 7 に進んでください。
-
宛先クラスターの書き込み速度がソースクラスターよりも 小さい 場合:移行は 失敗する 可能性が高いです。移行タスクをキャンセルし、手動移行を使用することを推奨します。
-
ステップ 7:移行の監視と書き込み停止
-
ApsaraDB for ClickHouse コンソールにログインします。
-
コミュニティエディションインスタンスリストで、宛先クラスターの ID をクリックします。
-
ナビゲーションウィンドウで、をクリックします。
-
インスタンス移行リストページで、次の操作が可能です。
-
移行タスクのステータスと実行段階を確認します。
-
[操作] 列で 詳細 をクリックして、タスク詳細ページを開きます。タスク詳細ページには次の情報が含まれます。
説明移行タスクが完了 (ステータスが 完了 または キャンセル) している場合、詳細を表示 ページの内容はクリアされます。宛先クラスターに移行されたテーブルスキーマの一覧を表示するには、次の SQL ステートメントを実行します。
SELECT `database`, `name`, `engine_full` FROM `system`.`tables` WHERE `database` NOT IN ('system', 'INFORMATION_SCHEMA', 'information_schema');-
移行されたすべてのテーブルスキーマとその移行ステータス。
-
移行されたすべてのデータベーススキーマとその移行ステータス。
-
データベースおよびテーブルの移行に失敗した場合のすべてのエラーメッセージ。
-
移行タスクのステータスを次の表に示します。
タスクステータス
説明
実行中
移行の環境およびリソースを準備しています。
初期化中
移行タスクを初期化しています。
構成移行
クラスター構成を移行しています。
スキーマ移行
すべてのデータベース、MergeTree ファミリーのテーブル、および分散テーブルを移行しています。
データ移行
MergeTree ファミリーのテーブルからデータを増分移行しています。
その他のスキーマ移行
マテリアライズドビューおよび非 MergeTree テーブルのスキーマを移行しています。
データチェック
宛先クラスターの完了テーブルのデータ量がセルフマネージドクラスターのデータ量と一致しているかをチェックしています。一致しない場合、タスクが失敗する可能性があります。移行を再開することを推奨します。
移行後構成
宛先クラスターのシステム設定を構成しています (例:移行リソースのクリーンアップ、ソースインスタンスへの書き込み再開など)。
完了
移行タスクが完了しました。
キャンセル
移行タスクがキャンセルされました。
-
ステップ 8:セルフマネージドクラスターでの Kafka/RabbitMQ エンジンテーブルの再構築
移行タスクが データ移行 フェーズ (つまり、テーブルスキーマの移行が完了) に入ったら、以前に保存した DDL ステートメントを使用して、セルフマネージドクラスターで Kafka/RabbitMQ エンジンテーブルおよびそれらに依存する下流のマテリアライズドビューを再構築します。再構築後、増分データの取り込みが再開され、自動的に宛先クラスターに同期されます。
以前に暗黙的ターゲットテーブルに対して RENAME 操作を実行した場合は、マテリアライズドビューを再構築する際に TO 句でリネーム後のターゲットテーブルを指定してください。
-- セルフマネージドクラスターで Kafka/RabbitMQ エンジンテーブルを再構築
CREATE TABLE <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME> (...)
ENGINE = Kafka/RabbitMQ
SETTINGS ...;
-- マテリアライズドビューを再構築 (リネーム後のターゲットテーブルを指す)
CREATE MATERIALIZED VIEW <DATABASE>.<MATERIALIZED_VIEW_NAME> TO <DATABASE>.<new_target_table_name>
AS SELECT ... FROM <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME>;
ステップ 9:書き込み停止と切り替え
推定残り移行時間が 10 分未満、または移行進捗が 99% に達したら、次の切り替え手順を実行します。
-
ビジネス書き込みを停止します。セルフマネージドクラスターで、以前に再構築した Kafka/RabbitMQ エンジンテーブルおよびそれらに依存する下流のマテリアライズドビューを削除します。
-- まずマテリアライズドビューを削除 DROP TABLE <DATABASE>.<MATERIALIZED_VIEW_NAME>; -- 次に Kafka/RabbitMQ エンジンテーブルを削除 DROP TABLE <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME>; -
移行進捗が 100% に達し、移行が完全に完了するまで待ちます。
-
宛先クラスターに接続し、以前に保存した DDL ステートメントを使用して Kafka/RabbitMQ エンジンテーブルおよびそれらに依存する下流のマテリアライズドビューを再構築します。
重要以前に暗黙的ターゲットテーブルに対して RENAME 操作を実行した場合は、マテリアライズドビューを再構築する際に TO 句でリネーム後のターゲットテーブルを指定してください。
-- 宛先クラスターで Kafka/RabbitMQ エンジンテーブルを再構築 CREATE TABLE <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME> (...) ENGINE = Kafka/RabbitMQ SETTINGS ...;-- マテリアライズドビューを再構築 (リネーム後のターゲットテーブルを指す) CREATE MATERIALIZED VIEW <DATABASE>.<MATERIALIZED_VIEW_NAME> TO <DATABASE>.<new_target_table_name> AS SELECT ... FROM <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME>; -
宛先クラスターのデータパイプラインが正常に動作しており、データが正常に流入していることを確認します。
ステップ 10:移行の完了
セルフマネージドクラスターへの書き込みを停止した後、Complete the taskできます。このステップにより、残りのデータが移行され、データ量チェックが実行され、残りのデータベースおよびテーブルスキーマが移行されます。タスク詳細で移行された内容を確認できます。
-
データチェックが失敗した場合、移行タスクはデータ量チェックフェーズのままになります。移行をキャンセルして、新しい移行タスクを作成することを推奨します。移行タスクのキャンセル方法については、「その他の操作」をご参照ください。
-
長時間のデータ移行により、宛先クラスターに過剰なメタデータが蓄積される可能性があります。移行タスクの実行期間は 5 日以内にすることを推奨します。5 日を超えるタスクは自動的にキャンセルされます。
-
ApsaraDB for ClickHouse コンソールにログインします。
-
クラスターリストページで、Community Edition インスタンスのリストを選択し、宛先クラスターの ID をクリックします。
-
左側のナビゲーションウィンドウで、をクリックします。
-
対象の移行タスクの 操作 列で、移行完了 をクリックします。
-
移行完了 ダイアログボックスで、を決定 をクリックします。
ステップ 11:非 MergeTree テーブルのデータ移行
移行タスクでは、非 MergeTree テーブル (外部テーブルやログテーブルなど) のテーブルスキーマのみが移行され、宛先クラスターにビジネスデータなしで作成されます。ビジネスデータは手動で移行する必要があります。次の手順を実行してください。
-
セルフマネージドクラスターにログインして、セルフマネージドクラスターでデータ移行が必要な MergeTree 以外のテーブルを特定するための次の文を実行します。
SELECT `database` AS database_name, `name` AS table_name, `engine` FROM `system`.`tables` WHERE (`engine` NOT LIKE '%MergeTree%') AND (`engine` != 'Distributed') AND (`engine` != 'MaterializedView') AND (`engine` NOT IN ('Kafka', 'RabbitMQ')) AND (`database` NOT IN ('system', 'INFORMATION_SCHEMA', 'information_schema')) AND (`database` NOT IN ( SELECT `name` FROM `system`.`databases` WHERE `engine` IN ('MySQL', 'MaterializedMySQL', 'MaterializeMySQL', 'Lazy', 'PostgreSQL', 'MaterializedPostgreSQL', 'SQLite') )) -
宛先クラスターにログインし、
remote関数を使用してテーブルデータを移行します。詳細な手順については、「remote 関数を使用したデータ移行」をご参照ください。
その他の操作
移行タスクが完了すると、移行ステータス が 完了 に変化します。タスクリストは即座に更新されないため、最新のステータスを確認するには定期的にページをリフレッシュしてください。
|
操作 |
説明 |
影響 |
シナリオ |
|
移行キャンセル |
タスクを強制的にキャンセルし、データ量チェックをスキップして、残りのデータベースおよびテーブルスキーマを移行しません。 |
|
移行がセルフマネージドクラスターに悪影響を及ぼし、すぐに書き込み操作を復元する必要がある場合に使用します。 |
|
移行の停止 |
データ移行を即座に停止しますが、残りのデータベースおよびテーブルスキーマの移行を完了します。データ量チェックはスキップされます。 |
データ移行は不完全になりますが、宛先インスタンスのデータベースおよびテーブルスキーマは完全になります。 |
セルフマネージドクラスターへの書き込みを中断せずに、部分的に移行されたデータセットをテストする場合に使用します。 |
移行停止
-
ApsaraDB for ClickHouse コンソールにログインします。
-
クラスターリストページで、Community Edition インスタンスのリストを選択し、対象クラスターの ID をクリックします。
-
左側のナビゲーションウィンドウで、を選択します。
-
対象の移行タスクの 操作 列で、移行を停止する をクリックします。
-
移行を停止する ダイアログボックスで、を決定 をクリックします。
移行キャンセル
-
ApsaraDB for ClickHouse コンソールにログインします。
-
クラスターリストページで、Community Edition インスタンスのリストを選択し、対象クラスターの ID をクリックします。
-
左側のナビゲーションウィンドウで、を選択します。
-
対象の移行タスクの 操作 列で、移行のキャンセル をクリックします。
-
移行のキャンセル ダイアログボックスで、を決定 をクリックします。
手動移行
方法 1:BACKUP および RESTORE コマンドの使用
詳細については、「BACKUP および RESTORE コマンドを使用したデータのバックアップと復元」をご参照ください。
方法 2:INSERT FROM SELECT ステートメントの使用
ステップ 1:メタデータの移行
ClickHouse メタデータの移行は、主にテーブル作成 DDL の移行です。
clickhouse-client ツールをインストールする必要がある場合は、そのバージョンが宛先の ApsaraDB for ClickHouse インスタンスのバージョンと一致していることを確認してください。ダウンロードリンクはclickhouse-clientで確認できます。
-
セルフマネージドクラスターのデータベース一覧を表示します。
clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SHOW databases" > database.listパラメーター:
パラメーター
説明
old host
セルフマネージドクラスターのアドレス。
old port
セルフマネージドクラスターのポート。
old user name
セルフマネージドクラスターにログインするためのアカウント。アカウントには DML 読み取り/書き込み権限、設定権限、および DDL 権限が必要です。
old password
アカウントのパスワード。
説明systemデータベースはシステムデータベースであり、移行する必要はありません。除外してください。 -
セルフマネージドクラスターのテーブル一覧を表示します。
clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SHOW tables from <database_name>" > table.listパラメーター:
パラメーター
説明
database_name
データベース名。
または、システムテーブルから直接すべてのデータベースおよびテーブル名を照会することもできます。
SELECT DISTINCT database, name FROM system.tables WHERE database != 'system';説明照会されたテーブル名が
.inner.で始まる場合、それはマテリアライズドビューの内部表現であり、移行する必要はありません。除外してください。 -
セルフマネージドクラスターから特定のデータベース内のすべてのテーブルのテーブル作成 DDL をエクスポートします。
clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SELECT concat(create_table_query, ';') FROM system.tables WHERE database='<database_name>' FORMAT TabSeparatedRaw" > tables.sql -
テーブル作成 DDL を宛先の ApsaraDB for ClickHouse インスタンスにインポートします。
説明テーブル作成 DDL をインポートする前に、ApsaraDB for ClickHouse インスタンスに該当するデータベースを作成しておく必要があります。
clickhouse-client --host="<new host>" --port="<new port>" --user="<new user name>" --password="<new password>" -d '<database_name>' --multiquery < tables.sqlパラメーター:
パラメーター
説明
new host
宛先の ApsaraDB for ClickHouse インスタンスのアドレス。
new port
宛先の ApsaraDB for ClickHouse インスタンスのポート。
new user name
宛先の ApsaraDB for ClickHouse インスタンスにログインするためのアカウント。アカウントには DML 読み取り/書き込み権限、設定権限、および DDL 権限が必要です。
new password
アカウントのパスワード。
ステップ 2:データの移行
リモート関数
-
-
宛先の ApsaraDB for ClickHouse インスタンスで、次の SQL ステートメントを実行してデータを移行します。
INSERT INTO <new_database>.<new_table> SELECT * FROM remote('<old_endpoint>', <old_database>.<old_table>, '<username>', '<password>') [WHERE _partition_id = '<partition_id>'] SETTINGS max_execution_time = 0, max_bytes_to_read = 0, log_query_threads = 0, max_result_rows = 0, min_insert_block_size_rows = 4294967296, min_insert_block_size_bytes = 1073741824;説明バージョン 20.8 の場合は、まず
remoteRaw関数を使用してデータ移行を実行してください。移行が失敗した場合は、マイナーバージョンのアップグレードをリクエストできます。INSERT INTO <new_database>.<new_table> SELECT * FROM remoteRaw('<old_endpoint>', <old_database>.<old_table>, '<username>', '<password>') [WHERE _partition_id = '<partition_id>'] SETTINGS max_execution_time = 0, max_bytes_to_read = 0, log_query_threads = 0, max_result_rows = 0, min_insert_block_size_rows = 4294967296, min_insert_block_size_bytes = 1073741824;パラメーター:
重要_partition_idパラメーターを使用してデータをフィルターできます。これにより、リソース使用量を削減できます。パラメーター
説明
new_database
宛先の ApsaraDB for ClickHouse インスタンスのデータベース名。
new_table
宛先の ApsaraDB for ClickHouse インスタンスのテーブル名。
old_endpoint
ソースインスタンスのエンドポイント。
セルフマネージド ClickHouse
エンドポイント形式:
ソースインスタンスノードの IP アドレス:ポート。重要ポートは TCP ポートである必要があります。
ApsaraDB for ClickHouse
ソースインスタンスの VPC 内部エンドポイントを使用します。パブリックエンドポイントは使用できません。
重要ポート 3306 および 9000 は固定値です。
-
コミュニティエディションインスタンス:
-
エンドポイント形式:
VPC 内部アドレス:3306。 -
例:
cc-2zeqhh5v7y6q*****.clickhouse.ads.aliyuncs.com:3306
-
-
エンタープライズインスタンス:
-
エンドポイント形式:
VPC 内部アドレス:9000。 -
例:
cc-bp1anv7jo84ta*****clickhouse.clickhouseserver.rds.aliyuncs.com:9000
-
old_database
セルフマネージドクラスターのデータベース名。
old_table
セルフマネージドクラスターのテーブル名。
username
セルフマネージドクラスターのアカウント。
password
セルフマネージドクラスターのアカウントのパスワード。
max_execution_time
クエリの最大実行時間。制限なしにするには 0 を設定します。
max_bytes_to_read
クエリがソースデータから読み取ることのできる最大バイト数。制限なしにするには 0 を設定します。
log_query_threads
クエリ実行中にスレッド情報をログに記録するかどうかを指定します。ログ記録を無効にするには 0 を設定します。
max_result_rows
クエリ結果の最大行数。制限なしにするには 0 を設定します。
min_insert_block_size_rows
1 回の書き込みにおけるデータパーツごとの最小行数。行数制限を無効にするには 4294967296 (最大値) を設定します。この設定は min_insert_block_size_bytes と連携して、過剰な小規模パーツを防止します。
min_insert_block_size_bytes
1 回の書き込みにおけるデータパーツごとの最小サイズ (バイト単位)。過剰な小規模パーツを防止し、「Too many partitions for a single INSERT block」エラーを回避するために、1073741824 (1 GB) を設定します。
_partition_id
データパーティション ID。
-
ファイルのエクスポートおよびインポート
セルフマネージドクラスターデータベースからファイルにデータをエクスポートし、その後ファイルを宛先の ApsaraDB for ClickHouse インスタンスにインポートします。
-
CSV エクスポートおよびインポート
-
セルフマネージドクラスターデータベースから CSV ファイルにデータをエクスポートします。
clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="select * from <database_name>.<table_name> FORMAT CSV" > table.csv -
CSV ファイルを宛先の ApsaraDB for ClickHouse インスタンスにインポートします。
clickhouse-client --host="<new host>" --port="<new port>" --user="<new user name>" --password="<new password>" --query="insert into <database_name>.<table_name> FORMAT CSV" < table.csv
-
-
Linux パイプを使用したストリーム
clickhouse-client --host="<old host>" --port="<old port>" --user="<user name>" --password="<password>" --query="select * from <database_name>.<table_name> FORMAT CSV" | clickhouse-client --host="<new host>" --port="<new port>" --user="<user name>" --password="<password>" --query="INSERT INTO <database_name>.<table_name> FORMAT CSV"
移行チェックエラーとソリューション
|
エラーメッセージ |
説明 |
ソリューション |
|
一意の分散テーブルが存在しない、または sharding_key が設定されていません。 |
|
|
|
対応する分散テーブルが一意ではありません。 |
|
|
|
マルチレプリカクラスター上の MergeTree テーブル。 |
|
|
|
送信先クラスター上にデータ保持済みのテーブルが存在します。 |
移行対象のテーブルがすでに |
|
|
分散テーブルとローカルテーブルのカラムが競合しています。 |
|
|
|
ストレージ容量が不足しています。 |
|
|
|
システムテーブルが存在しません。 |
|
|
|
テーブルがノード間で不完全です。 |
一部の |
異なる |
移行後のマージ時間の算出
移行後、送信先クラスターでは一時的に頻繁なマージ操作が実行されます。これにより I/O 使用率が増加し、サービスリクエストのレイテンシが高くなる可能性があります。読み取りおよび書き込みのレイテンシに敏感なサービスを運用している場合は、インスタンスタイプおよび ESSD パフォーマンスレベルをアップグレードして、この高 I/O 使用率期間を短縮することを推奨します。詳細については、「コミュニティ互換クラスターの縦スケーリング、スケールアウト、スケールイン」をご参照ください。
移行後のマージ時間を算出するには、以下の数式を使用します。
これらの数式は、シングルレプリカクラスターおよびマスターレプリカクラスターの両方に適用されます。
-
頻繁なマージ操作にかかる推定総時間 =
MAX(ホットデータマージ時間, コールドデータマージ時間)-
ホットデータマージ時間 =
シングルノード上のホットデータ量 * 2 / MIN(インスタンスタイプ帯域幅, ディスク帯域幅 * n) -
コールドデータマージ時間 =
(コールドデータ量 / ノード数) / MIN(インスタンスタイプ帯域幅, OSS 読み取り帯域幅) + (コールドデータ量 / ノード数) / MIN(インスタンスタイプ帯域幅, OSS 書き込み帯域幅)
-
以下のリストは、数式で使用されるパラメーターの説明です。
-
シングルノード上のホットデータ量: この値は、[ディスク使用量 - シングルノード統計] 行で確認できます。詳細については、「クラスターモニタリング情報の表示」をご参照ください。
-
インスタンスタイプ帯域幅
説明これらの帯域幅値は絶対的なものではなく、ApsaraDB for ClickHouse バックエンドで使用されるマシンタイプによって異なります。記載されている値は最小値であり、参考値としてのみご利用ください。
仕様
帯域幅 (MB/s)
標準 8 コア 32 GB
250
標準 16 コア 64 GB
375
標準 24 コア 96 GB
500
標準 32 コア 128 GB
625
標準 64 コア 256 GB
1250
標準 80 コア 384 GB
2000
標準 104 コア 384 GB
2000
-
ディスク帯域幅:ESSD パフォーマンスレベル の表にある ディスクあたりの最大スループット (MB/s) 行からこの値を確認します。
-
n:シングルノード上のディスク数。この値を取得するには、次のコマンドを実行します:
SELECT count() FROM system.disks WHERE type = 'local'; -
コールドデータ量:この値は、clickhouse_cold_storage_data 行で確認できます。詳細については、「クラスターモニタリング情報の確認」をご参照ください。
-
ノード数:クラスター内のノード数。この値を取得するには、次のコマンドを実行します:
SELECT count() FROM system.clusters WHERE cluster = 'default' and replica_num=1; -
OSS 読み取り帯域幅:OSS 帯域幅 の表にある イントラネットおよびインターネット合計ダウンロード帯域幅 列からこの値を確認します。
-
OSS 書き込み帯域幅:OSS 帯域幅 の表にある イントラネットおよびインターネット合計アップロード帯域幅 列からこの値を確認します。
よくある質問
-
Q:「Too many partitions for single INSERT block (more than 100)」エラーを解決するにはどうすればよいですか?
A:このエラーは、単一の INSERT 操作が max_partitions_per_insert_block 制限(デフォルト値は 100)を超えるために発生します。ClickHouse では、各書き込み操作によりデータパーツが作成され、1 つのパーティションに 1 つ以上のデータパーツが含まれる場合があります。単一の INSERT 操作で多数のパーティションにデータを書き込むと、過剰な数のデータパーツが生成され、マージおよびクエリのパフォーマンスが著しく低下する可能性があります。ClickHouse は、このようなパフォーマンス劣化を防ぐためにこの制限を設けています。
この問題を解決するには、パーティション数を調整するか、max_partitions_per_insert_block パラメーターを変更してください。
-
テーブルスキーマやパーティショニング方法を調整するか、単一の操作で多数の異なるパーティションにデータを挿入しないようにしてください。
-
一度に多数のパーティションにデータを挿入する必要がある場合は、max_partitions_per_insert_block パラメーターを変更して制限値を引き上げることができます。構文は次のとおりです。
SET GLOBAL ON cluster DEFAULT max_partitions_per_insert_block = XXX;説明ClickHouse コミュニティでは、デフォルト値の 100 を使用することを推奨しています。この値を高すぎに設定するとパフォーマンスが劣化する可能性があるため、注意してください。バッチデータインポート後は、この値をデフォルトに戻すことを推奨します。
-
-
Q:宛先の ApsaraDB for ClickHouse インスタンスから自己管理データベースへの接続が失敗するのはなぜですか?
A:自己管理データベースがファイアウォールの背後にあるか、ホワイトリストを使用している場合にこの問題が発生します。これを解決するには、ApsaraDB for ClickHouse クラスターの vSwitch の IPv4 CIDR ブロックを、自己管理データベースのホワイトリストに追加してください。ApsaraDB for ClickHouse クラスターの vSwitch の IPv4 CIDR ブロックを取得する方法については、「IPv4 CIDR ブロックの確認」をご参照ください。
-
Q:マルチレプリカインスタンスをスケーリングまたは移行する際に、非 Replicated テーブルが許可されないのはなぜですか?また、既存の非 Replicated テーブルがある場合、どのように対処すればよいですか?
A:この制限の理由と対処方法は次のとおりです。
-
理由:マルチレプリカインスタンスでは、レプリカ間でデータを同期するために Replicated テーブルが必要です。Replicated テーブルが存在しない場合、マルチレプリカ構成は効果を発揮しません。移行ツールは、ランダムに 1 つのレプリカをデータソースとして選択し、そのデータを宛先インスタンスに移行します。
非 Replicated テーブルが存在する場合、レプリカ間でデータが同期されず、各レプリカが独立したデータを保持します。移行ツールは 1 つのレプリカからのみデータを移行するため、このプロセスによりデータ損失が発生します。たとえば、下図のように、レプリカ 0(r0)上の MergeTree テーブルにはデータ 1、2、3 が含まれ、レプリカ 1(r1)上の MergeTree テーブルにはデータ 4、5 が含まれているとします。移行ツールが r0 をソースとして選択した場合、データ 1、2、3 のみが宛先インスタンスに移行されます。
-
ソリューション:ソースインスタンス内の非 Replicated テーブルを削除できる場合は、削除することを推奨します。削除できない場合は、非 Replicated テーブルを Replicated テーブルに置き換えてください。手順は次のとおりです。
-
ソースインスタンスにログインします。
-
Replicated テーブルを作成します。エンジンを除き、テーブルスキーマは置き換え対象の非 Replicated テーブルと同一である必要があります。
-
非 Replicated テーブルから新しい Replicated テーブルへ手動でデータを移行します。移行文は次のとおりです。
重要この移行操作は各レプリカに対して個別に実行する必要があります。たとえば、r0 および r1 の両方で文を実行する必要があります。
文内で使用するノード IP アドレスは、
SELECT * FROM system.clusters;を実行することで取得できます。INSERT INTO <destination_database>.<new_replicated_table> SELECT * FROM remote('<node_IP_address>:3003', '<source_database>', '<non_replicated_table_to_replace>', '<username>', '<password>') [WHERE _partition_id = '<partition_id>'] SETTINGS max_execution_time = 0, max_bytes_to_read = 0, log_query_threads = 0, min_insert_block_size_rows = 4294967296, min_insert_block_size_bytes = 1073741824; -
非 Replicated テーブルと Replicated テーブルの名前を交換します。
EXCHANGE TABLES <source_database>.<non_replicated_table_to_replace> AND <destination_database>.<new_replicated_table> ON CLUSTER default; -
-