DBAtlas · Atlas de operaciones de bases de datos

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;
Abrir en DBAtlas →