Configuração do MySQL InnoDB Cluster (Group Replication)
Sintoma
Objetivo: configurar alta disponibilidade com failover automático para o MySQL usando InnoDB Cluster (Group Replication + MySQL Shell + MySQL Router).
1. Atenda aos pré-requisitos
O InnoDB Cluster exige MySQL 8.0+, um server_id único, modo GTID e o storage engine InnoDB em todos os nós. Todas as instâncias precisam se alcançar pela rede, e as tabelas precisam ter chave primária. Prepare um usuário clusterAdmin para a administração.
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 instância com o MySQL Shell
No mysqlsh, dba.configureInstance() deixa cada nó apto para o Group Replication; corrige parâmetros ausentes e pede restart se necessário. Repita em todos os nós.
MySQL
-- mysqlsh:
dba.configureInstance('icadmin@node1:3306')
dba.configureInstance('icadmin@node2:3306')
dba.configureInstance('icadmin@node3:3306')3. Crie o cluster (nó seed)
Conecte-se a um nó e inicie o cluster com dba.createCluster(); esse nó vira o primeiro primário. Um objeto cluster é retornado e usado nas adições seguintes.
MySQL
-- mysqlsh, while connected to node1:
var cluster = dba.createCluster('appCluster')4. Adicione as outras instâncias ao cluster
Adicione os nós secundários com cluster.addInstance(). Escolha clone (clone físico, rápido para um nó novo) ou incremental (via GTID) como recoveryMethod. Pelo menos 3 nós fornecem uma maioria ímpar e failover automático.
MySQL
-- mysqlsh:
cluster.addInstance('icadmin@node2:3306', {recoveryMethod: 'clone'})
cluster.addInstance('icadmin@node3:3306', {recoveryMethod: 'clone'})5. Faça o bootstrap do MySQL Router
O MySQL Router faz o roteamento entre a aplicação e o cluster; expõe as portas de leitura/escrita (6446) e somente leitura (6447) e redireciona o tráfego automaticamente quando o primário muda. O bootstrap gera a configuração a partir dos metadados do cluster.
MySQL
mysqlrouter --bootstrap icadmin@node1:3306 --user=mysqlrouter --directory /etc/mysqlrouter
# Then: mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf &6. Verifique o status do cluster e o failover
cluster.status() mostra o papel de cada nó (R/W primário, R/O secundário) e o estado (ONLINE). clusterName e a topologia devem estar saudáveis. Teste o failover desligando o primário e observando a eleição automática de um novo primário.
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;