Mise en place de MySQL InnoDB Cluster (Group Replication)
Symptôme
Objectif : mettre en place la haute disponibilité avec failover automatique pour MySQL à l'aide d'InnoDB Cluster (Group Replication + MySQL Shell + MySQL Router).
1. Remplissez les prérequis
InnoDB Cluster exige MySQL 8.0+, un server_id unique, le mode GTID et le moteur de stockage InnoDB sur chaque nœud. Toutes les instances doivent être joignables entre elles par le réseau, et les tables doivent avoir une clé primaire. Préparez un utilisateur clusterAdmin pour l'administration.
MySQL
-- my.cnf on each instance:
-- server_id unique, gtid_mode=ON, enforce_gtid_consistency=ON
CREATE USER 'icadmin'@'%' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON *.* TO 'icadmin'@'%' WITH GRANT OPTION;2. Configurez chaque instance avec MySQL Shell
Dans mysqlsh, dba.configureInstance() rend chaque nœud apte à Group Replication ; il corrige les paramètres manquants et demande un redémarrage si nécessaire. Répétez sur tous les nœuds.
MySQL
-- mysqlsh:
dba.configureInstance('icadmin@node1:3306')
dba.configureInstance('icadmin@node2:3306')
dba.configureInstance('icadmin@node3:3306')3. Créez le cluster (nœud seed)
Connectez-vous à un nœud et démarrez le cluster avec dba.createCluster() ; ce nœud devient le premier primaire. Un objet cluster est renvoyé et utilisé pour les ajouts suivants.
MySQL
-- mysqlsh, while connected to node1:
var cluster = dba.createCluster('appCluster')4. Ajoutez les autres instances au cluster
Ajoutez les nœuds secondaires avec cluster.addInstance(). Choisissez clone (clone physique, rapide pour un nouveau nœud) ou incremental (via GTID) comme recoveryMethod. Au moins 3 nœuds assurent une majorité impaire et le failover automatique.
MySQL
-- mysqlsh:
cluster.addInstance('icadmin@node2:3306', {recoveryMethod: 'clone'})
cluster.addInstance('icadmin@node3:3306', {recoveryMethod: 'clone'})5. Initialisez MySQL Router (bootstrap)
MySQL Router route entre l'application et le cluster ; il expose des ports lecture/écriture (6446) et lecture seule (6447) et redirige automatiquement le trafic lorsque le primaire change. Le bootstrap génère la configuration à partir des métadonnées du cluster.
MySQL
mysqlrouter --bootstrap icadmin@node1:3306 --user=mysqlrouter --directory /etc/mysqlrouter
# Then: mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf &6. Vérifiez l'état du cluster et le failover
cluster.status() affiche le rôle de chaque nœud (primaire R/W, secondaire R/O) et son état (ONLINE). clusterName et la topologie doivent être sains. Testez le failover en arrêtant le primaire et en observant l'élection automatique d'un nouveau primaire.
MySQL
-- mysqlsh:
var cluster = dba.getCluster('appCluster')
cluster.status()
-- Members via SQL:
SELECT member_host, member_role, member_state FROM performance_schema.replication_group_members;