Guia de tecnologias

Como configurar replicação MySQL com criptografia SSL no CentOS 5.4

8 min read MySQL Atualizado 17 Oct 2025
Replicação MySQL com SSL no CentOS 5.4
Replicação MySQL com 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.

Autor
Edição

Materiais semelhantes

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

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

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

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

Configurar WiKID com OpenVPN AS
Segurança

Configurar WiKID com OpenVPN AS

Matriz de Rastreabilidade: guia completo para QA
Qualidade de Software

Matriz de Rastreabilidade: guia completo para QA

Como configurar múltiplos monitores
Hardware

Como configurar múltiplos monitores

Instalar OpenLiteSpeed, MariaDB e PHP 7.4 no CentOS 8
Tutorial

Instalar OpenLiteSpeed, MariaDB e PHP 7.4 no CentOS 8