Migrasi dari Cassandra ke Bigtable dengan Proxy Dual-Write

1. Pengantar

Bigtable adalah layanan database NoSQL berperforma tinggi yang terkelola sepenuhnya dan dirancang untuk workload analisis dan operasional yang besar. Migrasi dari database yang ada seperti Apache Cassandra ke Bigtable sering kali memerlukan perencanaan yang cermat untuk meminimalkan periode nonaktif dan dampak aplikasi.

Codelab ini menunjukkan strategi migrasi dari Cassandra ke Bigtable menggunakan kombinasi alat proxy:

  1. Proxy Cassandra-Bigtable: Memungkinkan klien dan alat Cassandra (seperti cqlsh atau driver) berinteraksi dengan Bigtable menggunakan protokol Cassandra Query Language (CQL) dengan menerjemahkan kueri.
  2. Proxy Migrasi Tanpa Periode Nonaktif (ZDM) Datastax: Proxy open source yang berada di antara aplikasi dan layanan database Anda (Cassandra asal dan Bigtable target melalui Proxy Cassandra-Bigtable). Layanan ini mengatur penulisan ganda dan mengelola perutean traffic, sehingga memungkinkan migrasi dengan perubahan dan waktu non-operasional aplikasi yang minimal.
  3. Cassandra Data Migrator (CDM): Alat open source yang digunakan untuk memigrasikan data historis secara massal dari cluster Cassandra sumber ke instance Bigtable target.

Yang akan Anda pelajari

  • Cara menyiapkan cluster Cassandra dasar di Compute Engine.
  • Cara membuat instance Bigtable.
  • Cara men-deploy dan mengonfigurasi Proxy Cassandra-Bigtable untuk memetakan skema Cassandra ke Bigtable.
  • Cara men-deploy dan mengonfigurasi Proxy ZDM Datastax untuk penulisan ganda.
  • Cara menggunakan alat Cassandra Data Migrator untuk memigrasikan data yang ada secara massal.
  • Alur kerja keseluruhan untuk migrasi Cassandra ke Bigtable berbasis proxy.

Yang Anda butuhkan

  • Project Google Cloud yang mengaktifkan penagihan. Pengguna baru memenuhi syarat untuk mendapatkan uji coba gratis.
  • Pemahaman dasar tentang konsep Google Cloud seperti project, Compute Engine, jaringan VPC, dan aturan firewall. Pemahaman dasar tentang alat command line Linux.
  • Akses ke mesin dengan CLI gcloud yang diinstal dan dikonfigurasi, atau gunakan Google Cloud Shell.

Untuk codelab ini, kita akan menggunakan virtual machine (VM) di Compute Engine dalam jaringan dan region VPC yang sama untuk menyederhanakan jaringan. Sebaiknya gunakan alamat IP internal.

2. Menyiapkan lingkungan Anda

1. Pilih atau buat Project Google Cloud

Buka Konsol Google Cloud, lalu pilih project yang sudah ada atau buat project baru. Catat Project ID Anda.

2. Pilih region dan zona

Pilih region dan zona untuk resource Anda. Kita akan menggunakan us-central1 dan us-central1-c sebagai contoh. Tentukan ini sebagai variabel lingkungan untuk mempermudah:

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. Mengaktifkan API yang diperlukan

Pastikan Compute Engine API dan Bigtable API diaktifkan untuk project Anda.

gcloud services enable compute.googleapis.com bigtable.googleapis.com bigtableadmin.googleapis.com

4. Mengonfigurasi aturan firewall

Kita perlu mengizinkan komunikasi antar-VM dalam jaringan VPC default di beberapa port:

  • Port CQL Cassandra/Proxy: 9042
  • Port Health Check Proxy ZDM: 14001
  • SSH: 22

Buat aturan firewall untuk mengizinkan traffic internal di port ini. Kita akan menggunakan tag cassandra-migration untuk menerapkan aturan ini dengan mudah ke VM yang relevan.

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. Men-deploy cluster Cassandra (Origin)

Untuk codelab ini, kita akan menyiapkan cluster Cassandra satu node sederhana di Compute Engine. Dalam skenario dunia nyata, Anda akan terhubung ke cluster yang ada.

1. Buat VM GCE untuk Cassandra

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"

SSH ke instance Cassandra Anda

gcloud compute ssh --zone="$ZONE" "cassandra-origin"

2. Instal 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. Mengonfigurasi Cassandra

Kita perlu mengonfigurasi Cassandra agar dapat diakses dalam jaringan pribadi.

Dapatkan IP pribadi cassandra-origin dengan menjalankan:

hostname -I

Edit konfigurasi Cassandra, Anda tidak perlu menambahkan baris konfigurasi baru - cukup perbarui baris yang sudah ada:

sudo vim /etc/cassandra/cassandra.yaml
  1. Tetapkan seed_provider.parameters.seeds ke "CASSANDRA_ORIGIN_PRIVATE_IP:7000"
  2. Tetapkan rpc_address ke CASSANDRA_ORIGIN_PRIVATE_IP
  3. Tetapkan listen_address ke CASSANDRA_ORIGIN_PRIVATE_IP

