すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for ClickHouse:セルフマネージドClickHouseクラスターからApsaraDB for ClickHouseクラスターへのデータの移行

最終更新日:Oct 17, 2024

このトピックでは、セルフマネージド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にデプロイされています。

  1. 手順1: メタデータの移行で操作を実行します。

  2. リモート機能を使用してデータを移行します。

セルフマネージドClickHouseクラスターは、Alibaba Cloud ECSインスタンスにデプロイされています。 ECSインスタンスとApsaraDB for ClickHouseクラスターは、異なるVPCにデプロイされています。

  1. 2つのVPCを相互に接続します。 詳細については、「VPC接続の概要」をご参照ください。

  2. 手順1: メタデータの移行で操作を実行します。

  3. リモート機能を使用してデータを移行します。

セルフマネージドClickHouseクラスターはAlibaba Cloud ECSインスタンスにデプロイされていません。 たとえば、セルフマネージドClickHouseクラスターはオンプレミスのデータセンターにデプロイされています。

  1. オンプレミスデータセンターをVPCに接続します。 詳細については、「データセンターをVPCに接続する」をご参照ください。

  2. 手順1: メタデータの移行で操作を実行します。

  3. リモート機能を使用してデータを移行します。

セルフマネージドClickHouseクラスターは、ターゲットApsaraDB for ClickHouseクラスターに接続できません。

  1. 手順1: メタデータの移行で操作を実行します。

  2. データを移行するためのファイルのエクスポートとインポート

セルフマネージド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」をご参照ください。

  1. 自己管理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はシステムデータベースを表します。 このデータベースを移行する必要はありません。

  2. 自己管理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で始まるテーブル名。 具体化されたビューの内部表現です。 移行中にこれらのテーブルをスキップできます。

  3. セルフマネージド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
  4. セルフマネージド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: データの移行

リモート機能を使用したデータの移行

  1. (オプション) ApsaraDB for ClickHouseクラスターにデータを移行する際にネットワークトラフィックの消費量を考慮する必要がある場合は、network_compression_methodパラメーターの値を調整して適切な圧縮アルゴリズムを選択し、トラフィックの消費量を削減できます。

    • 移行先ApsaraDB for ClickHouseクラスターのnetwork_compression_methodパラメーターの値を表示または一時的に変更します。 次のステートメントは例を提供します。

    • SET network_compression_method = 'ZSTD';
    • 移行先ApsaraDB for ClickHouseクラスターのnetwork_compression_methodパラメーターの値を表示します。 次のステートメントは例を提供します。

    • SELECT * FROM system.settings WHERE name = 'network_compression_method';
  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パラメーターは、リソース使用量を減らすためにデータをフィルタリングするために使用できます。 このパラメーターの使用を推奨します。

(オプション) 次のSQL文を実行して、partition_idパラメーターの値とsystem.partsの部品数を照会できます。

SELECT partition_id, count(*) AS part_count from clusterAllReplicas(default, system, parts) WHERE `database` = '<old_database>' AND `table` = '<old_table>' GROUP BY partition_id ;

パラメーター

説明

new_database

ターゲットApsaraDB for ClickHouseクラスター内のデータベースの名前。

new_table

ターゲットApsaraDB for ClickHouseクラスター内のテーブルの名前。

old_endpoint

ソースクラスターのエンドポイント。

自己管理ClickHouseクラスター

セルフマネージドClickHouseクラスターのエンドポイントは、送信元クラスターノードのIPアドレス: ポート形式です。

重要

この場合、ポートはTCPポートです。

ApsaraDB for ClickHouseクラスター

ApsaraDB for ClickHouseクラスターのエンドポイントは、パブリックエンドポイントではなくVPCエンドポイントです。

重要

ポート3306はApsaraDB for ClickHouse Community-compatible Editionクラスターのデフォルトポートであり、ポート9000はApsaraDB for ClickHouse Enterprise Editionクラスターのデフォルトポートです。

  • Community-compatible Editionクラスター:

    • エンドポイントはVPCエンドポイント: 3306形式です。

    • 例: cc-2zeqhh5v7y6q ***** .clickhouse.ads.aliyuncs.com:3306

  • Enterprise Editionクラスター:

    • エンドポイントはVPCエンドポイント: 9000形式です。

    • 例: cc-bp1anv7jo84ta ***** clickhouse.clickhouseserver.rds.aliyuncs.com:9000

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ファイルのエクスポートとインポート

    1. セルフマネージド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
    2. 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;