1. はじめに
Bigtable は、大規模な分析ワークロードや運用ワークロード用に設計された、フルマネージドで高性能な NoSQL データベース サービスです。Apache Cassandra などの既存のデータベースから Bigtable に移行するには、ダウンタイムとアプリケーションへの影響を最小限に抑えるために、慎重な計画が必要になることがよくあります。
この Codelab では、プロキシツールの組み合わせを使用して Cassandra から Bigtable への移行戦略を説明します。
- Cassandra-Bigtable プロキシ: クエリを変換することで、Cassandra クライアントとツール(
cqlshやドライバなど)が Cassandra クエリ言語(CQL)プロトコルを使用して Bigtable とやり取りできるようにします。 - Datastax Zero Downtime Migration(ZDM)プロキシ: アプリケーションとデータベース サービス(Cassandra-Bigtable プロキシ経由の移行元 Cassandra と移行先 Bigtable)の間に配置されるオープンソース プロキシ。デュアル書き込みをオーケストレートし、トラフィック ルーティングを管理することで、アプリケーションの変更とダウンタイムを最小限に抑えた移行を実現します。
 - Cassandra Data Migrator(CDM): ソース Cassandra クラスタからターゲット Bigtable インスタンスに過去のデータを一括で移行するために使用されるオープンソース ツール。
 
学習内容
- Compute Engine で基本的な Cassandra クラスタを設定する方法。
 - Bigtable インスタンスを作成する方法。
 - Cassandra-Bigtable プロキシをデプロイして構成し、Cassandra スキーマを Bigtable にマッピングする方法。
 - 二重書き込み用に Datastax ZDM Proxy をデプロイして構成する方法。
 - Cassandra Data Migrator ツールを使用して既存のデータを一括移行する方法。
 - プロキシベースの Cassandra から Bigtable への移行の全体的なワークフロー。
 
必要なもの
- 課金を有効にした Google Cloud プロジェクト。新規ユーザーは無料トライアルをご利用いただけます。
 - プロジェクト、Compute Engine、VPC ネットワーク、ファイアウォール ルールなどの Google Cloud のコンセプトに関する基本的な知識。Linux コマンドライン ツールに精通している。
 gcloudCLI がインストールされ、構成されているマシンにアクセスするか、Google Cloud Shell を使用します。
この Codelab では、ネットワーキングを簡素化するために、同じ VPC ネットワークとリージョン内の Compute Engine の仮想マシン(VM)を主に使用します。内部 IP アドレスを使用することをおすすめします。
2. 環境を設定する
1. Google Cloud プロジェクトを選択または作成する
Google Cloud コンソールに移動し、既存のプロジェクトを選択するか、新しいプロジェクトを作成します。プロジェクト ID をメモします。
2. リージョンとゾーンを選択する
リソースのリージョンとゾーンを選択します。ここでは、us-central1 と us-central1-c を例として使用します。便宜上、これらを環境変数として定義します。
export PROJECT_ID="<your-project-id>"
export REGION="us-central1"
export ZONE="us-central1-c"
gcloud config set project $PROJECT_ID
gcloud config set compute/region $REGION
gcloud config set compute/zone $ZONE
3. 必要な API の有効化
プロジェクトで Compute Engine API と Bigtable API が有効になっていることを確認します。
gcloud services enable compute.googleapis.com bigtable.googleapis.com bigtableadmin.googleapis.com
4. ファイアウォール ルールを構成する
デフォルトの VPC ネットワーク内の VM 間の通信を複数のポートで許可する必要があります。
- Cassandra/プロキシ CQL ポート: 9042
 - ZDM Proxy ヘルスチェック ポート: 14001
 - SSH: 22
 
