sábado, 9 de setembro de 2017

Criando Replicação Por BinLog no MySQL

Introdução

A replicação do MySQL é realizada através da reileitura das instruções SQL executadas na Origem para o Destino armazenada nos arquivos de Log. A replicação é controloada por alguns processos do Slave, é muito flexivel, é possivel interrompe-la e inicia-la novamente, provocar um atraso ou até mesmo trocar de papel entre Master e Slave.

A seguir veremos como configurar a forma mais básica de replicação no MySQL.

Arquitetura

A replicação por Log do MySQL é feita através do Slave requisitando os eventos do Master e reaplicando estes eventos no Slave, na arquitetura de replicação temos threads de replicação e arquivos de replicação.

Threads

Referencia: Replication Threads

Master 

BinLog Dump Thread - Esta thread (Master) se comunica com o Slave I/O (slave), é responsável por realizar o lock para leitura do binlog  e entregar os eventos solicitados pela Thread de Slave I/O do destino. Unica thread do lado da origem.

Slave

Slave I/O Thread - Esta thread requisita para o Master os eventos que sua vez os lê do arquivo de Binlog da Origem e escreve no RelayLog do destino (slave).

Slave SQL Thread - Esta thread lê os arquivos dee relay o qual irá refazer as operações da origem no destino.

Arquivos

BinLog - Estes  arquivos existem do lado do Master (Origem), e arquivam todas as operações realizadas na base de dados.

Relay Files - Estes arquivos existem do lado do Slave (Destino), e são as cópias do binlog do Master, estes arquivos são criados e cópiados pelo processo Slave I/O Thread.

Master.info - Arquivo de controle do lado do Slave (Destino), onde é armazenado as configurações necessárias para o slave se conectar no master.

relay-log.info - Arquivo de controle do lado do Slave (Destino), onde é armazenado as informações referente a reconstrução do banco, é utilizado pelo SQL Thread.


Ambiente

Abaixo o ambiente o qual será implementada a replicação por binlog.

Atributo Master Slave
Hostname ol7-mysql57-master1 ol7-mysql-slave1
IP 192.168.1.71 192.168.1.72
ServerID 101 102
Log_Bin /mysql_binlog/mysql /mysql_binlog/mysql
OS Version Red Hat Linux 7.4 Red Hat Linux 7.4
DB Version MySQL 5.7 MySQL 5.7


Pre-Requisito


Parametrização da Instancia

É necessário realizar a configuração dos parametros abaixo, para isto é necessário alterar o arquivo /etc/my.cnf,  adicionando os valores abaixo e realizar o restar da instancia

Master

Parametro Valor
innodb_flush_log_at_trx_commit 1
bind-address                   192.168.1.71
server-id                      101
log_bin                        /mysql_binlog/mysql/ol7-mysql57-master1-bin
sync_binlog                    1

Slave

Parametro Valor
server-id                      102


Criando o usuário para replicação

mysql> CREATE USER 'slave_user'@'%' IDENTIFIED BY 'MySecret123!';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
mysql> FLUSH PRIVILEGES;

Validando:

mysql> select 
from 
information_schema.user_privileges
where
grantee like "%slave%";

Sincronizando as bases

Iniciando a replicação


Master

mysql> FLUSH TABLES WITH READ LOCK;

mysql> SHOW MASTER STATUS;

+--------------------------------+----------+--------------+------------------+-------------------+
| File                           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------------------+----------+--------------+------------------+-------------------+
| ol7-mysql57-master1-bin.000003 |      759 |              |                  |                   |
+--------------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

# mysqldump -u root -p --all-databases --master-data > mysql_dump_replication_20170909.dmp
# scp mysql_dump_replication_20170909.dmp root@ol7-mysql57-slave1:/mysql_dump/replication

mysql> UNLOCK TABLES;

Slave

mysql> CHANGE MASTER TO
             MASTER_HOST='ol7-mysql57-master1',
             MASTER_USER='slave_user',
             MASTER_PASSWORD='MySecret123!',
             MASTER_LOG_FILE='ol7-mysql57-master1-bin.000003',
             MASTER_LOG_POS=759;
# mysql -u root -p < /mysql_dump/replication/mysql_dump_replication_20170909.dmp

start slave;

mysql> show slave status \G;

Nenhum comentário: