DBAtlas · Atlas de operações de banco de dados

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