このトピックでは、セルフマネージドClickHouseクラスターからApsaraDB for ClickHouseクラスターにデータを移行して、ビジネスのスケーラビリティと信頼性を向上させる方法に関する実践的なガイドを提供します。 また、移行プロセス中に発生する可能性のある潜在的な問題を処理する方法に関するガイダンスも提供します。 このトピックの移行ポリシーは、データ移行を効率的かつ安全に完了し、クラウド環境のメリットを最大化するのに役立ちます。
セキュリティ上の理由から、インターネット経由でApsaraDB For ClickHouseクラスターに接続することはできません。 ApsaraDB for ClickHouseクラスターのバックエンドサーバーは、同じ仮想プライベートクラウド (VPC) 内のサーバーにのみ接続できます。 データを移行する前に、セルフマネージドClickHouseクラスターとターゲットApsaraDB for ClickHouseクラスターが互いに通信できることを確認します。
概要
データ移行ポリシーには、主に2つの手順が含まれます。まず、メタデータを移行して、すべてのテーブルスキーマがApsaraDB for ClickHouseクラスターに正しく移行されるようにします。 次に、ApsaraDB for ClickHouseのリモート
機能を使用してデータを直接移行するか、データをエクスポートしてApsaraDB for ClickHouseクラスターにインポートして移行を完了します。
セルフマネージドClickHouseクラスターとターゲットApsaraDB for ClickHouseクラスター間のネットワーク関係 | 移行方法 |
セルフマネージドClickHouseクラスターは、Alibaba Cloud ECS (Elastic Compute Service) インスタンスにデプロイされています。 ECSインスタンスとApsaraDB for ClickHouseクラスターは同じVPCにデプロイされています。 |
|
セルフマネージドClickHouseクラスターは、Alibaba Cloud ECSインスタンスにデプロイされています。 ECSインスタンスとApsaraDB for ClickHouseクラスターは、異なるVPCにデプロイされています。 |
|
セルフマネージドClickHouseクラスターはAlibaba Cloud ECSインスタンスにデプロイされていません。 たとえば、セルフマネージドClickHouseクラスターはオンプレミスのデータセンターにデプロイされています。 |
|
セルフマネージドClickHouseクラスターは、ターゲットApsaraDB for ClickHouseクラスターに接続できません。 |
|
セルフマネージドClickHouseクラスターは、ターゲットApsaraDB for ClickHouseクラスターに接続できませんが、SparkやFlinkなどのインフラストラクチャは利用可能です。 | SparkジョブまたはFlinkジョブを作成して、セルフマネージドClickHouseクラスターからデータを読み取り、ターゲットApsaraDB for ClickHouseクラスターにデータを書き込みます。 |
ステップ1: メタデータの移行
セルフマネージドClickHouseクラスターからメタデータを移行するには、セルフマネージドClickHouseクラスターにテーブルを作成するために実行されるDDLステートメントを、移行先のApsaraDB for ClickHouseクラスターにインポートします。
clickhouse-clientをインストールする必要がある場合は、clickhouse-clientのバージョンがターゲットApsaraDB for ClickHouseクラスターのバージョンと一致していることを確認してください。 clickhouse-clientのダウンロードリンクの詳細については、「clickhouse-client」をご参照ください。
自己管理ClickHouseクラスター内のデータベースを照会します。
clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SHOW databases" > database.list
次の表に、上記の構文のパラメーターを示します。
パラメーター
説明
古いホスト
セルフマネージドClickHouseクラスターのエンドポイント。
古いポート
セルフマネージドClickHouseクラスターによって使用されるポート。
古いユーザー名
セルフマネージドClickHouseクラスターへのログインに使用されるユーザー名。 ユーザーには、読み取り、書き込み、および設定権限を含むDML権限があります。 ユーザーにDDL権限を付与することもできます。
古いパスワード
セルフマネージドClickHouseクラスターへの接続に使用されるユーザーのパスワード。
説明systemはシステムデータベースを表します。 このデータベースを移行する必要はありません。
自己管理ClickHouseクラスター内のテーブルを照会します。
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で始まるテーブル名。 具体化されたビューの内部表現です。 移行中にこれらのテーブルをスキップできます。
セルフマネージドClickHouseクラスターの指定されたデータベースにテーブルを作成するために実行される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
セルフマネージドClickHouseクラスターにテーブルを作成するために実行される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
次の表に、上記の構文のパラメーターを示します。
パラメーター
説明
新しいホスト
ターゲットApsaraDB for ClickHouseクラスターのエンドポイント。
新しいポート
ターゲットApsaraDB for ClickHouseクラスターによって使用されるポート。
新しいユーザー名
ターゲットApsaraDB for ClickHouseクラスターへのログインに使用されるユーザー名。 ユーザーには、読み取り、書き込み、および設定権限を含むDML権限があります。 ユーザーにDDL権限を付与することもできます。
新しいパスワード
ターゲットApsaraDB for ClickHouseクラスターへのログインに使用されるユーザーのパスワード。
ステップ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;
ApsaraDB For ClickHouse V20.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;
次の表に、上記のステートメントのパラメーターを示します。
partition_idパラメーターは、リソース使用量を減らすためにデータをフィルタリングするために使用できます。 このパラメーターの使用を推奨します。
パラメーター | 説明 |
new_database | ターゲットApsaraDB for ClickHouseクラスター内のデータベースの名前。 |
new_table | ターゲットApsaraDB for ClickHouseクラスター内のテーブルの名前。 |
old_endpoint | ソースクラスターのエンドポイント。 自己管理ClickHouseクラスターセルフマネージドClickHouseクラスターのエンドポイントは、 重要 この場合、ポートはTCPポートです。 ApsaraDB for ClickHouseクラスターApsaraDB for ClickHouseクラスターのエンドポイントは、パブリックエンドポイントではなくVPCエンドポイントです。 重要 ポート3306はApsaraDB for ClickHouse Community-compatible Editionクラスターのデフォルトポートであり、ポート9000はApsaraDB for ClickHouse Enterprise Editionクラスターのデフォルトポートです。
|
old_database | セルフマネージドClickHouseクラスター内のデータベースの名前。 |
old_table | セルフマネージドClickHouseクラスター内のテーブルの名前。 |
username | セルフマネージドClickHouseクラスターへのログインに使用されるユーザー名。 |
password | セルフマネージドClickHouseクラスターへのログインに使用されるパスワード。 |
max_execution_time | クエリの最大実行時間。 値0は、制限が課されないことを示す。 |
max_bytes_to_read | クエリ中にソースデータから読み取ることができる最大バイト数。 値0は、制限が課されないことを示す。 |
log_query_threads | クエリスレッドに関する情報をログに記録するかどうかを指定します。 値0は、クエリスレッドに関する情報がログに記録されていないことを示します。 |
_partition_id | データパーティションのID。 |
ファイルをエクスポートおよびインポートしてデータを移行
セルフマネージドClickHouseクラスターからファイルをエクスポートし、ファイルをターゲットApsaraDB for ClickHouseクラスターにインポートして、データを移行できます。
CSVファイルのエクスポートとインポート
セルフマネージドClickHouseクラスターから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"
よくある質問
Q: 「単一のINSERTブロックにパーティションが多すぎます (100を超える) 」というエラーメッセージが表示された場合はどうすればよいですか?
A: 単一のINSERT操作で指定された単一の挿入ブロック内のパーティションの数が、max_partitions_per_insert_blockの値を超えています。 max_partitions_per_insert_blockのデフォルト値は100です。 ApsaraDB for ClickHouseは、書き込み操作ごとにデータ部分を生成します。 パーティションは、1つ以上のデータ部分を含み得る。 1つのINSERT操作で過度に多数のパーティションが挿入されると、ApsaraDB for ClickHouseで大量のデータパーツが生成され、マージ操作やクエリ操作に大きな負担がかかる可能性があります。 大量のデータパーツが生成されないようにするために、ApsaraDB for ClickHouseは一定の制限を課しています。
解決策: 次の操作を実行して、パーティションの数またはmax_partitions_per_insert_blockの値を調整します。
テーブルスキーマとパーティション分割モードを調整するか、一度に挿入されるパーティションの数が上限を超えないようにします。
一度に挿入するパーティションの数が上限を超えないようにするには、次の文を実行して、データ量に応じてmax_partitions_per_insert_blockの値を変更し、一度に挿入できるパーティションの数の上限を増やします。
SET GLOBAL ON cluster DEFAULT max_partitions_per_insert_block = XXX;
説明ClickHouseでは、max_partitions_per_insert_blockの推奨デフォルト値は100です。 max_partitions_per_insert_blockを大きすぎる値に設定しないでください。 そうしないと、パフォーマンスに影響を与える可能性があります。 バッチでデータをインポートした後、max_partitions_per_insert_blockの値をデフォルト値に変更できます。
Q: ターゲットApsaraDB for ClickHouseクラスターがセルフマネージドClickHouseクラスターへの接続に失敗するのはなぜですか。
A: セルフマネージドClickHouseクラスターにファイアウォールまたはホワイトリストが設定されている可能性があります。 ApsaraDB for ClickHouseコンソールでターゲットApsaraDB for ClickHouseクラスターが属するVPCを表示し、VPCのCIDRブロック全体をセルフマネージドClickHouseクラスターのホワイトリストに追加できます。 潜在的なセキュリティリスクを回避するためにホワイトリストのCIDRブロック範囲を制御する場合は、次のSQL文を実行して、ターゲットApsaraDB for ClickHouseクラスターのバックエンドサーバーのIPアドレスを照会し、これらのIPアドレスのみをセルフマネージドClickHouseクラスターのホワイトリストに追加します。
SELECT * FROM system.clusters;