Dans cet article, je vais vous montrer comment vous pouvez migrer une application Web complète de MySQL vers YugabyteDB à l’aide du moteur de migration de données open source YugabyteDB Voyager.
De nos jours, de nombreuses personnes migrent leurs applications de bases de données relationnelles traditionnelles à serveur unique vers des clusters de bases de données distribuées. Cela permet d’améliorer la disponibilité, l’évolutivité et les performances.
La migration vers YugabyteDB permet aux ingénieurs d’utiliser une interface SQL familière, tout en bénéficiant des caractéristiques de résilience des données et de performances des bases de données distribuées.
YugaSocial Application
J’ai développé une application appelée YugaSocial, conçue pour fonctionner sur MySQL.
L’application YugaSocial est un clone de Facebook avec la possibilité de publier des messages, de suivre des utilisateurs, de commenter des messages, et plus encore !
Commençons par déployer et connecter une base de données Google Cloud SQL exécutant MySQL. Plus tard, nous migrerons nos données vers un cluster managé YugabyteDB multi-nœuds.
Premiers pas avec MySQL
Nous pourrions exécuter MySQL sur nos machines en utilisant une installation locale ou dans Docker, mais je vais montrer comment migrer une base de données hébergée sur Google Cloud Platform (GCP) vers YugabyteDB Managed.
Configurer Google Cloud SQL
J’ai déployé une instance MySQL sur Google Cloud SQL nommée yugasocial
et définir mon adresse IP publique sur la liste des réseaux autorisés afin que je puisse me connecter directement depuis ma machine.
Bien que bénéfique à des fins de démonstration, je vous recommande de vous connecter en toute sécurité à l’intérieur d’un VPC, avec des certificats SSL pour sécuriser correctement vos transferts de données.
Connexion de YugaSocial à MySQL dans Node.js
La connexion à notre instance MySQL dans le cloud est facile avec le pilote MySQL pour Node.js.
Voici un extrait de code d’application qui se connecte à l’instance MySQL :
// connect.js
...
import mysql from "mysql";
if (process.env.DB_TYPE === "mysql") {
const pool = mysql.createPool({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
connectionLimit: 100
});
}
J’ai créé un pool de connexions avec jusqu’à 100 connexions établies. En définissant des variables d’environnement avec notre configuration d’instance Google Cloud SQL et en exécutant l’application, nous pouvons confirmer que notre base de données a été correctement configurée :
> DB_TYPE=mysql DB_USER=admin DB_HOST=[HOST] DB_HOST=[PASSWORD] node index.js
Connection to MySQL verified.
Server running on port 8800.
Après avoir vérifié notre base de données MySQL exécutée dans le cloud, nous pouvons commencer la migration vers YugabyteDB Managed.
Configuration de YugabyteDB géré
Il faut moins de cinq minutes pour démarrer avec YugabyteDB Managed. Commencez par créer un compte, puis suivez les étapes pour créer un cluster YugabyteDB.
J’ai choisi de déployer un cluster à trois nœuds sur GCP, dans la région us-west-1. Cette configuration fournira une tolérance aux pannes dans les zones de disponibilité.
Ajoutez votre adresse IP à la liste d’autorisation du cluster afin de pouvoir vous connecter depuis votre ordinateur à la base de données distante et télécharger les informations d’identification de la base de données avant de créer votre cluster.
Une fois notre cluster déployé, nous sommes prêts à commencer la migration avec YugabyteDB Voyager.
Migrer vers YugabyteDB
Après avoir vérifié notre déploiement MySQL, il est temps de migrer de Cloud SQL vers YugabyteDB à l’aide de la CLI YugabyteDB Voyager.
YugabyteDB Voyager est un puissant moteur de migration de données open source, qui gère l’intégralité du cycle de vie de la migration des données.
Après avoir installé YugabyteDB Voyager, nous allons commencer par créer des utilisateurs dans nos bases de données source et cible, et leur attribuer des rôles.
J’ai choisi d’utiliser le mysqlsh
utilitaire de ligne de commande pour se connecter à mon instance cloud, mais Google propose plusieurs options de connexion.
1. Créez le ybvoyager
utilisateur dans Cloud SQL et accordez les autorisations :
> mysqlsh root@CLOUD_SQL_HOST --password='CLOUD_SQL_PASSWORD'
> \sql
SQL=> \connect social
SQL=> CREATE USER 'ybvoyager'@'CLOUD_SQL_HOST' IDENTIFIED WITH mysql_native_password BY 'Password#123';
SQL=> GRANT PROCESS ON *.* TO 'ybvoyager'@'CLOUD_SQL_HOST';
SQL=> GRANT SELECT ON source_db_name.* TO 'ybvoyager'@'CLOUD_SQL_HOST';
SQL=> GRANT SHOW VIEW ON source_db_name.* TO 'ybvoyager'@'CLOUD_SQL_HOST';
SQL=> GRANT TRIGGER ON source_db_name.* TO 'ybvoyager'@'CLOUD_SQL_HOST';
SQL=> GRANT SHOW_ROUTINE ON *.* TO 'ybvoyager'@'CLOUD_SQL_HOST';
2. Répétez ce processus à l’aide de YugabyteDB Managed Cloud Shell :
// Optionally, you can create a database for import. Otherwise, the target database will default to 'yugabyte'.
yugabyte=> CREATE DATABASE social;
yugabyte=> CREATE USER ybvoyager PASSWORD 'password';
yugabyte=> GRANT yb_superuser TO ybvoyager;
Désormais, nos bases de données source et cible sont équipées pour utiliser Voyager. Pour exporter depuis Cloud SQL, nous devons d’abord créer un répertoire d’exportation et une variable d’environnement associée :
> mkdir ~/export-dir
> export EXPORT_DIR=$HOME/export-dir
Ce répertoire servira d’intermédiaire entre nos bases de données source et cible. Il hébergera des fichiers de schéma et de données, ainsi que des journaux, des métadonnées et des rapports d’analyse de schéma.
Commençons la migration de notre base de données.
1. Exportez le schéma depuis Google Cloud SQL :
> yb-voyager export schema --export-dir ~/export-dir \
--source-db-type mysql \
--source-db-host CLOUD_SQL_HOST \
--source-db-user root \
--source-db-password 'CLOUD_SQL_PASSWORD' \
--source-db-name social
export of schema for source type as 'mysql'
mysql version: 8.0.26-google
exporting TABLE done
exporting PARTITION done
exporting VIEW done
exporting TRIGGER done
exporting FUNCTION done
exporting PROCEDURE done
Exported schema files created under directory: /export-dir/schema
2. Analysez le schéma exporté :
> yb-voyager analyze-schema --export-dir ~/export-dir --output-format txt
-- find schema analysis report at: /export-dir/reports/report.txt
En analysant notre schéma avant d’exporter les données, nous avons la possibilité d’apporter les modifications nécessaires à nos déclarations DDL. Le rapport d’analyse de schéma signalera toutes les instructions nécessitant une intervention manuelle.
Dans le cas de YugaSocial, Voyager a migré le schéma MySQL vers PostgreSQL DDL sans avoir besoin de modifications manuelles.
3. Enfin, exportez les données depuis Google Cloud SQL :
> yb-voyager export data --export-dir ~/export-dir \
--source-db-type mysql \
--source-db-host CLOUD_SQL_HOST \
--source-db-user root \
--source-db-password 'CLOUD_SQL_PASSWORD' \
--source-db-name social
export of data for source type as 'mysql'
Num tables to export: 6
table list for data export: [comments likes posts relationships stories users]
calculating approx num of rows to export for each table...
Initiating data export.
Data export started.
Exported tables:- {comments, likes, posts, relationships, stories, users}
TABLE ROW COUNT
comments 1000
likes 502
posts 1000
relationships 1002
stories 1000
users 1004
Export of data complete ✅
Après avoir exporté avec succès notre schéma et nos données, nous sommes prêts à déplacer notre base de données vers YugabyteDB Managed.
1. Importez le schéma dans YugabyteDB Managed :
> yb-voyager import schema --export-dir ~/export-dir \
--target-db-host YUGABYTEDB_MANAGED_HOST \
--target-db-user admin \
--target-db-password YUGABYTEDB_MANAGED_PASSWORD \
--target-db-name yugabyte
schemas to be present in target database "yugabyte": [public]
creating schema 'public' in target database...
do you really want to import into 'public' schema? [Y/N]: y
table.sql: CREATE TABLE comments ( id bigserial, description varchar(200) NOT NULL, crea ...
table.sql: ALTER SEQUENCE comments_id_seq RESTART WITH 1;
table.sql: ALTER TABLE comments ADD UNIQUE (id);
table.sql: CREATE TABLE likes ( id bigserial, userid bigint NOT NULL, postid bigint NOT ...
table.sql: ALTER SEQUENCE likes_id_seq RESTART WITH 1;
table.sql: ALTER TABLE likes ADD UNIQUE (id);
table.sql: CREATE TABLE posts ( id bigserial, description varchar(200), img varchar(200) ...
...
Comme vous pouvez le voir sur la sortie du terminal, j’ai choisi d’importer dans le public
schéma. Si vous souhaitez utiliser un schéma différent, vous pouvez le faire en utilisant le --target-db-schema
option.
2. Importez les données dans YugabyteDB Managed :
> yb-voyager import data --export-dir ~/export-dir \
--target-db-host YUGABYTEDB_MANAGED_HOST \
--target-db-user admin \
--target-db-password YUGABYTEDB_MANAGED_PASSWORD \
--target-db-name yugabyte
import of data in "yugabyte" database started
Using 2 parallel jobs by default. Use --parallel-jobs to specify a custom value
skipping already imported tables: []
Preparing to import the tables: [comments likes posts relationships stories users]
All the tables are imported
setting resume value for sequences
YugabyteDB Voyager gère cette importation de données avec parallélisme, ce qui en fait un travail rapide.
3. Pour conclure, importez les index et les déclencheurs :
> yb-voyager import schema --export-dir ~/export-dir \
--target-db-host YUGABYTEDB_MANAGED_HOST \
--target-db-user admin \
--target-db-password YUGABYTEDB_MANAGED_PASSWORD \
--target-db-name yugabyte
--post-import-data
INDEXES_table.sql: CREATE INDEX comments_postid ON comments (postid);
INDEXES_table.sql: CREATE INDEX comments_userid ON comments (userid);
INDEXES_table.sql: CREATE INDEX likes_postid ON likes (postid);
...
Il est temps de vérifier que notre base de données a bien été migrée vers YugabyteDB Managed, en reconfigurant notre application YugaSocial.
Connexion de YugaSocial à YugabyteDB géré dans Node.js
Comme mentionné, YugaSocial a été développé pour…