Volver a MySQL Intermedio
Alta Disponibilidad con InnoDB Cluster
Arquitectura del InnoDB Cluster
┌─────────────────────────────────────────┐
│ MySQL Router (x2) │
│ Puerto 6446 (R/W) │ Puerto 6447 (R/O) │
└────────┬──────────────────┬─────────────┘
│ │
┌────▼────┐ ┌────▼────┐ ┌──────────┐
│ Primary │◄──────►│Replica 1│ │Replica 2 │
│ :3306 │ GR │ :3306 │ │ :3306 │
└─────────┘ └─────────┘ └──────────┘
Configurar InnoDB Cluster
# Verificar compatibilidad de la instancia
mysqlsh -- dba checkInstanceConfiguration root@host1:3306
# Configurar instancia
mysqlsh -- dba configureInstance root@host1:3306
// MySQL Shell — crear cluster
shell.connect('root@host1:3306');
var cluster = dba.createCluster('MiCluster', {
multiPrimary: false,
gtidSetIsComplete: true
});
// Agregar réplicas
cluster.addInstance('root@host2:3306', { recoveryMethod: 'clone' });
cluster.addInstance('root@host3:3306', { recoveryMethod: 'clone' });
cluster.status();
Configuración del MySQL Router
[routing:escritura]
bind_address = 0.0.0.0
bind_port = 6446
destinations = metadata-cache://MiCluster/?role=PRIMARY
routing_strategy = first-available
[routing:lecturas]
bind_address = 0.0.0.0
bind_port = 6447
destinations = metadata-cache://MiCluster/?role=SECONDARY
routing_strategy = round-robin
Manejo de Failover
// El failover automático ocurre sin intervención
// Verificar nuevo primario
cluster.status();
// Reiniciar cluster en caso de fallo total
var cluster = dba.rebootClusterFromCompleteOutage('MiCluster');
// Failover forzado (posible pérdida de datos)
cluster.forceQuorumUsingPartitionOf('root@superviviente:3306');
Monitoreo del Cluster
-- Estado de los miembros
SELECT
MEMBER_ID,
MEMBER_HOST,
MEMBER_ROLE,
MEMBER_STATE
FROM performance_schema.replication_group_members;
-- Cola del aplicador (backlog)
SELECT COUNT_TRANSACTIONS_IN_QUEUE
FROM performance_schema.replication_group_member_stats
WHERE MEMBER_ID = @@server_uuid;
MySQL ReplicaSet (Alternativa Simplificada)
// Para 2 nodos sin Group Replication
var rs = dba.createReplicaSet('RS1');
rs.addInstance('root@replica:3306');
rs.status();
// Switchover manual
rs.setPrimaryInstance('root@replica:3306');
// Failover forzado
rs.forcePrimaryInstance('root@replica:3306');