これらのポートで内部トラフィックを許可するファイアウォール ルールを作成します。タグ cassandra-migration を使用して、このルールを関連する VM に簡単に適用します。
gcloud compute firewall-rules create allow-migration-internal \
--network=default \
--action=ALLOW \
--rules=tcp:22,tcp:9042,tcp:7000,tcp:14001 \
--source-ranges=10.0.0.0/8 \
--target-tags=cassandra-migration
3. Cassandra クラスタをデプロイする(Origin)
この Codelab では、Compute Engine にシンプルな単一ノードの Cassandra クラスタを設定します。実際のシナリオでは、既存のクラスタに接続します。
1. Cassandra 用の GCE VM を作成する
gcloud compute instances create cassandra-origin \
--machine-type=e2-medium \
--image-family=ubuntu-2204-lts \
--image-project=ubuntu-os-cloud \
--tags=cassandra-migration \
--boot-disk-size=20GB \
--scopes=cloud-platform \
--zone="$ZONE"
Cassandra インスタンスに SSH で接続する
gcloud compute ssh --zone="$ZONE" "cassandra-origin"
2. Cassandra をインストールする
# Install Java (Cassandra dependency)
sudo apt-get update
sudo apt-get install -y openjdk-11-jre-headless
# Add Cassandra repository
echo "deb https://debian.cassandra.apache.org 41x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add -
# Install Cassandra
sudo apt update
sudo apt install -y cassandra
# (Optional) Verify Cassandra is running
sudo systemctl status cassandra
3. Cassandra を構成する
プライベート ネットワーク内でアクセスできるように Cassandra を構成する必要があります。
次のコマンドを実行して、cassandra-origin のプライベート IP を取得します。
hostname -I
Cassandra 構成を編集します。新しい構成行を追加する必要はありません。既存の構成行を更新するだけです。
sudo vim /etc/cassandra/cassandra.yaml
seed_provider.parameters.seedsを"CASSANDRA_ORIGIN_PRIVATE_IP:7000"に設定するrpc_addressをCASSANDRA_ORIGIN_PRIVATE_IPに設定するlisten_addressをCASSANDRA_ORIGIN_PRIVATE_IPに設定する
ファイルを保存します。
最後に、Cassandra を再起動して構成の変更を読み込みます。
sudo systemctl restart cassandra
# (Optional) Verify Cassandra is running
sudo systemctl status cassandra
4. キースペースとテーブルを作成する
従業員テーブルの例を使用して、「zdmbigtable」というキースペースを作成します。
注: Cassandra が接続の受け入れを開始するまでに 1 分ほどかかることがあります。
# Start cqlsh
cqlsh $(hostname -I)
cqlsh 内:
-- Create keyspace (adjust replication for production)
CREATE KEYSPACE zdmbigtable WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};
-- Use the keyspace
USE zdmbigtable;
-- Create the employee table
CREATE TABLE employee (
    name text PRIMARY KEY,
    age bigint,
    code int,
    credited double,
    balance float,
    is_active boolean,
    birth_date timestamp
);
-- Exit cqlsh
EXIT;
SSH セッションを開いたままにするか、この VM の IP アドレス(hostname -I)をメモします。
4. Bigtable(ターゲット)を設定する
Duration 0:01
Bigtable インスタンスを作成します。インスタンス ID として zdmbigtable を使用します。
gcloud bigtable instances create zdmbigtable \
--display-name="ZDM Bigtable Target" \
--cluster="bigtable-c1" \
--cluster-zone="$ZONE" \
--cluster-num-nodes=1 # Use 1 node for dev/testing; scale as needed
Bigtable テーブル自体は、後で Cassandra-Bigtable Proxy の設定スクリプトによって作成されます。
5. Cassandra-Bigtable プロキシを設定する
1. Cassandra-Bigtable プロキシ用の Compute Engine VM を作成する
gcloud iam service-accounts create bigtable-proxy-sa \
    --description="Service account for Bigtable Proxy access" \
    --display-name="Bigtable Proxy Access SA"
export BIGTABLE_PROXY_SA_EMAIL=$(gcloud iam service-accounts list --filter="displayName='Bigtable Proxy Access SA'" --format="value(email)")
gcloud bigtable instances add-iam-policy-binding zdmbigtable \
  --member="serviceAccount:$BIGTABLE_PROXY_SA_EMAIL" \
  --role="roles/bigtable.admin"
