kb.erickguedes.com
MySQL: Administração e Performance

Replicação MySQL

Aula 2 de 6

Replicação Assíncrona

Source (Master) → Binary Log → I/O Thread → Relay Log → SQL Thread → Replica

Configuração do Source

# /etc/mysql/mysql.conf.d/replication.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/binlog
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 500M
binlog_do_db = meu_banco
# binlog_ignore_db = mysql
-- Criar usuário de replicação
CREATE USER 'replicator'@'%' IDENTIFIED BY 'SenhaReplSegura!';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;

-- Ver status
SHOW MASTER STATUS\G
-- File: binlog.000012, Position: 123456

Configuração da Réplica

[mysqld]
server-id = 2
relay_log = /var/log/mysql/relay-log
read_only = 1
log_replica_updates = 0
-- Configurar réplica
CHANGE REPLICATION SOURCE TO
    SOURCE_HOST = '192.168.1.10',
    SOURCE_PORT = 3306,
    SOURCE_USER = 'replicator',
    SOURCE_PASSWORD = 'SenhaReplSegura!',
    SOURCE_LOG_FILE = 'binlog.000012',
    SOURCE_LOG_POS = 123456,
    SOURCE_SSL = 1;

-- Iniciar
START REPLICA;

-- Ver status
SHOW REPLICA STATUS\G
-- Seconds_Behind_Source: 0  (ok!)
-- Last_IO_Errno: 0
-- Last_SQL_Errno: 0

-- Parar
STOP REPLICA;
RESET REPLICA ALL;  -- reset completo

GTID — Global Transaction Identifiers

[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
-- Replicação com GTID (mais simples)
CHANGE REPLICATION SOURCE TO
    SOURCE_HOST = '192.168.1.10',
    SOURCE_USER = 'replicator',
    SOURCE_PASSWORD = 'SenhaReplSegura!',
    SOURCE_AUTO_POSITION = 1;

-- GTID facilita failover:
-- Source caiu, promova réplica:
STOP REPLICA;
RESET MASTER;  -- na réplica promovida

Semi-synchronous Replication

-- Plugin no source
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
SET GLOBAL rpl_semi_sync_source_enabled = 1;

-- Plugin na réplica
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';
SET GLOBAL rpl_semi_sync_replica_enabled = 1;

-- Source espera ACK de pelo menos 1 réplica
-- Performance: um pouco mais lento que async
-- Segurança: nenhuma perda de dados

Group Replication (InnoDB Cluster)

[mysqld]
server-id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_format = ROW
log_bin = /var/log/mysql/binlog
plugin_load_add = 'group_replication.so'
group_replication_group_name = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
group_replication_start_on_boot = OFF
group_replication_bootstrap_group = OFF
group_replication_local_address = "192.168.1.10:33061"
group_replication_group_seeds = "192.168.1.10:33061,192.168.1.20:33061,192.168.1.30:33061"
-- Criar usuário de replicação
SET SQL_LOG_BIN = 0;
CREATE USER 'repl'@'%' IDENTIFIED BY 'SenhaSegura!';
GRANT REPLICATION SLAVE, BACKUP_ADMIN ON *.* TO 'repl'@'%';
SET SQL_LOG_BIN = 1;

-- Primeiro nó
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;

-- Demais nós
START GROUP_REPLICATION;

-- Verificar
SELECT * FROM performance_schema.replication_group_members;

Replicação assíncrona: simples, atraso pode ser grande. GTID: failover mais fácil. Semi-sync: sem perda. Group Replication: multi-master, consistência forte. Para produção: Group Replication ou semi-sync.