Simpan file.

Terakhir, mulai ulang Cassandra untuk memuat perubahan konfigurasi:

sudo systemctl restart cassandra

# (Optional) Verify Cassandra is running
sudo systemctl status cassandra

4. Membuat keyspace dan tabel

Kita akan menggunakan contoh tabel karyawan dan membuat keyspace bernama "zdmbigtable".

Catatan: Cassandra mungkin memerlukan waktu satu menit untuk mulai menerima koneksi.

# Start cqlsh
cqlsh $(hostname -I)

Di dalam 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;

Biarkan sesi SSH terbuka atau catat alamat IP VM ini (hostname -I).

4. Menyiapkan Bigtable (Target)

Durasi 0:01

Buat instance Bigtable. Kita akan menggunakan zdmbigtable sebagai ID instance.

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

Tabel Bigtable itu sendiri akan dibuat nanti oleh skrip penyiapan Cassandra-Bigtable Proxy.

5. Menyiapkan Cassandra-Bigtable Proxy

1. Membuat VM Compute Engine untuk Proxy Cassandra-Bigtable

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"

Gunakan SSH untuk terhubung ke bigtable-proxy-vm:

gcloud compute ssh --zone="$ZONE" "bigtable-proxy-vm"

Di bigtable-proxy-vm, jalankan:

# 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. Mulai Proxy Cassandra-Bigtable

Mulai server proxy.

# 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)

Proxy akan dimulai dan memproses koneksi CQL yang masuk di port 9042. Biarkan sesi terminal ini tetap berjalan. Catat alamat IP VM ini (hostname -I)

3. Membuat Tabel melalui CQL

Hubungkan CQLSH ke alamat IP VM Proxy Cassandra-Bigtable. Anda dapat menemukan alamat IP dengan menjalankan perintah berikut secara lokal:

gcloud compute instances describe bigtable-proxy-vm --format='get(networkInterfaces[0].networkIP)'

Di jendela terpisah, SSH ke VM cassandra-origin dan gunakan cqlsh ke bigtable-proxy. Perhatikan bahwa kami menetapkan waktu tunggu permintaan yang lebih lama dari default untuk memastikan Bigtable memiliki cukup waktu untuk membuat tabel pokok. Anda akan melihat "Connected to cassandra-bigtable-proxy-v0.2.3" atau yang serupa, yang menunjukkan bahwa Anda telah terhubung ke proxy bigtable, dan bukan server cassandra lokal.

# 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
);

Di CQLSH, pastikan tabel Anda telah dibuat dengan menjalankan:

DESC TABLE zdmbigtable.employee;

6. Menyiapkan Proxy ZDM

Kita akan membuat satu instance ZDM Proxy untuk lab ini, tetapi Anda akan memerlukan penyiapan multi-node untuk migrasi produksi.

1. Membuat VM Proxy ZDM

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

Catat alamat IP kedua VM.

2. Menyiapkan Proxy ZDM

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. Mengonfigurasi aplikasi & memulai penulisan ganda

Durasi 0:05

Pada tahap ini dalam migrasi sebenarnya, Anda akan mengonfigurasi ulang aplikasi untuk mengarah ke alamat IP VM Proxy ZDM (misalnya, :9042) daripada terhubung langsung ke Cassandra.

Setelah aplikasi terhubung ke Proxy ZDM: Pembacaan ditayangkan dari Origin (Cassandra) secara default. Penulisan dikirim ke Origin (Cassandra) dan Target (Bigtable, melalui Proxy Cassandra-Bigtable). Hal ini memungkinkan aplikasi Anda terus berfungsi secara normal sekaligus memastikan data baru ditulis ke kedua database secara bersamaan. Anda dapat menguji koneksi menggunakan cqlsh yang mengarah ke Proxy ZDM:

cqlsh $(gcloud compute instances describe zdm-proxy-vm --format='get(networkInterfaces[0].networkIP)')

Coba masukkan beberapa data:

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;

Data ini harus ditulis ke Cassandra dan Bigtable. Anda dapat mengonfirmasi hal ini di Bigtable, dengan membuka Konsol Google Cloud dan membuka Editor Kueri Bigtable untuk instance Anda. Jalankan kueri "SELECT * FROM employee", dan data yang baru saja dimasukkan akan terlihat.

8. Memigrasikan data historis menggunakan Cassandra Data Migrator

Setelah penulisan ganda aktif untuk data baru, gunakan alat Cassandra Data Migrator (CDM) untuk menyalin data historis yang ada dari Cassandra ke Bigtable.

1. Membuat VM Compute Engine untuk CDM

VM ini memerlukan memori yang cukup untuk 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. Instal prasyarat (Java 11, Spark)

Gunakan SSH untuk mengakses cdm-migrator-vm:

gcloud compute ssh cdm-migrator-vm