gcloud compute instances create bigtable-proxy-vm \
--machine-type=e2-medium \
--image-family=ubuntu-2204-lts \
--image-project=ubuntu-os-cloud \
--tags=cassandra-migration \
--boot-disk-size=20GB \
--zone=$ZONE \
--scopes=cloud-platform \
--service-account="$BIGTABLE_PROXY_SA_EMAIL"
bigtable-proxy-vm に SSH 接続します。
gcloud compute ssh --zone="$ZONE" "bigtable-proxy-vm"
bigtable-proxy-vm で次のコマンドを実行します。
# Install Git and Go
sudo apt-get update
sudo apt-get install -y git
wget https://go.dev/dl/go1.23.6.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.23.6.linux-amd64.tar.gz
echo 'export GOPATH=$HOME/go' >> ~/.profile
echo 'export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin' >> ~/.profile
source ~/.profile
# Clone the proxy repository
git clone https://github.com/GoogleCloudPlatform/cloud-bigtable-ecosystem.git
cd cloud-bigtable-ecosystem/cassandra-bigtable-migration-tools/cassandra-bigtable-proxy/
2. Cassandra-Bigtable プロキシを起動する
プロキシ サーバーを起動します。
# At the root of the cassandra-to-bigtable-proxy directory
go run proxy.go --project-id="$(gcloud config get-value project)" --instance-id=zdmbigtable --keyspace-id=zdmbigtable --rpc-address=$(hostname -I)
プロキシが起動し、ポート 9042 で受信 CQL 接続をリッスンします。このターミナル セッションは実行したままにしておきます。この VM の IP アドレスをメモします(hostname -I)。
3. CQL を使用してテーブルを作成する
CQLSH を Cassandra-Bigtable プロキシ VM の IP アドレスに接続します。IP アドレスは、次のコマンドをローカルで実行して確認できます。
gcloud compute instances describe bigtable-proxy-vm --format='get(networkInterfaces[0].networkIP)'
別のウィンドウで cassandra-origin VM に SSH 接続し、cqlsh を使用して bigtable-proxy に接続します。Bigtable が基盤となるテーブルを作成するのに十分な時間を確保するため、リクエスト タイムアウトをデフォルトよりも長く設定しています。「Connected to cassandra-bigtable-proxy-v0.2.3」などのメッセージが表示されます。これは、ローカルの Cassandra サーバーではなく、Bigtable プロキシに接続したことを示しています。
# Replace <your-bigtable-proxy-vm-ip> with the ip from the above command
export BIGTABLE_PROXY_IP=<your-bigtable-proxy-vm-ip>
cqlsh --request-timeout=60 $BIGTABLE_PROXY_IP
-- Create the employee table
CREATE TABLE zdmbigtable.employee (
    name text PRIMARY KEY,
    age bigint,
    code int,
    credited double,
    balance float,
    is_active boolean,
    birth_date timestamp
);
CQLSH で、次のコマンドを実行してテーブルが作成されたことを確認します。
DESC TABLE zdmbigtable.employee;
6. ZDM Proxy を設定する
このラボでは ZDM プロキシの単一インスタンスを作成しますが、本番環境の移行ではマルチノード設定が必要になります。
1. ZDM Proxy VM を作成する
gcloud compute instances create zdm-proxy-vm \
--machine-type=e2-medium \
--image-family=ubuntu-2204-lts \
--image-project=ubuntu-os-cloud \
--tags=cassandra-migration \
--boot-disk-size=20GB \
--scopes=cloud-platform \
--zone=$ZONE
両方の VM の IP アドレスをメモします。
2. ZDM Proxy を準備する
gcloud compute ssh --zone="$ZONE" zdm-proxy-vm
export ZDM_VERSION="2.3.4"
wget "https://github.com/datastax/zdm-proxy/releases/download/v$ZDM_VERSION/zdm-proxy-linux-amd64-v$ZDM_VERSION.tgz"
tar -xvzf "zdm-proxy-linux-amd64-v$ZDM_VERSION.tgz"
# replace YOUR_ZONE
gcloud config set compute/zone "YOUR_ZONE"
export ZDM_ORIGIN_CONTACT_POINTS=$(gcloud compute instances describe cassandra-origin --format='get(networkInterfaces[0].networkIP)') 
export ZDM_TARGET_CONTACT_POINTS=$(gcloud compute instances describe bigtable-proxy-vm --format='get(networkInterfaces[0].networkIP)')
export ZDM_ORIGIN_USERNAME=""
export ZDM_ORIGIN_PASSWORD=""
export ZDM_TARGET_USERNAME=""
export ZDM_TARGET_PASSWORD=""
export ZDM_PROXY_LISTEN_ADDRESS=0.0.0.0
export ZDM_PROXY_LISTEN_PORT=9042
./zdm-proxy-v${ZDM_VERSION}
7. アプリケーションを構成して二重書き込みを開始する
Duration 0:05
実際の移行のこの段階では、ZDM Proxy VM の IP アドレス(:9042)に接続します。
アプリケーションが ZDM プロキシに接続すると、デフォルトで移行元(Cassandra)から読み取りが提供されます。書き込みは、Origin(Cassandra)と Target(Cassandra-Bigtable プロキシ経由の Bigtable)の両方に送信されます。これにより、アプリケーションは正常に機能し続け、新しいデータが両方のデータベースに同時に書き込まれます。ZDM Proxy を指す cqlsh を使用して接続をテストできます。
cqlsh $(gcloud compute instances describe zdm-proxy-vm --format='get(networkInterfaces[0].networkIP)')
データを挿入してみます。
INSERT INTO zdmbigtable.employee (name, age, is_active) VALUES ('Alice', 30, true); 
INSERT INTO zdmbigtable.employee (name, age, is_active) VALUES ('Anna', 45, true); 
INSERT INTO zdmbigtable.employee (name, age, is_active) VALUES ('Albert', 50, false); 
SELECT * FROM zdmbigtable.employee;
このデータは、Cassandra と Bigtable の両方に書き込む必要があります。これは、Google Cloud コンソールに移動して、インスタンスの Bigtable Query Editor を開くことで、Bigtable で確認できます。「SELECT * FROM employee」クエリを実行すると、最近挿入されたデータが表示されます。
8. Cassandra Data Migrator を使用して履歴データを移行する
新しいデータに対してデュアル書き込みが有効になったら、Cassandra Data Migrator(CDM)ツールを使用して、既存の履歴データを Cassandra から Bigtable にコピーします。
1. CDM 用の Compute Engine VM を作成する
この VM には、Spark に十分なメモリが必要です。
gcloud compute instances create cdm-migrator-vm \
--machine-type=e2-medium \
--image-family=ubuntu-2204-lts \
--image-project=ubuntu-os-cloud \
--tags=cassandra-migration \
--boot-disk-size=40GB \
--scopes=cloud-platform \
--zone=$ZONE
2. 前提条件(Java 11、Spark)をインストールする
cdm-migrator-vm に SSH 接続します。
gcloud compute ssh cdm-migrator-vm
VM 内:
# Install Java 11 
sudo apt-get update 
sudo apt-get install -y openjdk-11-jdk
 
