Dev & EngARTIGO

Replicação MySQL em 5 minutos

Configurar a replicação do MySQL é extremamente simples. Este artigo demonstra como criar em minutos um master replicando para um slave.

Configurar a replicação do MySQLMySQL8 conteúdosMySQL + Adminer + Docker Compose: montando rapidamente um ambiente para usoData · abr 2019Banco de dados MYSQL no PHPStormDev (Back & Front) · jul 2019Criando um ambiente de desenvolvimento PHP mínimo com Docker – Parte 3Dev (Back & Front) · out 2019Ver tudo em Data é extremamente simples. Este artigo demonstra como criar em minutos um master replicando para um slave.

A replicação é um recurso nativo do MySQL e tem vários usos, tais como como backup, alta-disponibilidade, redundância e distribuição geográfica de dados, escalabilidade horizontal, entre outros.

Para este teste simples, vamos usar o LinuxLinux34 conteúdosKali Linux em um Servidor VPS: como, quando e por que usar?DevSecOps · dez 2024Construindo um Windows Service ou Linux Daemon com Worker Service & .NET Core – Parte 2Dev (Back & Front) · jul 2020Criando uma WebApi utilizando .NET, Linux e VSCodeDev (Back & Front) · ago 2019Ver tudo em DevSecOps e configurar a replicação no MySQL 5.6 entre duas instâncias: uma master e outra slave. Serão criadas duas instâncias MySQL a partir do zero, ou seja, sem dados. Elas estarão na mesma máquina, mas respondendo em portas diferentes: 3310 e 3311.

O único pré-requisito é ter o MySQL 5.6 instalado.

  • Caso o tenha instalado, basta usar o caminho onde está o bin/mysqld como basedir nos passos abaixo. Por exemplo, no Oracle Linux 7 ou RHEL 7 o binário fica em /usr/sbin/mysqld, portanto basedir=/usr;
  • Caso ainda não tenha os binários do MySQL 5.6, basta baixar o arquivo TAR e descompactar em algum diretório conveniente que será seu basedir, como por exemplo /opt/mysql/mysql-5.6:
# mkdir /opt/mysql
# cd /opt/mysql
# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz
# tar xvzf mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz
# rm mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz
# mv mysql-5.6.23-linux-glibc2.5-x86_64 mysql-5.6
  • Observações: neste caso considere para os passos abaixo basedir=/opt/mysql/mysql-5.6; tente trabalhar sempre com as versões mais recentes – substitua 5.6.23 nos comandos acima caso outra mais atual esteja disponível em http://dev.mysql.com/downloads/mysql.

Para um tutorial completo de como criar uma VM com MySQL para testes, veja aqui.

Replicação simples
  • Crie uma instância para ser o Master:
# mkdir /opt/mysql/master /opt/mysql/master/data /opt/mysql/master/tmp
# cd /opt/mysql/master
# nano master.cnf
[client]
port=3310
socket=/opt/mysql/master/tmp/my-master.sock

[mysql] 
prompt=master>\\_

[mysqld]
server-id=10
port=3310
basedir=/usr
datadir=/opt/mysql/master/data
socket=/opt/mysql/master/tmp/my-master.sock
log-bin=master-bin.log
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# chown mysql:mysql *
# /usr/bin/mysql_install_db --defaults-file=/opt/mysql/master/master.cnf --user=mysql
  • Inicie e teste a nova instância:
# /usr/bin/mysqld_safe --defaults-file=/opt/mysql/master/master.cnf &
# mysql --defaults-file=/opt/mysql/master/master.cnf -uroot -p
master> SHOW VARIABLES LIKE 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3310  |
+---------------+-------+

Observação: quando necessário, para parar o processo MySQL, faça um shutdown limpo:

# mysqladmin --defaults-file=/opt/mysql/master/master.cnf -uroot –p shutdown
  • Abra outro terminal e crie outra instância para ser o Slave:
# mkdir /opt/mysql/slave /opt/mysql/slave/data /opt/mysql/slave/tmp
# cd /opt/mysql/slave
# nano slave.cnf
[client]
port=3311
socket=/opt/mysql/slave/tmp/my-slave.sock

[mysql] 
prompt=slave>\\_

[mysqld]
server-id=11
port=3311
basedir=/usr
datadir=/opt/mysql/slave/data
socket=/opt/mysql/slave/tmp/my-slave.sock
log-bin=slave-bin.log
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# chown mysql:mysql *
# /usr/bin/mysql_install_db --defaults-file=/opt/mysql/slave/slave.cnf --user=mysql
  • Inicie e teste a nova instância:
# /usr/bin/mysqld_safe --defaults-file=/opt/mysql/slave/slave.cnf &
# mysql --defaults-file=/opt/mysql/slave/slave.cnf -uroot -p
slave> SHOW VARIABLES LIKE 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3311  |
+---------------+-------+
  • Agora que temos duas instâncias com server-id’s diferentes e log-bin habilitado, crie um usuário na instância master para que a slave consiga conectar-se a ela:
master> CREATE USER repl_user@127.0.0.1;
master> GRANT REPLICATION SLAVE ON *.* TO repl_user@127.0.0.1 IDENTIFIED BY 'repl_user_password';

Observação: em uma instalação real, a instância slave provavelmente estará em outro host – substitua 127.0.0.1 pelo IP do host onde está sua instância slave.

  • Antes de iniciar a replicação, verifique o status no master:
master> SHOW MASTER STATUS \G
*************************** 1. row ***************************
             File: master-bin.000003
         Position: 433
  • Use os dados do status acima e inicie a replicação no slave:
slave> CHANGE MASTER TO 
    MASTER_HOST='127.0.0.1', 
    MASTER_PORT=3310, 
    MASTER_USER='repl_user',
    MASTER_PASSWORD='repl_user_password',
    MASTER_LOG_FILE='master-bin.000003',
    MASTER_LOG_POS=433;
slave> START SLAVE;
  • Teste básico:
master> CREATE DATABASE teste_repl;
master> CREATE TABLE teste_repl.simples (id INT NOT NULL PRIMARY KEY);
master> INSERT INTO teste_repl.simples VALUES (999),(1),(20),(5);

slave> SELECT * FROM teste_repl.simples;
Conclusão

Como vimos, é muito simples fazer funcionar a replicação no MySQL. Mais adiante veremos opções mais avançadas para tornar a replicação mais resiliente a erros (crash-safe) e implementar failover automático.

Referências

é consultor MySQL da Oracle Brasil. Possui formação em Ciência da Computação pela Universidade Federal de Itajubá e especialização em Engenharia de Software baseada em SOA pelo IBTA. Há mais de 10 anos está envolvido com diversas tecnologias Open Source relacionadas principalmente ao universo Web.

Mais de Airton Lastori
Ver perfil