Configuración de MySQL InnoDB Cluster (Group Replication)
Síntoma
Objetivo: configurar alta disponibilidad con failover automático para MySQL usando InnoDB Cluster (Group Replication + MySQL Shell + MySQL Router).
1. Cumpla los requisitos previos
InnoDB Cluster requiere MySQL 8.0+, un server_id único, modo GTID y el motor de almacenamiento InnoDB en cada nodo. Todas las instancias deben ser accesibles entre sí por red, y las tablas deben tener claves primarias. Prepare un usuario clusterAdmin para la administración.
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. Configure cada instancia con MySQL Shell
En mysqlsh, dba.configureInstance() prepara cada nodo para Group Replication; corrige los parámetros que faltan y solicita un reinicio si es necesario. Repita en todos los nodos.
MySQL
-- mysqlsh:
dba.configureInstance('icadmin@node1:3306')
dba.configureInstance('icadmin@node2:3306')
dba.configureInstance('icadmin@node3:3306')3. Cree el clúster (nodo semilla)
Conéctese a un nodo e inicie el clúster con dba.createCluster(); este nodo se convierte en el primer primario. Se devuelve un objeto cluster que se usa para las adiciones posteriores.
MySQL
-- mysqlsh, while connected to node1:
var cluster = dba.createCluster('appCluster')4. Agregue las demás instancias al clúster
Agregue los nodos secundarios con cluster.addInstance(). Elija clone (clonación física, rápida para un nodo nuevo) o incremental (vía GTID) como recoveryMethod. Al menos 3 nodos proporcionan una mayoría impar y failover automático.
MySQL
-- mysqlsh:
cluster.addInstance('icadmin@node2:3306', {recoveryMethod: 'clone'})
cluster.addInstance('icadmin@node3:3306', {recoveryMethod: 'clone'})5. Haga el bootstrap de MySQL Router
MySQL Router enruta entre la aplicación y el clúster; expone puertos de lectura/escritura (6446) y de solo lectura (6447) y redirige el tráfico automáticamente cuando cambia el primario. El bootstrap genera la configuración a partir de los metadatos del clúster.
MySQL
mysqlrouter --bootstrap icadmin@node1:3306 --user=mysqlrouter --directory /etc/mysqlrouter
# Then: mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf &6. Compruebe el estado del clúster y verifique el failover
cluster.status() muestra el rol de cada nodo (R/W primary, R/O secondary) y su estado (ONLINE). clusterName y la topología deben estar sanos. Pruebe el failover apagando el primario y observando la elección automática de un nuevo primario.
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;