チュートリアル: Cassandra 用 API アカウントにデータを移行する

適用対象: Cassandra

開発者は、所有しているオンプレミスまたはクラウドで実行される既存の Cassandra のワークロードを Azure に移行したいと考えることがあります。 そのようなワークロードを、Azure Cosmos DB の Cassandra 用 API アカウントに移行できます。 このチュートリアルでは、Apache Cassandra のデータを Azure Cosmos DB の Cassandra 用 API アカウントに移行するために利用できる複数のオプションについて、その手順を説明します。

このチュートリアルに含まれるタスクは次のとおりです。

  • 移行の計画
  • 移行の前提条件
  • cqlshCOPY コマンドを使用してデータを移行する
  • Spark を使用してデータを移行する

Azure サブスクリプションがない場合は、開始する前に無料アカウントを作成してください。

移行の前提条件

  • スループットのニーズを推定する: Azure Cosmos DB の Cassandra 用 API アカウントにデータを移行する前に、ワークロードに必要なスループットを見積もる必要があります。 一般に、CRUD 操作で必要な平均スループットから始め、次に、抽出、変換、読み込み、またはスパイク時の操作に必要な追加スループットを含めます。 移行を計画するには次の詳細情報が必要です。

    • 既存のデータ サイズまたは推定データ サイズ: データベースの最小サイズとスループットの要件を定義します。 新しいアプリケーションのデータ サイズを推定する場合は、データが行に一様に分散しているものと見なし、データ サイズを掛けることによって値を推定できます。

    • 必要なスループット: 読み取り (クエリ、取得) および書き込み (更新、削除、挿入) 操作の概算スループット レート。 この値は、必要な要求ユニット数と安定した状態のデータ サイズを計算するために必要です。

    • スキーマ:cqlsh を使用して既存の Cassandra クラスターに接続し、Cassandra からスキーマをエクスポートします。

      cqlsh [IP] "-e DESC SCHEMA" > orig_schema.cql
      

      既存のワークロードの要件を明らかにした後は、収集したスループットの要件に従って Azure Cosmos DB アカウント、データベース、およびコンテナーを作成します。

    • 操作の RU 料金の決定: Cassandra 用 API によってサポートされている任意の SDK を使用して、RU を決定できます。 この例では、.NET バージョンでの RU 負担取得方法を示します。

      var tableInsertStatement = table.Insert(sampleEntity);
      var insertResult = await tableInsertStatement.ExecuteAsync();
      
      foreach (string key in insertResult.Info.IncomingPayload)
        {
           byte[] valueInBytes = customPayload[key];
           double value = Encoding.UTF8.GetString(valueInBytes);
           Console.WriteLine($"CustomPayload:  {key}: {value}");
        }
      
  • 必要なスループットの割り当て: Azure Cosmos DB は、要件の増大に従って、ストレージとスループットを自動的にスケーリングできます。 Azure Cosmos DB の要求ユニット計算ツールを使って、スループットのニーズを推定することができます。

  • Cassandra 用 API アカウントでテーブルを作成する: データの移行を開始する前に、Azure portal または cqlsh を使用してすべてのテーブルを事前に作成します。 データベースレベルのスループットがある Azure Cosmos DB アカウントに移行しようとしている場合は、コンテナーの作成時に必ずパーティション キーを指定するようにしてください。

  • スループットを向上させる: データの移行にかかる時間は、Azure Cosmos DB のテーブルに対してプロビジョニングしたスループットの量に依存します。 移行の間だけスループットを高くします。 スループットが高くなるほど、レート制限を回避し、移行に要する時間を短縮できます。 移行が完了したら、コストを節約するためにスループットを下げます。 また、Azure Cosmos DB アカウントをソース データベースと同じリージョンに作成することもお勧めします。

  • TLS を有効にする: Azure Cosmos DB には、厳密なセキュリティ要件と基準があります。 アカウントを操作するときは、TLS が有効になっていることを確認してください。 SSH で CQL を使用する場合は、TLS の情報を指定するオプションがあります。

データを移行するためのオプション

cqlshCOPY コマンドまたは Spark を使用して、既存の Cassandra ワークロードから Azure Cosmos DB にデータを移動できます。

cqlsh COPY コマンドを使用してデータを移行する

CQL COPY コマンドを使用して、ローカル データを Azure Cosmos DB の Cassandra 用 API アカウントにコピーします。

警告

