Como configurar replicação MySQL com criptografia SSL no CentOS 5.4
Visão geral
Este guia descreve como replicar o banco de dados exampledb do servidor server1.example.com (master) com IP 192.168.0.100 para o servidor server2.example.com (slave) com IP 192.168.0.101. Ambos os sistemas executam CentOS 5.4, mas os passos tendem a funcionar em outras distribuições com pequenas adaptações.
Replicação MySQL mantém uma cópia idêntica de um banco de dados no slave e aplica atualizações do master automaticamente. Atenção: a replicação não substitui backup — um DELETE acidental no master será replicado no slave.
Importante: todos os comandos neste tutorial foram executados como root. Garanta que você está autenticado como root ou usando sudo.
Objetivo e variantes de intenção
- Objetivo principal: configurar replicação MySQL com tráfego encriptado por SSL.
- Variantes comuns: replicação sem SSL (não recomendada em redes inseguras); replicação entre hosts com firewalls; replicação multi-master (mais complexa).
1 Nota preliminar
- Master: server1.example.com — 192.168.0.100
- Slave: server2.example.com — 192.168.0.101
- Banco a replicar: exampledb (já existente no master)
- Sistemas: CentOS 5.4
Se o banco exampledb tiver muitos dados, execute os passos de dump/import fora de horários de pico. Se preferir, use snapshots LVM ou backups consistentes para acelerar a fase de sincronização.
2 Instalando MySQL 5 e habilitando suporte a SSL
Se o MySQL 5 não estiver instalado em server1 e server2, instale-o com:
yum install mysql mysql-devel mysql-server
Habilite o serviço para iniciar automaticamente e inicie-o:
chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start
Defina a senha do root MySQL em cada host (substitua yourrootsqlpassword pela sua senha):
server1/server2:
mysqladmin -u root password yourrootsqlpassword
mysqladmin -h server1.example.com -u root password yourrootsqlpassword
Em seguida verifique se o MySQL suporta SSL. Entre no shell MySQL:
mysql -u root -p
Execute:
show variables like '%ssl%';
Se os valores estiverem DISABLED, o MySQL foi compilado com suporte a SSL, mas não está habilitado. Saia do shell:
quit;
Edite /etc/my.cnf e adicione a palavra ssl na seção [mysqld]:
vi /etc/my.cnf
Adicione (exemplo):
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
ssl
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Reinicie o MySQL:
/etc/init.d/mysqld restart
Verifique novamente no shell MySQL:
mysql -u root -p
show variables like '%ssl%';
Saída esperada quando SSL está habilitado:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+---------------+-------+
7 rows in set (0.00 sec)
Saia do shell:
quit;
3 Configurando o master (server1)
Crie diretório de logs binários e ajuste permissões:
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql
3.1 Criando certificados CA / servidor / cliente
Criaremos certificados em /etc/mysql/newcerts:
mkdir -p /etc/mysql/newcerts && cd /etc/mysql/newcerts
Crie a CA:
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
Crie o certificado do servidor:
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
Crie o certificado do cliente (será usado pelo slave):
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
Verifique os arquivos gerados:
ls -l
Exemplo de saída:
total 32
-rw-r--r-- 1 root root 1375 Feb 8 17:37 ca-cert.pem
-rw-r--r-- 1 root root 1679 Feb 8 17:37 ca-key.pem
-rw-r--r-- 1 root root 1119 Feb 8 17:37 client-cert.pem
-rw-r--r-- 1 root root 1675 Feb 8 17:37 client-key.pem
-rw-r--r-- 1 root root 968 Feb 8 17:37 client-req.pem
-rw-r--r-- 1 root root 1119 Feb 8 17:37 server-cert.pem
-rw-r--r-- 1 root root 1679 Feb 8 17:37 server-key.pem
-rw-r--r-- 1 root root 968 Feb 8 17:37 server-req.pem
3.2 Transferindo chaves para o slave
Crie o diretório no slave e copie os arquivos necessários (somente os arquivos de CA e do cliente):
No server2:
mkdir -p /etc/mysql/newcerts
No server1, transfira:
scp /etc/mysql/newcerts/ca-cert.pem [email protected]:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-cert.pem [email protected]:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-key.pem [email protected]:/etc/mysql/newcerts
Nota: mantenha a chave privada do CA (ca-key.pem) apenas no master e em local seguro; não a transfira sem necessidade.
3.3 Configurando SSL no my.cnf do master
Edite /etc/my.cnf e adicione as linhas com ssl-ca, ssl-cert e ssl-key na seção [mysqld]:
vi /etc/my.cnf
Exemplo (adicione junto com ssl):
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/server-cert.pem
ssl-key=/etc/mysql/newcerts/server-key.pem
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = exampledb
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Reinicie o MySQL:
/etc/init.d/mysqld restart
3.4 Criando usuário de replicação com REQUIRE SSL
No master, crie um usuário usado pelo slave. Exemplo:
mysql -u root -p
No prompt MySQL:
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password' REQUIRE SSL;
FLUSH PRIVILEGES;
quit;
Observações:
- A cláusula REQUIRE SSL força conexões encriptadas.
- Se você omitir REQUIRE SSL, conexões não encriptadas também serão aceitas.
- Para alterar um usuário já existente para exigir SSL:
GRANT USAGE ON *.* TO 'slave_user'@'%' REQUIRE SSL;
3.5 Preparando dump consistente do banco exampledb
No master bloqueie as tabelas, verifique o status do master e gere o dump para sincronizar o slave.
mysql -u root -p
No prompt MySQL:
USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
Anote os valores File e Position retornados (por exemplo, mysql-bin.000001 e 3096416). Você precisará deles para indicar o ponto de partida da replicação no slave.
Importante: mantenha a sessão MySQL aberta com o bloqueio até que o dump tenha sido exportado e transferido para o slave.
Abra uma segunda sessão shell enquanto o bloqueio estiver ativo e execute no master:
cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql [email protected]:/tmp
Quando a transferência terminar, volte ao primeiro shell e desbloqueie e saia do MySQL:
UNLOCK TABLES;
quit;
4 Configurando o slave (server2)
No server2, importe o dump e configure o my.cnf do slave.
4.1 Importando o dump
No server2:
mysql -u root -p
No shell do sistema:
cd /tmp
mysql -u root -pyourrootsqlpassword exampledb < snapshot.sql
4.2 Configurando my.cnf do slave
Edite /etc/my.cnf e configure a seção [mysqld] com server-id diferente do master e as opções SSL do cliente:
vi /etc/my.cnf
Adicione/ajuste:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/client-cert.pem
ssl-key=/etc/mysql/newcerts/client-key.pem
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
replicate-do-db = exampledb
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Reinicie o MySQL no slave:
/ etc/init.d/mysqld restart
(Ajuste o caminho se houver espaço extra ou diferenças locais.)
4.3 Configurando a replicação no slave
No servidor slave, informe o master, arquivo e posição anotados antes, e inicie o processo de replicação usando SSL:
mysql -u root -p
No prompt MySQL, execute (substitua MASTER_LOG_FILE e MASTER_LOG_POS pelos valores anotados e ajuste host/port conforme necessário):
CHANGE MASTER TO
MASTER_HOST='192.168.0.100',
MASTER_USER='slave_user',
MASTER_PASSWORD='slave_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=3096416,
MASTER_SSL=1,
MASTER_SSL_CA='/etc/mysql/newcerts/ca-cert.pem',
MASTER_SSL_CERT='/etc/mysql/newcerts/client-cert.pem',
MASTER_SSL_KEY='/etc/mysql/newcerts/client-key.pem';
START SLAVE;
Verifique o status do slave:
SHOW SLAVE STATUS\G
Procure por:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Last_IO_Error / Last_SQL_Error: vazio (ou próximo de vazio)
Se ambos os campos estiverem como Yes, a replicação está funcionando.
5 Verificações e testes
- Insira um registro de teste no master em exampledb e verifique se aparece no slave.
- Confira os logs em /var/log/mysql para erros.
- Em caso de falha, examine Last_IO_Error em SHOW SLAVE STATUS\G para diagnóstico.
6 Resolução de problemas comuns
- Slave_IO_Running = No: geralmente problemas de rede, autenticação ou certificados. Verifique se o slave alcança o master (ping, telnet 3306) e se as credenciais estão corretas.
- SSL handshake falhou: verifique caminhos de certificados, permissões de arquivo e se a CA correta foi usada para assinar ambos os certificados.
- Position mismatch: se o binlog file/position estiverem incorretos, gere um novo dump consistente e repita o processo.
- Firewalls: confirme que portas 3306 (ou outra configurada) estão abertas entre os hosts.
7 Segurança e hardening
- Proteja as chaves privadas (chmod 600 client-key.pem e server-key.pem).
- Não transfira ca-key.pem para o slave; mantenha-o em um local seguro.
- Use TLS/SSL sempre que a rede entre master e slave estiver fora de uma rede confiável.
- Restrinja o usuário de replicação a ON . REPLICATION SLAVE e origens específicas em vez de ‘%’ quando possível.
- Considere rodar MySQL com usuários de sistema não privilegiados (já padrão) e mantenha o sistema atualizado.
Exemplo de permissões:
chown root:mysql /etc/mysql/newcerts/*.pem
chmod 640 /etc/mysql/newcerts/*.pem
chmod 600 /etc/mysql/newcerts/*-key.pem
8 Quando essa solução falha ou não é apropriada
- Ambientes com alta latência e grande volume de escrita podem exigir topologias diferentes (sharding, replication groups).
- Replicação não substitui backups; para proteção contra exclusões acidentais combine com backups regulares e estratégia de retenção.
- Se precisar de tolerância a falhas automática e failover, considere soluções adicionais como MHA, Orchestrator ou Galera Cluster (multi-master sincronizado).
9 Alternativas e considerações arquiteturais
- Replicação assíncrona (padrão): menor latência na escrita do master, mas risco de perda de dados recentes em failover.
- Replicação semi-síncrona: master espera confirmação de pelo menos um slave antes de confirmar a transação — menor risco de perda de dados, com custo de latência.
- Galera Cluster: replicação síncrona multi-master, mais complexa e com requisitos de compatibilidade.
10 Checklist por função
Administrador de sistema:
- Instalar pacotes MySQL
- Configurar system startup e permissões de diretórios
- Abrir portas no firewall
DBA:
- Criar usuário de replicação com REQUIRE SSL
- Gerar dump consistente e verificar File/Position
- Verificar integridade após importação
Segurança/Compliance:
- Proteger chaves privadas (permissões)
- Registrar transferência de chaves e alterações
- Confirmar uso de certificados dentro do período de validade
11 Critérios de aceitação
- Slave_IO_Running = Yes e Slave_SQL_Running = Yes
- Ausência de erros relevantes em Last_IO_Error e Last_SQL_Error
- Dados de teste inseridos no master aparecem no slave
- Comunicação entre master/slave ocorre com SSL (verificação por SHOW SLAVE STATUS ou tcpdump com análise de tráfego encriptado)
12 Testes de aceitação (casos básicos)
- Inserção simples: insert em master → verificar no slave após alguns segundos.
- Exclusão: delete no master → verificar que foi replicado (teste com cuidado).
- Falha de rede: simule perda de conexão e verifique se o slave reconecta ao master quando a rede retornar.
13 Boas práticas operacionais
- Monitorar atrasos usando Seconds_Behind_Master (em SHOW SLAVE STATUS).
- Rotacionar binlogs e ajustar expire_logs_days para evitar ocupar disco.
- Testar restauração e reprovisionamento do slave como parte de um runbook de desastre.
14 Resumo
- Habilite SSL no MySQL, gere CA/servidor/cliente, copie os certificados necessários para o slave e configure master e slave com os parâmetros corretos.
- Proteja as chaves privadas e obrigue REQUIRE SSL para o usuário de replicação quando possível.
- Verifique SHOW SLAVE STATUS\G para confirmar que Slave_IO_Running e Slave_SQL_Running estão ativos.
Importante: teste em ambiente de homologação antes de aplicar em produção.
Materiais semelhantes

Listas de verificação no app Notas: iOS, OS X e iCloud

Easter Eggs do Estádio em Warzone — Guia Season 5

Configurar WiKID com OpenVPN AS

Matriz de Rastreabilidade: guia completo para QA

Como configurar múltiplos monitores
