Réplicas de leitura MySQL usando Docker

Há algum tempo atrás a implementação de replicação de banco de dados era uma tarefa trabalhosa, particularmente em termos de configuração e instalação de servidores de banco de dados. Graças ao Docker, essa tarefa que antes levava no mínimo algumas horas, agora pode ser concluída em menos de uma hora.

Vejamos os passos necessários para ter dois servidores de banco de dados, um master e um slave, configurados de forma a fazer replicação, como ilustrado na figura abaixo.

Configuração do master

Nest exemplo, cada banco de dados será uma instância Docker MySQL proveniente da imagem oficial MySQL (https://hub.docker.com/_/mysql), que consiste em uma instalação do MySQL no Debian.

Após fazer o download da imagem é necessário executar as instâncias. Neste caso serão duas, a master e a slave.

O comando para executar a instância master é o seguinte:

docker run --name mysql-master --volume=/Users/test/storage/docker/mysql-datadir-master:/var/lib/mysql -v /Users/test/storage/config/mysql-master:/etc/mysql/conf.d  -p 3306:3306 -e MYSQL_ROOT_PASSWORD=[PASSWORD] -d mysql:latest

O comando inicia uma instância chamada mysql-master e faz o mapeamento de dois volumes (diretórios). Como será necessário sobrescrever algumas configurações do MySQL, um dos diretórios mapeados é o diretório local /Users/test/storage/config/mysql-master para o /etc/mysql/conf.d. O diretório /etc/mysql/conf.d contém os arquivos de configuração do MySQL e esse mapeamento será utilizado para sobrescrever as configurações necessárias. Além disso, foi feito o mapeamento da porta 3306 da instância Docker para a porta 3306 da máquina local.

Agora que a instância mysql-master está pronta, pode-se acessar o servidor e criar o schema que será replicado. Depois da criação do schema é preciso configurar a replicação no arquivo /etc/mysql/my.cnf. Essa configuração será feita por meio do mapeamento para o diretório /etc/mysql/conf.d, pois os arquivos desse diretório sobrescreverão as configurações do MySQL.

O arquivo master-config-file.cnf foi criado dentro do diretório /Users/test/storage/config/mysql-master. Esse arquivo identifica o servidor de banco de dados definindo o server-id e diz onde registrar as alterações que serão lidas pelo slave por meio da configuração log_bin. Além disso, o schema a ser replicado é definido em binlog_do_db.

master-config-file.cnf

[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = mydb

Depois de configurar o servidor do banco de dados, falta ainda autorizar o acesso de outro banco de dados para replicar os dados. Para fazer isso, é necessário acessar o MySQL e executar os seguintes comandos*:

mysql -u root -p

mysql> GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' IDENTIFIED BY 'root’;

mysql> FLUSH PRIVILEGES;

mysql> use mydb;

mysql> FLUSH TABLES WITH READ LOCK;

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      589 | mydb         |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

O último comando mostra o arquivo e a posição em que o slave deve procurar os dados a serem replicados. Eles serão utilizados na configuração dos slaves. Para as configurações surtirem efeito é necessário reiniciar o master.

Configuração do slave

A configuração do slave é muito semelhante ao master. Será necessário executar uma instância slave e definir também um mapeamento para o arquivo de configuração.

docker run --name mysql-slave1 --volume=/Users/test/storage/docker/mysql-datadir-slave1:/var/lib/mysql -v /Users/test/storage/config/mysql-slave1:/etc/mysql/conf.d  -p 3307:3306 -e MYSQL_ROOT_PASSWORD=[PASSWORD] -d mysql:latest

O arquivo de configuração define, além do server-id, o log_bin (o local do arquivo contendo as alterações no master) e o binlog_do_db (o schema a ser replicado).

[mysqld]
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = mydb

Agora que a instância slave está pronta e o arquivo de configuração do banco de dados está definido, falta mudar o MySQL para se tornar de fato um slave. Para isso, basta se conectar ao MySQL e executar o comando abaixo utilizando o nome do arquivo e a posição em que o slave deve procurar no master para encontrar os dados a serem replicados (MASTER_LOG_FILE e MASTER_LOG_POS).

CHANGE MASTER TO MASTER_HOST=‘MASTER_HOST_IP',MASTER_USER=‘[USER]', MASTER_PASSWORD=‘[PASSWORD]', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=589;

Após reiniciar o slave, toda a alteração feita no master será replicada no slave. Para ter mais slaves, basta configurar mais slaves seguindo as instruções para configuração do slave.

*Para acessar o terminal da instância utiliza-se o comando docker exec -it instance-name bash

Leave a Reply

Your email address will not be published. Required fields are marked *