1. Introduction
Bigtable est un service de base de données NoSQL entièrement géré et hautes performances, conçu pour les charges de travail analytiques et opérationnelles volumineuses. La migration depuis des bases de données existantes comme Apache Cassandra vers Bigtable nécessite souvent une planification minutieuse pour minimiser les temps d'arrêt et l'impact sur les applications.
Cet atelier de programmation présente une stratégie de migration de Cassandra vers Bigtable à l'aide d'une combinaison d'outils proxy :
- Proxy Cassandra-Bigtable : permet aux clients et outils Cassandra (comme
cqlshou les pilotes) d'interagir avec Bigtable à l'aide du protocole Cassandra Query Language (CQL) en traduisant les requêtes. - Proxy Datastax Zero Downtime Migration (ZDM) : proxy Open Source qui se situe entre votre application et vos services de base de données (Cassandra d'origine et Bigtable cible via le proxy Cassandra-Bigtable). Il orchestre les doubles écritures et gère le routage du trafic, ce qui permet la migration avec un minimum de modifications et de temps d'arrêt de l'application.
- Cassandra Data Migrator (CDM) : outil Open Source utilisé pour migrer en masse les données historiques du cluster Cassandra source vers l'instance Bigtable cible.
Points abordés
- Configurer un cluster Cassandra de base sur Compute Engine
- Découvrez comment créer une instance Bigtable.
- Découvrez comment déployer et configurer le proxy Cassandra-Bigtable pour mapper un schéma Cassandra à Bigtable.
- Découvrez comment déployer et configurer le proxy ZDM Datastax pour les doubles écritures.
- Découvrez comment utiliser l'outil Cassandra Data Migrator pour migrer des données existantes de manière groupée.
- Workflow global pour une migration de Cassandra vers Bigtable basée sur un proxy.
Prérequis
- Un projet Google Cloud avec facturation activée. Les nouveaux utilisateurs peuvent bénéficier d'un essai sans frais.
- Connaissances de base des concepts Google Cloud tels que les projets, Compute Engine, les réseaux VPC et les règles de pare-feu Connaissance de base des outils de ligne de commande Linux
- Accès à une machine sur laquelle la CLI
gcloudest installée et configurée, ou utilisation de Google Cloud Shell.
Pour cet atelier de programmation, nous utiliserons principalement des machines virtuelles (VM) sur Compute Engine au sein du même réseau VPC et de la même région afin de simplifier la mise en réseau. Il est recommandé d'utiliser des adresses IP internes.
2. Configurer votre environnement
1. Sélectionner ou créer un projet Google Cloud
Accédez à la console Google Cloud, puis sélectionnez un projet existant ou créez-en un. Notez l'ID de votre projet.
2. Choisir une région et une zone
Sélectionnez une région et une zone pour vos ressources. Nous utiliserons us-central1 et us-central1-c comme exemples. Pour plus de commodité, définissez ces éléments comme variables d'environnement :
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. Activer les API requises
Assurez-vous que les API Compute Engine et Bigtable sont activées pour votre projet.
gcloud services enable compute.googleapis.com bigtable.googleapis.com bigtableadmin.googleapis.com
4. Configurer des règles de pare-feu
Nous devons autoriser la communication entre nos VM au sein du réseau VPC par défaut sur plusieurs ports :
- Port CQL Cassandra/Proxies : 9042
- Port de vérification de l'état du proxy ZDM : 14001
- SSH : 22
Créez une règle de pare-feu pour autoriser le trafic interne sur ces ports. Nous utiliserons le tag cassandra-migration pour appliquer facilement cette règle aux VM concernées.
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. Déployer un cluster Cassandra (Origin)
Pour cet atelier de programmation, nous allons configurer un simple cluster Cassandra à nœud unique sur Compute Engine. Dans un scénario réel, vous vous connecteriez à votre cluster existant.
1. Créer une VM GCE pour 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"
Se connecter en SSH à votre instance Cassandra
gcloud compute ssh --zone="$ZONE" "cassandra-origin"
2. Installer 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. Configurer Cassandra
Nous devons configurer Cassandra pour qu'il soit accessible au sein du réseau privé.
Récupérez l'adresse IP privée de cassandra-origin en exécutant la commande suivante :
hostname -I
Modifiez la configuration de Cassandra. Vous ne devriez pas avoir à ajouter de nouvelles lignes de configuration. Il vous suffit de mettre à jour celles qui existent déjà :
sudo vim /etc/cassandra/cassandra.yaml
- Définissez
seed_provider.parameters.seedssur"CASSANDRA_ORIGIN_PRIVATE_IP:7000" - Définissez
rpc_addresssurCASSANDRA_ORIGIN_PRIVATE_IP - Définissez
listen_addresssurCASSANDRA_ORIGIN_PRIVATE_IP
Enregistrez le fichier.
Enfin, redémarrez Cassandra pour charger les modifications de configuration :
sudo systemctl restart cassandra
# (Optional) Verify Cassandra is running
sudo systemctl status cassandra
4. Créer un espace de clés et une table
Nous allons utiliser un exemple de tableau d'employés et créer un espace de clés appelé "zdmbigtable".
Remarque : Cassandra peut mettre une minute à accepter les connexions.
# Start cqlsh
cqlsh $(hostname -I)
Dans 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;
Laissez la session SSH ouverte ou notez l'adresse IP de cette VM (hostname -I).
4. Configurer Bigtable (cible)
Durée : 0:01
Créer une instance Bigtable Nous utiliserons zdmbigtable comme ID d'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
La table Bigtable elle-même sera créée ultérieurement par le script de configuration du proxy Cassandra-Bigtable.
5. Configurer le proxy Cassandra-Bigtable
1. Créer une VM Compute Engine pour le 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"
Connectez-vous en SSH à bigtable-proxy-vm :
gcloud compute ssh --zone="$ZONE" "bigtable-proxy-vm"
Sur la VM bigtable-proxy-vm, exécutez la commande suivante :
# 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. Démarrer le proxy Cassandra-Bigtable
Démarrez le serveur 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)
Le proxy démarre et écoute les connexions CQL entrantes sur le port 9042. Laissez cette session de terminal s'exécuter. Notez l'adresse IP de cette VM (hostname -I).
3. Créer une table avec CQL
Connectez CQLSH à l'adresse IP de la VM proxy Cassandra-Bigtable. Vous pouvez trouver l'adresse IP en exécutant la commande suivante en local :
gcloud compute instances describe bigtable-proxy-vm --format='get(networkInterfaces[0].networkIP)'
Dans une fenêtre distincte, connectez-vous en SSH à votre VM cassandra-origin et utilisez cqlsh pour le bigtable-proxy. Notez que nous avons défini un délai avant expiration de la requête plus long que celui par défaut pour nous assurer que Bigtable dispose de suffisamment de temps pour créer la table sous-jacente. Le message "Connected to cassandra-bigtable-proxy-v0.2.3" (Connecté à cassandra-bigtable-proxy-v0.2.3) ou un message semblable doit s'afficher. Il indique que vous vous êtes connecté au proxy Bigtable, et non au serveur Cassandra local.
# 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
);
Dans CQLSH, vérifiez que votre table a été créée en exécutant la commande suivante :
DESC TABLE zdmbigtable.employee;
6. Configurer le proxy ZDM
Pour cet atelier, nous allons créer une seule instance du proxy ZDM, mais vous aurez besoin d'une configuration à plusieurs nœuds pour une migration en production.
1. Créer la 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
Notez les adresses IP des deux VM.
2. Préparer le 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. Configurer l'application et démarrer la double écriture
Durée : 0:05
À ce stade d'une véritable migration, vous reconfigurerez vos applications pour qu'elles pointent vers l'adresse IP de la VM du proxy ZDM (par exemple, :9042) au lieu de se connecter directement à Cassandra.
Une fois l'application connectée au proxy ZDM : les lectures sont effectuées à partir de l'origine (Cassandra) par défaut. Les écritures sont envoyées à la fois à l'origine (Cassandra) et à la cible (Bigtable, via le proxy Cassandra-Bigtable). Cela permet à votre application de continuer à fonctionner normalement tout en veillant à ce que les nouvelles données soient écrites simultanément dans les deux bases de données. Vous pouvez tester la connexion à l'aide de cqlsh pointant vers le proxy ZDM :
cqlsh $(gcloud compute instances describe zdm-proxy-vm --format='get(networkInterfaces[0].networkIP)')
Essayez d'insérer des données :
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;
Ces données doivent être écrites à la fois dans Cassandra et dans Bigtable. Vous pouvez le vérifier dans Bigtable en accédant à la console Google Cloud et en ouvrant l'éditeur de requête Bigtable pour votre instance. Exécutez une requête "SELECT * FROM employee". Les données récemment insérées devraient être visibles.
8. Migrer les données historiques à l'aide de Cassandra Data Migrator
Maintenant que la double écriture est active pour les nouvelles données, utilisez l'outil Cassandra Data Migrator (CDM) pour copier les données historiques existantes de Cassandra vers Bigtable.
1. Créer une VM Compute Engine pour le CDM
Cette VM a besoin de suffisamment de mémoire pour 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. Installer les prérequis (Java 11, Spark)
Connectez-vous en SSH à cdm-migrator-vm :
gcloud compute ssh cdm-migrator-vm
Dans la 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. Télécharger Cassandra Data Migrator
Dans votre navigateur, ouvrez la page des packages CDM et copiez le lien .jar depuis le panneau "Assets" (Éléments). Si la version 5.4.0 n'est pas disponible, choisissez la version la plus proche. Collez le lien dans la commande ci-dessous et exécutez-le sur votre instance cdm-migrator-vm, en conservant les guillemets autour de l'URL.
wget 'JAR_URL_GOES_HERE' -O cassandra-data-migrator.jar
Vérifiez que le fichier jar a été téléchargé correctement en l'analysant avec l'outil jar. Une longue liste de fichiers ".class" devrait s'afficher.
jar tf cassandra-data-migrator.jar
4. Ajouter des données
Nous devons ajouter des données à migrer en écrivant directement dans cassandra-origin (et non dans 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. Exécuter le job de migration
Exécutez la migration à l'aide de spark-submit. Cette commande indique à Spark d'exécuter le fichier JAR CDM, en utilisant votre fichier de propriétés et en spécifiant l'espace de clés et la table à migrer. Ajustez les paramètres de mémoire (–driver-memory, –executor-memory) en fonction de la taille de votre VM et du volume de données.
Assurez-vous de vous trouver dans le répertoire contenant le fichier jar et le fichier de propriétés CDM.
Conseil : Vous pouvez obtenir l'adresse IP interne de vos VM Cassandra et de proxy en exécutant les commandes suivantes à partir de votre machine locale :
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. Vérifier la migration des données
Une fois le job CDM terminé, vérifiez que les données historiques existent dans Bigtable.
cqlsh <bigtable-proxy-vm-ip>
Dans cqlsh :
SELECT COUNT(*) FROM zdmbigtable.employee; -- Check row count matches origin
SELECT * FROM zdmbigtable.employee LIMIT 10; -- Check some sample data
9. Bascule (conceptuelle)
Après avoir vérifié minutieusement la cohérence des données entre Cassandra et Bigtable, vous pouvez procéder au basculement final.
Avec le proxy ZDM, la transition consiste à le reconfigurer pour qu'il lise principalement à partir de la cible (Bigtable) au lieu de l'origine (Cassandra). Cela se fait généralement via la configuration du proxy ZDM, ce qui permet de transférer efficacement le trafic de lecture de votre application vers Bigtable.
Une fois que vous êtes sûr que Bigtable diffuse correctement tout le trafic, vous pouvez éventuellement :
- Arrêtez les doubles écritures en reconfigurant le proxy ZDM.
- Mettez hors service le cluster Cassandra d'origine.
- Supprimez le proxy ZDM et connectez l'application directement au proxy Cassandra-Bigtable ou utilisez le client CQL Bigtable natif pour Java.
Les spécificités de la reconfiguration du proxy ZDM pour la transition ne sont pas abordées dans cet atelier de programmation de base, mais sont détaillées dans la documentation Datastax ZDM.
10. Effectuer un nettoyage
Pour éviter que des frais ne vous soient facturés, supprimez les ressources créées au cours de cet atelier de programmation.
1. Supprimer des VM Compute Engine
gcloud compute instances delete cassandra-origin zdm-proxy-vm bigtable-proxy-vm cdm-migrator-vm --zone=$ZONE --quiet
2. Supprimer une instance Bigtable
gcloud bigtable instances delete zdmbigtable
3. Supprimer des règles de pare-feu
gcloud compute firewall-rules delete allow-migration-internal
4. Supprimer la base de données Cassandra (si elle est installée localement ou persistante)
Si vous avez installé Cassandra en dehors d'une VM Compute Engine créée ici, suivez les étapes appropriées pour supprimer les données ou désinstaller Cassandra.
11. Félicitations !
Vous avez réussi à configurer un chemin de migration basé sur un proxy depuis Apache Cassandra vers Bigtable.
Vous avez appris à :
Déployez Cassandra et Bigtable.
- Configurez le proxy Cassandra-Bigtable pour la compatibilité CQL.
- Déployez le proxy ZDM Datastax pour gérer les doubles écritures et le trafic.
- Utilisez le migreur de données Cassandra pour transférer les données historiques.
Cette approche permet d'effectuer des migrations avec un temps d'arrêt minimal et sans modification du code en tirant parti de la couche proxy.
Étapes suivantes
- Consulter la documentation Bigtable
- Consultez la documentation sur le proxy ZDM Datastax pour connaître les configurations avancées et les procédures de transition.
- Pour en savoir plus, consultez le dépôt du proxy Cassandra-Bigtable.
- Consultez le dépôt Cassandra Data Migrator pour en savoir plus sur l'utilisation avancée.
- Essayer d'autres ateliers de programmation Google Cloud