Replicação de Mysql
Colaboração: Renato Rudnicki
Data de Publicação: 11 de Maio de 2009
Para quem precisa implementar replicação de mysql, segue o tutorial abaixo. O mesmo foi testado em sistema centos 5.1, como mysql 5.x
Configurando o master
IP MASTER: 192.168.0.199 IP SLAVE: 192.168.0.200 NOME DO DB: teste
- criar senha para mysql
mysqladmin --user=root password dicas-l mysqladmin --user=root --password reload
- criar banco de dados
mysql -u root -p mysql> CREATE DATABASE teste; mysql> use teste; mysql> CREATE TABLE senhas ( usuario text, senha text, uid text, gid text, gecos text, home text, shell text ); mysql -u root -p GRANT REPLICATION SLAVE ON *.* TO 'dicas-l'@'%' IDENTIFIED BY 'dicas-l'; FLUSH PRIVILEGES;
- edite o
/etc/my.cnf
log-bin = /home/mysql/logs/mysql-bin.log binlog-do-db=teste server-id=1
- crie o diretorio
/home/mysql/logs
- crie o arquivo
mysql-bin.log
e mude para dono e grupo do mysqlchown -R mysql.mysql /home/mysql chmod -R 775 /home/mysql /etc/init.d/mysql restart
Configurando o slave
- edite o
/etc/my.cnf
server-id=2 master-host=192.168.0.199 master-connect-retry=60 master-user=dicas-l master-password=dicas-l replicate-do-db=teste relay-log = /var/lib/mysql/slave-relay.log relay-log-index = /var/lib/mysql/slave-relay-log.index
- crie os arquivos
slave-relay.log
eslave-relay-log.index
- mude para dono e grupo do mysql
chown -R mysql.mysql /home/mysql chmod -R 775 /home/mysql /etc/init.d/mysql restart
Configurando o master
mysql -u root -p flush tables with read lock; mysqldump teste -u root -p > /home/database.sql;gzip /home/database.sql; scp /home/database.sql root@192.168.0.200:/home
Configurando o slave
mysql -u root -p create database teste; gunzip /home/database.sql.gz mysql -u root -p teste </home/database.sql
Configurando o master
show master status; +---------------------+----------+--------------+---------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------------+----------+--------------+---------------------+ | mysql-bin.000001 | 21197930 | teste,teste | | +---------------------+----------+--------------+---------------------+
Configurando o slave
mysql -u root -p slave stop; CHANGE MASTER TO MASTER_HOST='192.168.0.199', MASTER_USER='dicas-l', MASTER_PASSWORD='dicas-l', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=21197930; slave start;
Configurando o master
unlock tables;
Configurando o slave
show slave status\G;
Configurando o master e testando
use teste; LOAD DATA INFILE '/etc/passwd' INTO TABLE senhas FIELDS TERMINATED BY ':' ; select * from senhas;
Testando o slave
select * from senhas;
MYSQL MASTER [root@master ~]# cat /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Default to using old password format for compatibility with mysql 3.x # clients (those using the mysqlclient10 compatibility package). old_passwords=1 log-bin=/home/mysql/logs/mysql-bin.log binlog-do-db=teste server-id=1 [mysql.server] user=mysql basedir=/var/lib [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
MYSQL SLAVE
[root@slave home]# cat /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Default to using old password format for compatibility with mysql 3.x # clients (those using the mysqlclient10 compatibility package). old_passwords=1 server-id=2 master-host=192.168.0.199 master-user=dicas-l master-password=dicas-l replicate-do-db=teste relay-log=/var/lib/mysql/slave-relay.log relay-log-index=/var/lib/mysql/slave-relay-log.index [mysql.server] user=mysql basedir=/var/lib [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
Observaçoes
- é importante usar a linha
GRANT REPLICATION SLAVE ON *.* TO 'dicas-l'@'%' IDENTIFIED BY 'dicas-l';
e não a linhaGRANT REPLICATION SLAVE ON tabela.* TO 'dicas-l'@'%' IDENTIFIED BY 'dicas-l';
- é importante seguir a ordem:
slave stop; CHANGE MASTER TO MASTER_HOST='192.168.0.199', MASTER_USER='dicas-l', MASTER_PASSWORD='dicas-l', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=21197930; slave start;
- não se deve apagar dados diretamente no mysql slave, se não, ira quebrar a replicação.
- se quebrar a replicação, deve-se utilizar novamente os comandos abaixo no
server slave:
slave stop; CHANGE MASTER TO MASTER_HOST='192.168.0.199', MASTER_USER='dicas-l', MASTER_PASSWORD='dicas-l', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=21197930; slave start;
- para adicionar mais bancos, configure o
my.cnf
do slave com este parametro: replicate-do-db=teste, novo feito isso, refaça os passos desde o inicio.
Observacoes adicionais
Este tutorial assume que você está montando uma estrutura do inicio, ou seja, os bancos ainda não possuem dados. Caso você precise adicionar um slave de um master que já está em funcionamento, é necessário parar as transações no master ou travar as tabelas, fazer um dump do servidor, e rodar "show master status" para saber qual é a posição e o arquivo de logs corrente do master. Pode-se neste ponto liberar as transações do banco. Após isso carregue o dump no slave, e inicie o slave da seguinte maneira:
mysql> CHANGE MASTER TO -> MASTER_HOST='IP do master', -> MASTER_USER='replica', -> MASTER_PASSWORD='senha', -> MASTER_LOG_FILE='slackware-bin-000002', -> MASTER_LOG_POS=450; mysql> START SLAVE;
MASTER_LOG_FILE
: deve ser configurado com o mesmo nome do arquivo de log
obtido com "show master status". MASTER_LOG_POS
: Posição obtida com "show
master status".
Desta forma o slave será iniciado e irá transferir apenas os logs/transações a partir de determinada posição. Ou seja, o que está faltando desde o momento do dump até o momento corrente.
Uma forma muito interessante se sincronizar os slaves com o master é utilizando LOAD DATA FROM MASTER para copiar os dados do master para o slave. Este comando copia todos os dados do master, restaura no slave e ainda ajusta a posição nos logs. Ou seja, depois da cópia seu slave estará sincronizado com o master e ainda estará com o offset de log sincronizado.
Muito bom para quem quer evitar o trabalho de um dump ou uma cópia
binária. Para evitar inconsistência LOAD DATA FROM MASTER
também faz uso de
FLUSH TABLES WITH READ LOCK
em todas as tabelas. Dessa forma não há
perda de dados.
Para utilização desse comando o usuário de replicação deve possui privilégios SUPER e RELOAD no master. E também precisa privilégio SELECT na tabela que será copiada.
Alguns comandos úteis
# Mostra status do master e informações sobre os arquivos de logs mysql> show master status; # Mostra status do slave mysql> show slave status \G # Para slave mysql> stop slave; # starta slave mysql> start slave; # reseta slave. zera seqüência dos logs binários. mysql> reset slave # Mostra as threads em execucão no servidor. mysql> SHOW PROCESSLIST\G [mysqld] log-bin # Ativa log binário, necessário para cada master binlog-do-db=teste # Especifica para quais bancos devem ser gerados logs binários. # Omita esta opção para gerar logs de todos os bancos. server-id=1 # Id que identifica o servidor. Deve ser único para cada server log-slave-updates # Ativa log-slave-updates . Obrigatório para replicação em cadeia max_allowed_packet = 10M # Aumente max_allowed_packet se vc possui um banco muito grande # Ou ajuste o tamanho dos arquivos de log para não ultrapassar max_allowed_packet master-host = 192.168.0.3 # Ip do server debian/master master-user = replica # usuário para replicação master-password = senha # senha master-port = 3306 # porta utilizada para replicação, padrão=3306
Treinamento on-line gratuito de Introdução ao Slackware Linux
Colaboração: Bruno T. Russo
Gostaria de comunicar à toda comunidade o treinamento de Introdução ao Slackware Linux.
O treinamento é gratuito e será realizado on-line.
Sobre o treinamento
Este é um treinamento introdutório ao Slackware Linux, onde são apresentados os conceitos do Software Livre e a utilização básica do Slackware Linux. São abordados os seguinte tópicos:
- Instalação
- Inicialização do sistema
- Gerenciador de boot
- Usuários e Grupos de Usuários
- Introdução ao SHELL
- Sistemas de Arquivos
- Comandos para manipulação de diretórios
- Comandos para manipulação de arquivos
- Redirecionadores e coringas
- Permissões de arquivos
- Gerenciamento de processos
- Introdução ao VI
- Compactadores
- Instalando e removendo pacotes
- Agendamento de tarefas
- Fundamentos de rede
- Kernel e Módulos
A quem se destina
Iniciantes no universo do GNU/Linux e/ou Software Livre.
Por que fazer este treinamento
- Você irá aprender os conceitos básicos de um Sistema Slackware Linux.
- Você faz o treinamento a hora que quiser e quando puder.
- O treinamento é 100% gratuito.
Endereço eletrônico:
<contato (a) solucaolivre com br>
Bruno Tadeu Russo, é Bacharel em sistemas de Informação, pela Universidade Presbiteriana Mackenzie, e atualmente cursa MBA em gestão de Projetos. Utiliza Linux desde 1999. Atualmente trabalha e uma Consultoria, onde é coordenador de infra-estrutura. Desde 2002 utiliza a distribuição Slackware.