# Verify Java installation 
java -version 
# Download and Extract Spark (Using version 3.5.3 as requested) 
# Check the Apache Spark archives for the correct URL if needed
wget  https://archive.apache.org/dist/spark/spark-3.5.3/spark-3.5.3-bin-hadoop3-scala2.13.tgz
tar -xvzf spark-3.5.3-bin-hadoop3-scala2.13.tgz
echo 'export SPARK_HOME=$PWD/spark-3.5.3-bin-hadoop3-scala2.13' >> ~/.profile
echo 'export PATH=$PATH:$SPARK_HOME/bin' >> ~/.profile
source ~/.profile
3. Cassandra Data Migrator をダウンロードする
ブラウザで CDM パッケージのページを開き、[アセット] パネルから .jar リンクをコピーします。5.4.0 が利用できない場合は、それに近いバージョンを選択します。リンクを次のコマンドに貼り付け、cdm-migrator-vm インスタンスで実行します。URL の周りの単一引用符はそのままにします。
wget 'JAR_URL_GOES_HERE' -O cassandra-data-migrator.jar
jar ツールでスキャンして、jar ファイルが正しくダウンロードされたことを確認します。長い「.class」ファイルのリストが表示されます。
jar tf cassandra-data-migrator.jar 
4. データを追加する
cassandra-origin(zdm-proxy-vm ではない)に直接書き込んで、移行するデータを追加する必要があります。
INSERT INTO zdmbigtable.employee (name, age, is_active) VALUES ('Alfred', 67, true); 
INSERT INTO zdmbigtable.employee (name, age, is_active) VALUES ('Bobby', 12, false); 
INSERT INTO zdmbigtable.employee (name, age, is_active) VALUES ('Carol', 29, true); 
5. 移行ジョブを実行する
spark-submit を使用して移行を実行します。このコマンドは、プロパティ ファイルを使用して CDM jar を実行し、移行するキースペースとテーブルを指定するように Spark に指示します。VM のサイズとデータ量に基づいて、メモリ設定(–driver-memory、–executor-memory)を調整します。
CDM の jar ファイルとプロパティ ファイルを含むディレクトリに移動します。
ヒント: ローカルマシンから次のコマンドを実行すると、Cassandra VM とプロキシ VM の内部 IP を取得できます。
gcloud compute instances describe cassandra-origin --format='get(networkInterfaces[0].networkIP)'
gcloud compute instances describe bigtable-proxy-vm --format='get(networkInterfaces[0].networkIP)'
export ORIGIN_HOST="<your-cassandra-origin-ip>"
export TARGET_HOST="<your-bigtable-proxy-vm-ip>"
export KEYSPACE_TABLE="zdmbigtable.employee"
spark-submit --verbose --master "local[*]" \
--driver-memory 3G --executor-memory 3G \
--conf spark.cdm.schema.origin.keyspaceTable="$KEYSPACE_TABLE" \
--conf spark.cdm.connect.origin.host="$ORIGIN_HOST" \
--conf spark.cdm.connect.origin.port=9042 \
--conf spark.cdm.connect.target.host="$TARGET_HOST" \
--conf spark.cdm.connect.target.port=9042 \
--conf spark.cdm.feature.origin.ttl.automatic=false \
--conf spark.cdm.feature.origin.writetime.automatic=false \
--conf spark.cdm.feature.target.ttl.automatic=false \
--conf spark.cdm.feature.target.writetime.automatic=false \
--conf spark.cdm.schema.origin.column.ttl.automatic=false \
--conf spark.cdm.schema.ttlwritetime.calc.useCollections=false \
--class com.datastax.cdm.job.Migrate cassandra-data-migrator.jar
6. データ移行を確認する
CDM ジョブが正常に完了したら、Bigtable に履歴データが存在することを確認します。
cqlsh <bigtable-proxy-vm-ip>
cqlsh 内:
SELECT COUNT(*) FROM zdmbigtable.employee; -- Check row count matches origin 
SELECT * FROM zdmbigtable.employee LIMIT 10; -- Check some sample data
9. カットオーバー(コンセプト)
Cassandra と Bigtable 間のデータ整合性を十分に検証したら、最終的なカットオーバーに進むことができます。
ZDM プロキシを使用する場合、カットオーバーでは、主にオリジン(Cassandra)ではなくターゲット(Bigtable)から読み取るように再構成します。通常、これは ZDM Proxy の構成を介して行われ、アプリケーションの読み取りトラフィックが Bigtable に効果的に移行されます。
Bigtable がすべてのトラフィックを正しく処理していることを確認したら、最終的に次の操作を行うことができます。
- ZDM Proxy を再構成して、二重書き込みを停止します。
 - 元の Cassandra クラスタを廃止します。
 - ZDM Proxy を削除し、アプリケーションが Cassandra-Bigtable Proxy に直接接続するか、ネイティブの Bigtable CQL Client for Java を使用するようにします。
 