CQL COPY は、小さなデータセットを移行するためにのみ使用します。 大きなデータセットを移動するには、Spark を使用してデータを移行します

  1. csv ファイルに正しいファイル構造が確実に含まれるようにするために、COPY TO コマンドを使用して、ソースの Cassandra テーブルから csv ファイルにデータを直接エクスポートします (cqlsh が適切な資格情報を使用してソース テーブルに接続されていることを確認します)。

    COPY exampleks.tablename TO 'data.csv' WITH HEADER = TRUE;   
    
  2. 次に、Cassandra 用 API アカウントの接続文字列情報を取得します。

    • Azure portal にサインインし、Azure Cosmos DB アカウントに移動します。

    • [接続文字列] ウィンドウを開きます。 ここには、cqlsh から Cassandra 用 API アカウントに接続するために必要なすべての情報が表示されます。

  3. ポータルからの接続情報を使用して cqlsh にサインインします。

  4. CQLCOPY FROM コマンドを使用して、data.csv をコピーします (cqlsh がインストールされているユーザー ルート ディレクトリに引き続き存在します)。

    COPY exampleks.tablename FROM 'data.csv' WITH HEADER = TRUE;
    

注意

Cassandra 用 API では、Cassandra 3.11 に付属するプロトコル バージョン 4 がサポートされます。 API で、これよりも新しいプロトコル バージョンを使用すると、問題が発生する可能性があります。 新しいプロトコル バージョンでは、COPY FROM がループに入り、重複する行を返す可能性があります。 cqlsh コマンドに protocol-version を追加してください。

cqlsh <USERNAME>.cassandra.cosmos.azure.com 10350 -u <USERNAME> -p <PASSWORD> --ssl --protocol-version=4
CQL Copy コマンドに throughput-limiting オプションを追加する

cqlsh の COPY コマンドでは、Azure Cosmos DB へのドキュメントの取り込み速度を制御するさまざまなパラメーターがサポートされています。

COPY コマンドの既定の構成では、非常に速いペースでのデータの取り込みが試行され、CosmosDB のレート制限動作は考慮されません。 コレクションで構成されているスループットに応じて、CHUNKSIZE または INGESTRATE を削減する必要があります。

ドキュメントまたはレコードのサイズが 1 KB の場合、20,000 RU のコレクションには、(少なくとも) 以下の構成をお勧めします。

  • CHUNKSIZE = 100
  • INGESTRATE = 500
  • MAXATTEMPTS = 10
コマンドの例
  • Cassandra 用 API からローカル csv ファイルにデータをコピーする
COPY standard1 (key, "C0", "C1", "C2", "C3", "C4") TO 'backup.csv' WITH PAGESIZE=100 AND MAXREQUESTS=1 ;
  • ローカル csv ファイルから Cassandra 用 API にデータをコピーする
COPY standard2 (key, "C0", "C1", "C2", "C3", "C4") FROM 'backup.csv' WITH CHUNKSIZE=100 AND INGESTRATE=100 AND MAXATTEMPTS=10;

重要

オープンソース バージョンの Apache Cassandra の CQLSH COPY のみがサポートされています。 Datastax Enterprise (DSE) バージョンの CQLSH では、エラーが発生する可能性があります。

Spark を使用してデータを移行する

Spark を使用して Cassandra 用 API アカウントにデータを移行するには、次の手順を使用します。

  1. Azure Databricks クラスターまたは Azure HDInsight クラスターをプロビジョニングします。

  2. コピー先の Cassandra 用 API エンドポイントにデータを移動します。 Azure Databricks による移行については、こちらの攻略ガイドを参照してください。

Azure 仮想マシンまたは他のクラウド上の既存のクラスターにデータが存在する場合は、Spark ジョブを使用したデータの移行が推奨されるオプションです。 これを行うには、1 回限りまたは定期的なインジェストの中間段階として Spark を設定する必要があります。 オンプレミス環境と Azure の間で Azure ExpressRoute 接続を使用することで、この移行を加速できます。

ライブ マイグレーション

Apache Cassandra のネイティブ クラスターからダウンタイムなしで移行する必要がある場合は、デュアル書き込みと、履歴データを移行するための独立した一括データ読み込みを構成することをお勧めします。 オープンソースのデュアル書き込みプロキシを提供してアプリケーション コードの変更を最小限に抑えることで、このパターンの実装がいっそう簡単になっています。 このパターンの実装について詳しくは、デュアル書き込みプロキシと Apache Spark を使用したライブ マイグレーションの方法に関する記事をご覧ください。

リソースをクリーンアップする

必要がなくなったら、リソース グループ、Azure Cosmos DB アカウント、およびすべての関連リソースを削除できます。 これを行うには、仮想マシン用のリソース グループを選択し、 [削除] を選択した後、削除するリソース グループの名前を確認します。

次のステップ

このチュートリアルでは、Azure Cosmos DB の Cassandra 用 API アカウントにデータを移行する方法を説明しました。 次に、Azure Cosmos DB のその他の概念を学習します。