Un MySQL seul est un point de défaillance unique (SPOF). Panne disque, crash système, maintenance planifiée — votre application est indisponible tant que le serveur n’est pas relancé. La réplication résout ce problème en copiant en continu les modifications vers un ou plusieurs replicas qui peuvent prendre le relais en cas de panne, absorber les lectures, ou servir de base pour les sauvegardes.
Ce guide monte un cluster source-replica avec réplication GTID asynchrone, couvre la surveillance du lag, le failover manuel, puis présente les architectures avancées : semi-synchrone, Group Replication et InnoDB Cluster.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Configurer un source et un replica en réplication GTID asynchrone de bout en bout
- Comprendre les binary logs, relay logs et positions GTID qui pilotent la réplication
- Surveiller le lag de réplication et diagnostiquer les retards
- Exécuter un failover manuel avec
CHANGE REPLICATION SOURCE TO - Distinguer réplication classique, semi-synchrone, Group Replication et InnoDB Cluster
- Choisir la bonne architecture selon vos exigences de disponibilité
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »La réplication MySQL répond à des besoins concrets d’administration :
- Vous administrez un MySQL en production et vous voulez éliminer le point de défaillance unique (SPOF)
- Vous avez besoin d’un replica en lecture pour décharger le source des requêtes de reporting ou d’analytics
- Vous préparez une maintenance planifiée (montée de version, migration) avec basculement contrôlé
- Vous devez garantir une reprise rapide (RTO court) en cas de crash du serveur principal
- Votre application nécessite une haute disponibilité automatisée (Group Replication, InnoDB Cluster)
Ce guide ne couvre pas…
Section intitulée « Ce guide ne couvre pas… »Prérequis
Section intitulée « Prérequis »- Deux serveurs avec MySQL 8.4 installé (même version) — voir le guide d’installation
- Un réseau permettant la connexion TCP entre les deux nœuds (port 3306)
- Accès root MySQL sur les deux serveurs
- Les bases du guide de configuration (notamment la section binary log)
Lab utilisé dans ce guide :
| Rôle | Hostname | IP | OS | MySQL |
|---|---|---|---|---|
| Source | mysql-source | 192.168.122.71 | Debian 12 | 8.4 LTS |
| Replica | mysql-replica | 192.168.122.72 | Debian 12 | 8.4 LTS |
La réplication n’est pas une sauvegarde
Section intitulée « La réplication n’est pas une sauvegarde »Les trois modèles de réplication MySQL
Section intitulée « Les trois modèles de réplication MySQL »MySQL propose trois modèles de réplication, du plus simple au plus résilient.
Réplication classique (source → replica, asynchrone)
Section intitulée « Réplication classique (source → replica, asynchrone) »Le modèle le plus courant. Le source écrit les modifications dans le binary log. Le replica lit ce binary log, le copie dans son relay log local, puis l’applique.
Le source n’attend pas la confirmation du replica avant de valider un COMMIT — c’est la réplication asynchrone. Simple et performante, mais quelques transactions peuvent être perdues si le source crashe avant que le replica n’ait reçu les derniers binlogs.
Semi-synchrone (plugin rpl_semi_sync)
Section intitulée « Semi-synchrone (plugin rpl_semi_sync) »Le source attend la confirmation du replica avant de retourner le COMMIT au client. Garantit qu’au moins un replica a reçu les données — RPO quasi nul. En contrepartie, chaque COMMIT a une latence réseau supplémentaire.
Group Replication (consensus Paxos, multi-primaire)
Section intitulée « Group Replication (consensus Paxos, multi-primaire) »Plusieurs nœuds MySQL forment un groupe qui maintient la cohérence par consensus distribué (protocole Paxos). Chaque nœud peut accepter des écritures (multi-primary) ou un seul (single-primary). La détection de pannes et le failover sont automatiques.
Quand utiliser quoi
Section intitulée « Quand utiliser quoi »| Critère | Asynchrone | Semi-synchrone | Group Replication |
|---|---|---|---|
| Complexité | Simple | Modérée | Élevée |
| RPO | Quelques transactions | Quasi nul | Nul (consensus) |
| RTO | Manuel (failover) | Manuel | Automatique |
| Latence COMMIT | Aucun impact | +1 aller-retour réseau | +consensus |
| Nombre de nœuds | 2+ | 2+ | 3+ (impair recommandé) |
| Cas d’usage | Lecture distribuée, backup | Données critiques, finance | Haute disponibilité automatisée |
Règle pratique : commencez par la réplication GTID asynchrone. Passez en semi-synchrone pour les données critiques, et en Group Replication quand le failover automatique est indispensable.
GTID : la brique essentielle
Section intitulée « GTID : la brique essentielle »Principe : identifiant global de transaction
Section intitulée « Principe : identifiant global de transaction »Un GTID (Global Transaction Identifier) identifie de manière unique chaque transaction validée sur un serveur MySQL. Le format est source_uuid:transaction_id :
3E11FA47-71CA-11E1-9E33-C80AA9429562:23source_uuid: identifiant unique du serveur qui a créé la transaction (variableserver_uuid)transaction_id: numéro séquentiel incrémenté à chaqueCOMMIT
L’ensemble des GTID exécutés sur un serveur s’appelle le GTID set (visible dans gtid_executed). Lors de la réplication, le replica sait exactement quelles transactions il a déjà appliquées — il ne reçoit jamais un doublon.
Avantages vs réplication par position binlog
Section intitulée « Avantages vs réplication par position binlog »| Critère | Position binlog (ancien) | GTID (recommandé) |
|---|---|---|
| Failover | Recalculer la position sur le nouveau source — complexe et fragile | Le replica retrouve automatiquement sa position par le GTID set |
| Point de reprise | Dépend du fichier + offset dans le binlog | Identifiant global — indépendant du fichier |
| Multi-source | Très complexe | Géré nativement (chaque source a son UUID) |
| Détection de doublons | Impossible | Le replica refuse les GTID déjà appliqués |
| Recommandation | Legacy, pour compatibilité | Standard moderne — recommandé |
Configurer le source
Section intitulée « Configurer le source »La configuration du source se fait en quatre étapes : paramètres serveur, GTID, rôle dédié et autorisation réseau.
Activer le binary log et les GTID
Section intitulée « Activer le binary log et les GTID »Éditez /etc/mysql/mysql.conf.d/mysqld.cnf sur le source :
[mysqld]# Identifiant unique du serveur — DOIT être différent sur chaque nœudserver_id = 1
# Binary log (activé par défaut en 8.4, mais nommage explicite)log_bin = /var/lib/mysql/binlog
# GTID obligatoiregtid_mode = ONenforce_gtid_consistency = ON
# Format ROW pour la cohérence (défaut en 8.4)binlog_format = ROW
# Durabilité maximalesync_binlog = 1innodb_flush_log_at_trx_commit = 1
# Rétention binlog (30 jours)binlog_expire_logs_seconds = 2592000Redémarrez MySQL :
sudo systemctl restart mysqlVérification :
SHOW VARIABLES LIKE 'gtid_mode';SHOW VARIABLES LIKE 'enforce_gtid_consistency';SHOW VARIABLES LIKE 'server_id';+--------------------------+-------+| Variable_name | Value |+--------------------------+-------+| gtid_mode | ON |+--------------------------+-------+
+--------------------------+-------+| enforce_gtid_consistency | ON |+--------------------------+-------+
+---------------+-------+| Variable_name | Value |+---------------+-------+| server_id | 1 |+---------------+-------+Créer un rôle REPLICATION SLAVE dédié
Section intitulée « Créer un rôle REPLICATION SLAVE dédié »Ne pas utiliser le compte root pour la réplication. Créez un rôle dédié avec les seuls privilèges nécessaires :
CREATE USER 'replicator'@'192.168.122.72' IDENTIFIED BY 'motdepasse_fort_replication';GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'192.168.122.72';Le privilège REPLICATION SLAVE ne permet que la lecture du binary log — pas d’accès aux données.
Autoriser la connexion du replica
Section intitulée « Autoriser la connexion du replica »Si bind_address est à 127.0.0.1, le replica ne peut pas se connecter. Modifiez le source :
[mysqld]bind_address = 0.0.0.0Après redémarrage, vérifiez que MySQL écoute sur toutes les interfaces :
ss -tlnp | grep 3306LISTEN 0 151 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=33))Initialiser le replica
Section intitulée « Initialiser le replica »Configurer le replica
Section intitulée « Configurer le replica »Éditez /etc/mysql/mysql.conf.d/mysqld.cnf sur le replica :
[mysqld]# Identifiant unique — différent du sourceserver_id = 2
# GTID obligatoiregtid_mode = ONenforce_gtid_consistency = ON
# Le replica en lecture seuleread_only = ONsuper_read_only = ON
# Binary log activé (utile pour la chaîne de réplication ou le failover)log_bin = /var/lib/mysql/binlog
# Relay logrelay_log = /var/lib/mysql/relay-bin
# Applier multi-thread (accélère le rattrapage)replica_parallel_workers = 4replica_parallel_type = LOGICAL_CLOCKreplica_preserve_commit_order = ONRedémarrez MySQL sur le replica :
sudo systemctl restart mysqlClone plugin : copie à chaud simplifiée
Section intitulée « Clone plugin : copie à chaud simplifiée »Le clone plugin (intégré à MySQL 8.0+) copie l’intégralité du data directory depuis le source vers le replica — c’est l’équivalent MySQL de pg_basebackup -R pour PostgreSQL.
-
Installer le plugin sur le source ET le replica :
INSTALL PLUGIN clone SONAME 'mysql_clone.so'; -
Créer un utilisateur clone sur le source (donor) :
CREATE USER 'clone_user'@'192.168.122.72' IDENTIFIED BY 'motdepasse_clone';GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'192.168.122.72'; -
Accorder
CLONE_ADMINau compte qui exécutera le clonage sur le replica (recipient) :-- Sur le replicaGRANT CLONE_ADMIN ON *.* TO 'root'@'localhost'; -
Configurer le donor sur le replica :
SET GLOBAL clone_valid_donor_list = '192.168.122.71:3306'; -
Lancer le clonage depuis le replica :
CLONE INSTANCE FROM 'clone_user'@'192.168.122.71':3306IDENTIFIED BY 'motdepasse_clone';Le replica redémarre automatiquement avec les données du source.
CHANGE REPLICATION SOURCE TO avec GTID
Section intitulée « CHANGE REPLICATION SOURCE TO avec GTID »Une fois les données synchronisées (clone, dump ou snapshot), configurez la réplication sur le replica :
CHANGE REPLICATION SOURCE TO SOURCE_HOST = '192.168.122.71', SOURCE_PORT = 3306, SOURCE_USER = 'replicator', SOURCE_PASSWORD = 'motdepasse_fort_replication', SOURCE_AUTO_POSITION = 1, GET_SOURCE_PUBLIC_KEY = 1;| Option | Rôle |
|---|---|
SOURCE_HOST | Adresse du source |
SOURCE_USER | Rôle de réplication |
SOURCE_AUTO_POSITION = 1 | Active le repositionnement automatique par GTID — pas besoin de spécifier le fichier binlog et l’offset |
GET_SOURCE_PUBLIC_KEY = 1 | Récupère la clé publique du source pour caching_sha2_password |
START REPLICA et vérification
Section intitulée « START REPLICA et vérification »START REPLICA;Vérification immédiate :
SHOW REPLICA STATUS\G*************************** 1. row *************************** Replica_IO_Running: Yes Replica_SQL_Running: Yes Source_Log_File: binlog.000003 Read_Source_Log_Pos: 1234 Relay_Log_File: relay-bin.000002 Exec_Source_Log_Pos: 1234 Seconds_Behind_Source: 0 Retrieved_Gtid_Set: 3e11fa47-71ca-11e1-9e33-c80aa9429562:1-23 Executed_Gtid_Set: 3e11fa47-71ca-11e1-9e33-c80aa9429562:1-23Les deux indicateurs critiques :
Replica_IO_Running: Yes— le thread I/O reçoit les binlogs du sourceReplica_SQL_Running: Yes— le thread SQL applique les événementsSeconds_Behind_Source: 0— le replica est synchronisé
Vérifier la réplication
Section intitulée « Vérifier la réplication »SHOW REPLICA STATUS : les colonnes clés
Section intitulée « SHOW REPLICA STATUS : les colonnes clés »SHOW REPLICA STATUS\G contient plus de 60 colonnes. Voici les essentielles :
| Colonne | Signification |
|---|---|
Replica_IO_Running | Yes = thread I/O actif (lecture binlog source) |
Replica_SQL_Running | Yes = thread SQL actif (application relay log) |
Seconds_Behind_Source | Lag en secondes (0 = synchronisé) |
Retrieved_Gtid_Set | GTID reçus du source |
Executed_Gtid_Set | GTID appliqués sur le replica |
Last_IO_Error | Dernière erreur du thread I/O |
Last_SQL_Error | Dernière erreur du thread SQL |
performance_schema.replication_*
Section intitulée « performance_schema.replication_* »Pour un monitoring plus structuré, utilisez les tables performance_schema :
-- État des connexions de réplicationSELECT CHANNEL_NAME, SERVICE_STATE, SOURCE_UUID, LAST_ERROR_NUMBER, LAST_ERROR_MESSAGEFROM performance_schema.replication_connection_status;-- État des appliers (threads parallèles)SELECT CHANNEL_NAME, WORKER_ID, SERVICE_STATE, LAST_APPLIED_TRANSACTION, APPLYING_TRANSACTIONFROM performance_schema.replication_applier_status_by_worker;Calculer le lag
Section intitulée « Calculer le lag »Seconds_Behind_Source est la métrique la plus courante mais elle peut être imprécise (elle mesure le delta entre le timestamp de l’événement et l’heure locale). Pour un calcul plus fiable :
-- Comparer les GTID exécutés vs reçusSELECT GTID_SUBTRACT( (SELECT Received_transaction_set FROM performance_schema.replication_connection_status), @@global.gtid_executed ) AS gtid_lag;Si le résultat est vide, le replica a appliqué tous les GTID reçus — zéro lag.
Multi-threaded applier (replica_parallel_workers)
Section intitulée « Multi-threaded applier (replica_parallel_workers) »En MySQL 8.4, les replicas sont multithreadés par défaut. Le paramètre replica_parallel_workers vaut 4, avec replica_preserve_commit_order = ON.
Pour augmenter la capacité de rattrapage sur un replica très sollicité :
STOP REPLICA;SET PERSIST replica_parallel_workers = 8;SET PERSIST replica_preserve_commit_order = ON;START REPLICA;| Paramètre | Défaut 8.4 | Rôle |
|---|---|---|
replica_parallel_workers | 4 | Nombre de threads d’application (0 = mono-thread) |
replica_parallel_type | LOGICAL_CLOCK | Parallélise par groupe de transactions commitées en même temps sur le source |
replica_preserve_commit_order | ON | Garantit que l’ordre des commits est respecté même en parallèle |
Tester la réplication en temps réel
Section intitulée « Tester la réplication en temps réel »Sur le source — insérez une ligne :
INSERT INTO lab_mysql.clients (nom, email, ville)VALUES ('Test Replication', 'repl@example.com', 'Lyon');Sur le replica — vérifiez immédiatement :
SELECT nom, email FROM lab_mysql.clients WHERE nom = 'Test Replication';+------------------+------------------+| nom | email |+------------------+------------------+| Test Replication | repl@example.com |+------------------+------------------+La ligne est visible quasi instantanément.
Lectures sur le replica
Section intitulée « Lectures sur le replica »read_only et super_read_only
Section intitulée « read_only et super_read_only »Le replica est configuré en lecture seule via deux paramètres :
SHOW VARIABLES LIKE '%read_only%';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| read_only | ON || super_read_only | ON |+-----------------------+-------+read_only = ON: bloque les écritures pour les utilisateurs normauxsuper_read_only = ON: bloque aussi les écritures pour les comptes avecSUPERouCONNECTION_ADMIN— recommandé pour éviter les écritures accidentelles par un DBA
Toute tentative d’écriture est refusée :
INSERT INTO lab_mysql.clients (nom, email, ville)VALUES ('Test', 'test@example.com', 'Paris');ERROR 1290 (HY000): The MySQL server is running with the--super-read-only option so it cannot execute this statementConnecter les applications en lecture
Section intitulée « Connecter les applications en lecture »Pour distribuer les lectures, configurez vos applications pour envoyer les écritures au source et les lectures au replica :
- Au niveau applicatif : deux connexions (source pour write, replica pour read)
- Avec un proxy : ProxySQL ou MySQL Router fait le routage automatiquement selon le type de requête
Failover manuel
Section intitulée « Failover manuel »Le failover consiste à promouvoir le replica en nouveau source quand l’ancien source est indisponible.
Vérifier l’état avant le failover
Section intitulée « Vérifier l’état avant le failover »Avant de promouvoir, assurez-vous que le replica est synchronisé :
SHOW REPLICA STATUS\GVérifiez :
Replica_IO_Running: YesetReplica_SQL_Running: YesSeconds_Behind_Source: 0Retrieved_Gtid_Set=Executed_Gtid_Set(tous les GTID reçus sont appliqués)
Promouvoir le replica
Section intitulée « Promouvoir le replica »-
Arrêter la réplication :
STOP REPLICA; -
Supprimer la configuration de réplication :
RESET REPLICA ALL;RESET REPLICA ALLefface toute la configuration source (host, user, etc.). Le replica oublie qu’il était un replica.Important : avec GTID activé,
RESET REPLICA ALLne réinitialise pas l’historique GTID (gtid_executed,gtid_purged). C’est le comportement souhaité pour le failover — le nouveau source conserve l’historique complet des transactions. -
Désactiver le mode lecture seule :
SET GLOBAL read_only = OFF;SET GLOBAL super_read_only = OFF;SET PERSIST read_only = OFF;SET PERSIST super_read_only = OFF; -
Vérifier que les écritures fonctionnent :
INSERT INTO lab_mysql.clients (nom, email, ville)VALUES ('Après failover', 'failover@example.com', 'Marseille');Query OK, 1 row affected -
Reconfigurer les applications pour pointer vers le nouveau source (
192.168.122.72).
Reconstruire l’ancien source comme nouveau replica
Section intitulée « Reconstruire l’ancien source comme nouveau replica »Une fois l’ancien source disponible à nouveau, reconstituez-le comme replica du nouveau source :
-
Réinitialiser les données (clone plugin ou dump depuis le nouveau source) :
-- Sur l'ancien sourceSET GLOBAL clone_valid_donor_list = '192.168.122.72:3306';CLONE INSTANCE FROM 'clone_user'@'192.168.122.72':3306IDENTIFIED BY 'motdepasse_clone'; -
Configurer la réplication vers le nouveau source :
CHANGE REPLICATION SOURCE TOSOURCE_HOST = '192.168.122.72',SOURCE_PORT = 3306,SOURCE_USER = 'replicator',SOURCE_PASSWORD = 'motdepasse_fort_replication',SOURCE_AUTO_POSITION = 1;START REPLICA; -
Vérifier :
SHOW REPLICA STATUS\G-- Replica_IO_Running: Yes-- Replica_SQL_Running: Yes
Réplication semi-synchrone
Section intitulée « Réplication semi-synchrone »Principe : le COMMIT attend l’ACK du replica
Section intitulée « Principe : le COMMIT attend l’ACK du replica »En mode semi-synchrone, le source ne retourne le COMMIT au client que lorsqu’au moins un replica a confirmé avoir reçu et écrit le binlog event dans son relay log. Cela garantit que les données existent sur au moins deux serveurs avant la confirmation — RPO quasi nul.
Activer les plugins rpl_semi_sync_source / replica
Section intitulée « Activer les plugins rpl_semi_sync_source / replica »-
Sur le source :
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';SET GLOBAL rpl_semi_sync_source_enabled = ON;SET PERSIST rpl_semi_sync_source_enabled = ON; -
Sur le replica :
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';SET GLOBAL rpl_semi_sync_replica_enabled = ON;SET PERSIST rpl_semi_sync_replica_enabled = ON;-- Redémarrer le thread I/O pour activer le semi-syncSTOP REPLICA IO_THREAD;START REPLICA IO_THREAD; -
Vérifier sur le source :
SHOW STATUS LIKE 'Rpl_semi_sync_source_status';+-----------------------------+-------+| Variable_name | Value |+-----------------------------+-------+| Rpl_semi_sync_source_status | ON |+-----------------------------+-------+
Compromis : latence vs garantie de données
Section intitulée « Compromis : latence vs garantie de données »| Paramètre | Défaut | Rôle |
|---|---|---|
rpl_semi_sync_source_timeout | 10000 ms | Temps d’attente avant fallback en asynchrone |
rpl_semi_sync_source_wait_for_replica_count | 1 | Nombre de replicas devant confirmer |
rpl_semi_sync_source_wait_point | AFTER_SYNC | Le COMMIT attend après l’écriture dans le binlog (avant le commit InnoDB) — loss-less semi-sync |
Fallback automatique en mode asynchrone
Section intitulée « Fallback automatique en mode asynchrone »Si aucun replica ne confirme dans le timeout, le source bascule automatiquement en mode asynchrone pour ne pas bloquer les écritures. Il repasse en semi-synchrone dès qu’un replica se reconnecte.
-- Vérifier le nombre de fallbackSHOW STATUS LIKE 'Rpl_semi_sync_source_no_tx';SHOW STATUS LIKE 'Rpl_semi_sync_source_yes_tx';Group Replication : aperçu
Section intitulée « Group Replication : aperçu »Group Replication (GR) est la solution de haute disponibilité intégrée à MySQL. Elle fournit une réplication de machine à états distribuée avec forte coordination entre nœuds. Le moteur de communication du groupe, XCom, est une variante de Paxos. La détection de pannes et le failover sont automatiques.
Single-primary vs multi-primary
Section intitulée « Single-primary vs multi-primary »| Mode | Description | Cas d’usage |
|---|---|---|
| Single-primary | Un seul nœud accepte les écritures, les autres sont en lecture | Le plus courant, le plus simple, évite les conflits |
| Multi-primary | Tous les nœuds acceptent les écritures | Requiert une gestion des conflits au niveau applicatif |
Pré-requis
Section intitulée « Pré-requis »Group Replication impose des contraintes strictes :
- InnoDB uniquement — toutes les tables doivent utiliser InnoDB
- Clé primaire sur chaque table (pas de table sans PK)
- GTID activé (
gtid_mode = ON,enforce_gtid_consistency = ON) - Binary log en format ROW
- 3 nœuds minimum (nombre impair recommandé pour le quorum)
- Réseau fiable entre les nœuds (latence faible)
group_replication_consistency en 8.4
Section intitulée « group_replication_consistency en 8.4 »MySQL 8.4 change la valeur par défaut de group_replication_consistency de EVENTUAL (en 8.0) à BEFORE_ON_PRIMARY_FAILOVER — une amélioration significative de la cohérence après failover.
| Valeur | Comportement |
|---|---|
EVENTUAL | Les lectures peuvent voir des données légèrement en retard |
BEFORE_ON_PRIMARY_FAILOVER | Défaut 8.4 — après un failover, le nouveau primary attend que les transactions en attente soient appliquées avant d’accepter les lectures |
BEFORE | Chaque lecture attend que toutes les transactions du groupe soient appliquées |
AFTER | Le COMMIT attend que tous les nœuds aient appliqué la transaction |
BEFORE_AND_AFTER | Combine BEFORE et AFTER — cohérence maximale au prix de la latence |
-- Défaut en 8.4, mais peut être ajusté si besoinSET PERSIST group_replication_consistency = 'BEFORE_ON_PRIMARY_FAILOVER';InnoDB Cluster et InnoDB ReplicaSet : orchestration
Section intitulée « InnoDB Cluster et InnoDB ReplicaSet : orchestration »MySQL Shell + MySQL Router + Group Replication
Section intitulée « MySQL Shell + MySQL Router + Group Replication »InnoDB Cluster combine trois composants :
- Group Replication — le moteur de réplication sous-jacent
- MySQL Shell (
mysqlsh) — l’outil d’administration pour créer et gérer le cluster - MySQL Router — le proxy qui route les connexions automatiquement vers le primary (écritures) et les secondaries (lectures)
Application │ ▼MySQL Router (port 6446 R/W, port 6447 R/O) │ ├── Node 1 (Primary) ← écritures ├── Node 2 (Secondary) ← lectures └── Node 3 (Secondary) ← lecturesCréation d’un cluster avec MySQL Shell :
// Connecté au premier nœudvar cluster = dba.createCluster('monCluster');
// Ajouter les autres nœudscluster.addInstance('root@192.168.122.72:3306');cluster.addInstance('root@192.168.122.73:3306');
// Vérifier l'étatcluster.status();InnoDB ReplicaSet : alternative simple (asynchrone)
Section intitulée « InnoDB ReplicaSet : alternative simple (asynchrone) »Si Group Replication est trop contraignant, InnoDB ReplicaSet offre une orchestration simplifiée pour la réplication asynchrone classique via MySQL Shell :
var rs = dba.createReplicaSet('monReplicaSet');rs.addInstance('root@192.168.122.72:3306');rs.status();
// Failoverrs.setPrimaryInstance('root@192.168.122.72:3306');Quand choisir Cluster vs ReplicaSet
Section intitulée « Quand choisir Cluster vs ReplicaSet »| Critère | InnoDB Cluster | InnoDB ReplicaSet |
|---|---|---|
| Réplication | Group Replication (consensus) | Asynchrone classique |
| Failover | Automatique | Semi-automatique (via mysqlsh) |
| Nombre de nœuds | 3+ (impair) | 2+ |
| Contraintes | PIK obligatoire, InnoDB only | Moins contraignant |
| Complexité | Élevée | Modérée |
| Cas d’usage | HA critique en production | Réplication simple avec orchestration |
Outils tiers
Section intitulée « Outils tiers »Orchestrator (GitHub)
Section intitulée « Orchestrator (GitHub) »Orchestrator est un outil open source (développé par GitHub) pour la gestion et le failover automatique des topologies de réplication MySQL. Il détecte les pannes, réarrange la topologie et effectue le failover sans intervention humaine.
ProxySQL
Section intitulée « ProxySQL »ProxySQL est un proxy MySQL haute performance qui gère le routage lecture/écriture, le connection pooling, le query caching et le failover automatique. Alternative populaire à MySQL Router.
MySQL Router
Section intitulée « MySQL Router »MySQL Router est le proxy officiel Oracle, optimisé pour InnoDB Cluster. Il route les connexions en fonction du rôle (R/W → primary, R/O → secondaries) et met à jour sa configuration automatiquement quand la topologie change.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
Replica_IO_Running: No | Connectivité réseau, credentials incorrects ou server_id dupliqué | Vérifier avec mysql -h source -u replicator -p, vérifier server_id unique |
Got fatal error from source when reading data | Binlog purgé avant que le replica ne l’ait lu | Augmenter binlog_expire_logs_seconds ou reconstruire le replica (clone/dump) |
Seconds_Behind_Source augmente | Le replica n’arrive pas à suivre le rythme | Activer replica_parallel_workers, vérifier les IOPS disque du replica |
Duplicate entry for key 'PRIMARY' | Transaction déjà appliquée (GTID manquant) | Avec GTID, le doublon est normalement évité. Vérifier gtid_executed sur les deux nœuds |
Could not find first log file name in binary log index | Le replica demande un binlog qui a été purgé | Reconstruire le replica avec le clone plugin ou un dump frais |
| GTID errant (errant transaction) | Transaction exécutée directement sur le replica | Identifier avec GTID_SUBTRACT(replica_gtid, source_gtid). Injecter une transaction vide sur le source pour combler, ou reconstruire le replica |
| Semi-sync timeout constant | Réseau lent ou replica surchargé | Vérifier la latence réseau, augmenter rpl_semi_sync_source_timeout temporairement, vérifier les IOPS |
ERROR 3100 (HY000): The function is not allowed when Group Replication is running | Commande incompatible avec Group Replication | Utiliser les APIs MySQL Shell (dba.getCluster()) au lieu des commandes SQL directes |
À retenir
Section intitulée « À retenir »- La réplication GTID est le standard en MySQL 8.4 — elle simplifie le failover en identifiant chaque transaction de manière unique
- La réplication n’est pas une sauvegarde : un
DROP TABLEest immédiatement répliqué - Le clone plugin simplifie l’initialisation du replica en copiant le data directory complet — c’est l’équivalent MySQL de
pg_basebackup CHANGE REPLICATION SOURCE TOavecSOURCE_AUTO_POSITION = 1exploite les GTID — pas besoin de calculer la position binlog manuellementread_only+super_read_onlyprotègent le replica contre les écritures accidentelles — activez toujours les deux- Le multi-threaded applier (
replica_parallel_workers) accélère significativement le rattrapage du replica - La réplication semi-synchrone garantit un RPO quasi nul mais ajoute de la latence — avec un seul replica, le fallback en asynchrone est silencieux
- Group Replication fournit le failover automatique par consensus — impose des contraintes strictes (InnoDB, clé primaire, 3+ nœuds)
- InnoDB Cluster = Group Replication + MySQL Shell + MySQL Router — la solution HA complète d’Oracle
- En production, utilisez un outil d’orchestration (MySQL Router, ProxySQL, Orchestrator) plutôt qu’un failover manuel