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;

Alterando o Datadir no MySQL

Por padrão os arquivos de dados do MySQL são criados no diretório /var/lib/mysql, no momento da instalação os bancos de dados, diretórios e arquivos são criados e ficam hospeados neste local, porém em grandes ambientes onde a administração é feita por mais de uma pessoa, e existem pessoas e papeis distintos essa configuração pode não ser a melhor, pois o diretório /var é responsabilidade do Sysadmin, neste tutorial vamos alterar o datadir, que é a variável de sistema que controla o direcionamento dos arquivos de dados do MySQL.

De Para


De:    /var/lib/mysql
Para:  /mysql_datadir/databases


1. Owner e grupo


O owner e o grupo do diretório de destino devem ser obrigatóriamente mysql:mysql


2. SE Linux


Esse foi um ponto que eu me atrapalhei muito, o SE Linux é uma feature do Linux que permite fazer o controle de acesso baseado em politicas, portanto se o SELinux estiver habilitado fará com que o MySQL não consiga escrever no Datadir fora do /var/lib/mysql, temos duas saidas, desabilitar o SELinux ou configurar a permissões necessárias para  escrita do MySQL no novo diretorio.


2.1 Verificando se o SELinux esta habilitado:


[root@ol7-mysql57-slave1 mysql_datadir]# getenforce
Enforcing
[root@ol7-mysql57-slave1 mysql_datadir]#

Portanto o SE Linux esta habilitado.


2.2 Desabilitando o SE Linux:


Editar o arquivo /etc/selinux/config configurando a variavel, SELINUX para disabled e reinciar o servidor:

[root@ol7-mysql57-slave1 mysql_datadir]# cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

2.3 Configurando o SE Linux:


O seguinte artigo resolveu todos os meus problemas e escrive esta pagina baseado nele, blogs.oracle.com/jsmyth/selinux-and-mysql.

Até onde eu entendi o SELinux funciona através de grupos ou objetos, esses um usuário ou grupo de usuários possuem permissões em objetos, assim além da permissão no diretório ou arquivo precisamos configurar a lista de acesso no SE linux.

O comando semanage é o utilitário para escrever as politicas no arquivo de contexto sem a necessidade edita-lo manualmente, para no caso utlizaremos o comando:

semanage fcontext -a -t mysqld_db_t "/mysql_datadir/databases(/.*)?"

Na sequencia devemos forçar a reileitura dos arquivos e diretório (objetos) conforme a politica aplicada no arquivo de contexto, após esse comando é necessário realizar o boot do servidor:

restorecon -Rv /mysql_datadir/databases

Podemos configurar os arquivos sem necessidade de boot com o comando chcon conforme abaixo:

chcon -Rt mysqld_db_t /mysql_datadir/databases
chcon -Ru system_u /mysql_datadir/databases


Outros objetos do SELinux:


Objeto Funcionalidade
mysqld_port_t Porta TCP
mysqld_db_t Arquivos de dados
mysqld_etc_t Arquivo de inicialização
mysqld_log_t Arquivos de Log

Portanto com o SELinux habilitado para alterar qualquer caracteristica padrãod o MySQL devemos configurar estes objetos dentro do SELinux conforme desejado.


3. Movendo o Datadir


3.1 Parar o mysql


service mysqld stop

3.2 Copiar os arquivos de origem para o destino:


rsync -vhrog /var/lib/mysql/* /mysql_datadir/databases

3.3 Editar o arquivo /etc/my.cnf


De:     datadir=/var/lib/mysql
Para:   datadir=/mysql_datadir/databases

3.4 Iniciar o MySQL


service mysqld start


3.5 Para validar:


mysql -u root -p
show variables like "%DATA%";

mysql> show variables like "%DATADIR%";
+---------------+---------------------------+
| Variable_name | Value                     |
+---------------+---------------------------+
| datadir       | /mysql_datadir/databases/ |
+---------------+---------------------------+
1 row in set (0.01 sec)

mysql> 

Instalando MySQL 5.7 no Oracle Linux 7

A seguir o processo de instalação do MySQL 5.7 em distribuição baseada em Red Hat Linux 7.

Ambiente:

Oracle Linux 7.4 - Instalação servidor básico com Gnome.
MySQL 5.7 Community

Introdução


1. Download


MySQL Community Download

O Metodo de instação escolhido foi a instalação a partir de pacotes RPM os quais podem ser obtidos através da pagina de Download do MySQL, também poderia ter feito a instalação por repositorio e utilizado o yum ou através de uma cópia dos binários com make.

2. Instalação


A instalação minima requer 3 pacotes:

mysql-community-common-5.7.19-1.el7.x86_64.rpm
mysql-community-client-5.7.19-1.el7.x86_64.rpm
mysql-community-server-5.7.19-1.el7.x86_64.rpm

Para instalar basta executar o comando rpm -Uvh para cada pacote:
















A instalação incialmente irá criar um usuário mysql e um grupo do mesmo nome, irá criar a estrutura de diretório conforme abaixo e irá salvar uma senha temporária no arquivo de error log em vez do arquivo /etc/.my_secret como era até no mysql 5.6.

Diretório Conteúdo
/usr/bin Client Program and Scripts
/usr/sbin Mysqld server
/var/lib/mysql Log files, database files, parameter file
/usr/share/info Manual
/usr/share/man Unix man pages
/usr/lib/mysql Biblioteca Mysql
/usr/share/sql-bench Benchmarks


3. Iniciando o MySQL


O Deamon do MySQL instancia no Linux como um serviço, a partir do Red Hat 7 podemos então usar duas ferramentas para inicia-lo, o antigo service e o systemctl, segue os comandos e exemplo:

service mysqld status
service mysqld start
service mysqld stop

systemctl status mysqld
systemctl start   mysqld
systemctl stop   mysqld






















Pós-Instalação


É recomendado que seja configurada a instalação segura do MySQL, o qual irá trocar a senha do root, bloquear o login remoto deste, exclui o usuario anonimo e remove o banco de teste.

Seguem os passos:

Localizando a senha inicial do root.

Até o MySQL 5.6 a senha se encotrava no /etc/.my_secret, porém no 5.7 a senha é encontrada no log error, /var/log/mysqld.log, para localiza-la:

grep 'temporary password' /var/log/mysqld.log

Com a senha inicial do root, basta executar o script mysql_secure_installation.

Ultimo passo como boas praticas é fazer load das tabelas de time zone do MySQL, caso contrário teremos apenas o time zone em numeral, não sendo possivel identificar a forma literal do time zone:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Liberar as regras de firewall:

iptables -I INPUT -p udp --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 --syn -j ACCEPT

Por ultimo podemos checar se há algum novo update antes de configurar o MySQL para produção.

yum update mysql


Valeu galera, ainda to iniciando no MySQL qualquer erro por favor me ajudem a indetifica-lo.