Di dalam 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. Mendownload Cassandra Data Migrator

Di browser, buka halaman Paket CDM dan salin link .jar dari panel Aset. Jika 5.4.0 tidak tersedia, pilih versi terdekat berikutnya. Tempelkan link ke dalam perintah di bawah, lalu jalankan di instance cdm-migrator-vm Anda, dengan tetap mempertahankan tanda petik tunggal di sekitar URL.

wget 'JAR_URL_GOES_HERE' -O cassandra-data-migrator.jar

Verifikasi bahwa file jar telah didownload dengan benar dengan memindainya menggunakan alat jar: Anda akan melihat daftar panjang file ".class".

jar tf cassandra-data-migrator.jar 

4. Tambahkan beberapa data

Kita perlu menambahkan beberapa data untuk dimigrasikan dengan menulis langsung ke cassandra-origin (bukan 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. Menjalankan tugas migrasi

Jalankan migrasi menggunakan spark-submit. Perintah ini memberi tahu Spark untuk menjalankan jar CDM, menggunakan file properti Anda dan menentukan keyspace serta tabel yang akan dimigrasikan. Sesuaikan setelan memori (–driver-memory, –executor-memory) berdasarkan ukuran VM dan volume data Anda.

Pastikan Anda berada di direktori yang berisi file jar dan properti CDM.

Tips: Anda bisa mendapatkan IP internal VM Cassandra dan proxy dengan menjalankan perintah ini dari mesin lokal Anda:

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. Memverifikasi migrasi data

Setelah tugas CDM berhasil diselesaikan, pastikan data historis ada di Bigtable.

cqlsh <bigtable-proxy-vm-ip>

Di dalam cqlsh:

SELECT COUNT(*) FROM zdmbigtable.employee; -- Check row count matches origin 
SELECT * FROM zdmbigtable.employee LIMIT 10; -- Check some sample data

9. Migrasi sistem (konseptual)

Setelah memverifikasi konsistensi data secara menyeluruh antara Cassandra dan Bigtable, Anda dapat melanjutkan dengan migrasi sistem akhir.

Dengan Proxy ZDM, peralihan melibatkan konfigurasi ulang untuk terutama membaca dari target (Bigtable) dan bukan dari Origin (Cassandra). Hal ini biasanya dilakukan melalui konfigurasi ZDM Proxy, yang secara efektif mengalihkan traffic baca aplikasi Anda ke Bigtable.

Setelah Anda yakin bahwa Bigtable melayani semua traffic dengan benar, Anda dapat:

  • Hentikan penulisan ganda dengan mengonfigurasi ulang Proxy ZDM.
  • Nonaktifkan cluster Cassandra asli.
  • Hapus Proxy ZDM dan minta aplikasi terhubung langsung ke Proxy Cassandra-Bigtable atau gunakan Klien CQL Bigtable Native untuk Java.

Spesifikasi konfigurasi ulang Proxy ZDM untuk pengalihan berada di luar codelab dasar ini, tetapi dijelaskan secara mendetail dalam dokumentasi ZDM Datastax.

10. Pembersihan

Untuk menghindari timbulnya biaya, hapus resource yang dibuat selama codelab ini.

1. Menghapus VM Compute Engine

gcloud compute instances delete cassandra-origin zdm-proxy-vm bigtable-proxy-vm cdm-migrator-vm --zone=$ZONE --quiet

2. Menghapus instance Bigtable

gcloud bigtable instances delete zdmbigtable

3. Menghapus aturan Firewall

gcloud compute firewall-rules delete allow-migration-internal

4. Hapus database Cassandra (jika diinstal secara lokal atau dipertahankan)

Jika Anda menginstal Cassandra di luar VM Compute Engine yang dibuat di sini, ikuti langkah-langkah yang sesuai untuk menghapus data atau meng-uninstal Cassandra.

11. Selamat!

Anda telah berhasil mempelajari proses penyiapan jalur migrasi berbasis proxy dari Apache Cassandra ke Bigtable.

Anda telah mempelajari cara:

Deploy Cassandra dan Bigtable.

  • Konfigurasi Cassandra-Bigtable Proxy untuk kompatibilitas CQL.
  • Deploy Proxy ZDM Datastax untuk mengelola penulisan ganda dan traffic.
  • Gunakan Cassandra Data Migrator untuk memindahkan data historis.

Pendekatan ini memungkinkan migrasi dengan waktu istirahat minimal dan tanpa perubahan kode dengan memanfaatkan lapisan proxy.

Langkah berikutnya

  • Mempelajari Dokumentasi Bigtable
  • Lihat dokumentasi Datastax ZDM Proxy untuk konfigurasi lanjutan dan prosedur pengalihan.
  • Tinjau repositori Cassandra-Bigtable Proxy untuk mengetahui detail selengkapnya.
  • Periksa repositori Cassandra Data Migrator untuk penggunaan lanjutan.
  • Coba Codelab Google Cloud lainnya