カットオーバーのための ZDM Proxy の再構成の詳細は、この基本的な Coelab の範囲外ですが、Datastax ZDM のドキュメントに詳しく説明されています。
10. クリーンアップ
課金されないようにするには、この Codelab で作成したリソースを削除します。
1. Compute Engine VM を削除する
gcloud compute instances delete cassandra-origin zdm-proxy-vm bigtable-proxy-vm cdm-migrator-vm --zone=$ZONE --quiet
2. Bigtable インスタンスを削除する
gcloud bigtable instances delete zdmbigtable
3. ファイアウォール ルールを削除する
gcloud compute firewall-rules delete allow-migration-internal
4. Cassandra データベースを削除する(ローカルにインストールされている場合、または永続化されている場合)
ここで作成した Compute Engine VM の外部に Cassandra をインストールした場合は、適切な手順に沿ってデータを削除するか、Cassandra をアンインストールします。
11. 完了
Apache Cassandra から Bigtable へのプロキシベースの移行パスの設定プロセスが完了しました。
具体的には、以下の方法について学習しました。
Cassandra と Bigtable をデプロイします。
- CQL 互換性用に Cassandra-Bigtable プロキシを構成します。
 - Datastax ZDM Proxy をデプロイして、二重書き込みとトラフィックを管理します。
 - Cassandra Data Migrator を使用して、過去のデータを移行します。
 
このアプローチでは、プロキシレイヤを活用することで、ダウンタイムを最小限に抑え、コードを変更することなく移行できます。
次のステップ
- Bigtable のドキュメントを確認する
 - 詳細な構成と切り替え手順については、Datastax ZDM Proxy のドキュメントをご覧ください。
 - 詳細については、Cassandra-Bigtable Proxy リポジトリをご覧ください。
 - 高度な使用方法については、Cassandra Data Migrator リポジトリを確認してください。
 - 他の Google Cloud Codelab を試す