|
|||||||
| Wiki | Classificados | Galeria | Reviews | Jogos | Comunidades | RSS Feeds | FAQ | Termos de Uso | Sobre |
| Cadastre-se | Fotos | Blogs | Lista de Membros | Calendário | Pesquisar | Mensagens de Hoje | Marcar Fóruns Como Lidos |
FerramentasPublicidade |
From UnderLinux WikiReplicação de banco de dados MySQL em cadeia
[editar] IntroduçãoReplicaçã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. [editar] 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.
[editar] ConfiguraçãoAssumiremos 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. [editar] Criando ambiente de testesA 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. [editar] Criando usuário para replicaçãoComo 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. [editar] Configuração dos ServidoresAgora 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 [editar] TestandoPara 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.
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.
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.
# 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: [editar] AutorMarcus Vinicius |