Visite também: Br-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]
Voltar   Under-Linux.org Fóruns > UnderLinux Wiki
Wiki Classificados Galeria Reviews Jogos Comunidades RSS Feeds FAQ Termos de Uso Sobre
Cadastre-se FotosBlogs Lista de Membros Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Ferramentas pessoais
Publicidade

From UnderLinux Wiki

Replicação de banco de dados MySQL em cadeia

Tabela de conteúdo

Introdução

Replicação de banco é a capacidade de bancos de dados em um servidor MySQL serem duplicados para outros servidores. Ela tem o objetivo de aumentar a velocidade e confiabilidade de uma estrutura de banco de dados. Neste tutorial irei mostrar como configurar servidores de banco MySQL com Replicação em cadeia/anel. Utilizada, por exemplo, em estrutura de dados geagraficamente distribuidos.

Exemplos

O MySQL permite diversos tipos de replicação. Pode-se por exemplo utilizar diversas máquinas em uma rede trabalhando como servidores de banco de dados, todas com o mesmo conteúdo, e balancear as requisições de consultas entre esses servidores a fim de aumentar a velocidade. Em caso de problemas críticos com o servidor master, pode-ser redirecionar todo o tráfego para os slaves a fim de manter o serviço em funcionamento sem interrupções , enquanto se faz uma manutenção no servidor master.

Um slave também pode ser master de outro master ou slave. Em uma replicação em "cadeia fechada" podemos ter o seguinte cenário:

server1 ==> server2 ==> server3 ==> server4 ==> server5 ==> server1

==> indica qual é o servidor master para o slave em questão. No exemplo acima a cadeia está sendo "fechada" em server1 .

Essa estrutura pode ser utilizada para aplicações distribuídas geograficamente. Uma alteração em algum servidor da cadeia, será replicada para outros servidores espalhados geograficamente. E as consultas podem ser direcionadas para o servidor mais próximo.

Podemos também aplicar um algoritimos externo para redirecionar as consultas para um dos servidores com maior disponibilidade num determinado momento. Caso algum servidor precise de manutenção, podemos retirar ele do "anel" e quando ele voltar, ele "puxa" todas as transações do master do ponto onde parou.

Configuração

Assumiremos neste tutorial que temos 3 servidores de banco de dados rodando linux. Podem ser utilizados mais servidores dependendo de suas necessidades. Seguem as denominações e características hipotéticas de cada um:

Hostname: slackware
IP address: 192.168.0.1
V. MySQL: 4.1

Hostname: kurumin
IP address: 192.168.0.2
V. MySQL: 4.1

Hostname: debian
IP address: 192.168.0.3
V. MySQL: 4.1

Esquema geral:

------------------------------------------------------
|                                                    |
| slackware ==> debian ==> kurumin ==> slackware     |
|                                                    |
------------------------------------------------------

Todo servidor terá um slave e um master obrigatoriamente. Não será abordada a instalação do Mysql.

Criando ambiente de testes

A primeira coisa que iremos fazer é criar uma base de dados e tabela de teste. Execute os comandos abaixo em cada um dos servidores:

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 );

Pode-se criar a tabela de teste depois de configurada a replicação. Neste caso pode-se acessar qualquer servidor e rodar a query acima, que a criação da tabela será replicada para os demais servidores. Neste tutorial criamos a tabela antes da replicação.

Criando usuário para replicação

Como todas as máquinas serão master e slave de algum servidor é necessário criar um usuário de replicação em cada servidor. Então execute os comandos abaixo para cada server:

mysql> GRANT REPLICATION SLAVE,SUPER,RELOAD ON *.* TO replica@'%' IDENTIFIED BY 'senha';

Com isso criamos um usuário chamado "replica" com a senha "senha" e com os privilégios "REPLICATION SLAVE,SUPER,RELOAD". Na prática somente o privilégio REPLICATION SLAVE é necessário. Adicionei também os privilégios SUPER e RELOAD para utilizar o comando "LOAD DATA FROM MASTER", por exemplo.

Configuração dos Servidores

Agora vamos as configurações dos servidores através do my.cnf Seguem abaixo as configurações necessárias para cada servidor com uma breve descrição de cada diretiva. Adicione estas configurações na sessão [mysqld] de cada my.cnf: Server slackware:

[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

Server kurumin:

[mysqld]
...
log-bin
binlog-do-db=teste
server-id=2
log-slave-updates
max_allowed_packet = 10M

master-host     =  192.168.0.1 # Ip do server slack/master
master-user     =  replica
master-password =   senha
master-port     =  3306
...

Server debian:

[mysqld]
...
log-bin
binlog-do-db=teste
server-id=3
log-slave-updates
max_allowed_packet = 10M

master-host     =  192.168.0.2 # Ip do server kurumin/master
master-user     =  replica
master-password =   senha
master-port     =  3306
...

Restarte os 3 servidores

/usr/local/mysql/support-files/mysql.server restart

Neste ponto a replicação já deve estar ocorrendo. Caso não esteja, logue no MySQL de cada slave e digite o seguinte comando:

mysql> start slave;

Para confirmar se está tudo funcionando digite o comando:

mysql> show slave status\G

Observe as linhas Slave_IO_Running e Slave_SQL_Running E também Slave_IO_State

Testando

Para testar acesse qualquer um dos servidores e insira algum registro na tabela de teste.

mysql> use teste;
mysql> LOAD DATA INFILE '/etc/passwd' INTO TABLE senhas FIELDS TERMINATED BY ':' ;

Pronto, veja no MySQL dos outros servidores se os dados estão sincronizados.


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.


Neste tutorial não passarei mais detalhes sobre esta implementação. No link de referência abaixo pode ser encontrado mais detalhes.


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

Links úteis:
Logs binários: http://mysql.org/doc/refman/4.1/en/binary-log.html
Replicação: http://mysql.org/doc/refman/4.1/en/replication.html

Autor

Marcus Vinicius

Horários baseados na GMT -3. Agora são 14:22.


Powered by vBulletin®
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd
SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.