Você está na página 1de 8

Replicao Master-toMaster com MySQL + HA com heartbeat

Essa soluo muito bem aplicada em ambientes que necessitem alta disponibilidade para servio web e banco de dados. Se sua necessidade baseada em MySQL a partir da verso 5.5, leia esse outro post sobre a replicao com MySQL 5.5 e faa a parte do heartbeat a partir deste prprio. O ambiente montado por 2 servidores X (indiferente do hardware utilizado). O Software basicamente um LAMP + heartbeat rodando em Debian e o tempo de configurao deve ser de uns 10 minutos. Existem diversos artigos na internet de ambas solues aplicadas aqui, porm decidi escrever um artigo sobre o assunto para que eu mesmo possa utilizado na posteridade, quando no me lembrar mais do procedimento. Primeiros passos Alm da instalao do sistema LAMP (Linux, Apache, PHP, MySQL) e heartbeat ser necessrio separar 3 IPs fixos, sendo 1 para cada servidor e 1 para utilizao de IP virtual. O IP virtual o IP que ser divulgado; as solicitaes vindas dos peers remotos tero como destino o IP virtual. Desse modo, a mquina que estiver disponvel como master responder s solicitaes. Caso essa mquina se torne indisponvel, a outra assumir automaticamente o IP virtual e passar a responder as solicitaes. No exemplo, utilizarei os IPs 172.0.0.200, 172.0.0.201 e virtual 172.0.0.202. Todas as requisies devem ir para 172.0.0.202. A base de dados se comunica por background, diretamente pelos seus respectivos IPs. Qualquer operao que seja feita em uma, imediatamente replicada para a outra e vice-versa. possvel adicionar slaves tambm para possuir um backup extra, mas no far parte deste artigo.

Os servidores envolvidos sero nomeados aqui (e preferencialmente utilize a mesma denominao em seu ambiente) como node01 e node02. * Configurando o heartbeat Os arquivos de configurao do servio heartbeat ficam em /etc/ha.d. Alguns arquivos no existem, mas basta cri-los com o respectivo contedo. /etc/ha.d/authkeys Seu contedo:
auth 2 2 sha1 test-ha

/etc/ha.d/haresources Nesse arquivo especifica-se o nome do servidor master seguido do IP virtual e do script de reload das variveis de ambiente de trabalho necessrias de se recarregar. Esse script pode ter qualquer nome e deve ficar em /etc/init.d/ como um servio. Seu contedo ser explanado mais adiante.
node01 172.0.0.202 reload_environment.sh

/etc/ha.d/ha.cf Esse arquivo contm as pr-definies do funcionamento do heartbeat.


#arquivo de debug debugfile /var/log/ha-debug #arquivo de log logfile /var/log/ha-log #nivel de log logfacility local0 #tempo de tolerncia keepalive 2 #tempo para considerar como morto deadtime 10 #tempo de warning warntime 10 #diretiva utilizada em tempo de inicializao do heartbeat initdead 30 #... udpport 694 #unicast respectivo ao host oposto; 201 no node01, 200 no node02 ucast eth0 172.0.0.201 # O auto_failback retoma como master automaticamente quando se encontra em condies de faz-lo. Deix-lo como #off far com que retorne somente se o host que assumir como master se perca. auto_failback off # node nodename ... -- must match uname -n node node01 node02 #um host para ping. No caso, o gateway da rede de exemplo. ping 172.0.0.254 #opcional respawn root /usr/lib/heartbeat/ipfail apiauth ipfail gid=root uid=root

apiauth default gid=root apiauth cl_status gid=root

/etc/hostname O nome curto deve aparecer como node01 ou node02. Constate isso com hostname -s. /etc/hosts No experimentei resolver os nomes de outra maneira, ento deixo a recomendao de incluir os IPs reais dos hosts no arquivo de hosts:
172.0.0.200 node01 172.0.0.201 node02

/etc/network/interfaces Configure apenas os IPs reais em ambos os hosts. Por exemplo:


iface eth0 inet static address 172.0.0.200 netmask 255.255.255.0 network 172.0.0.0 broadcast 172.0.0.255 gateway 172.0.0.254

/etc/apache2/ports.conf Nesse arquivo deve-se especificar o IP virtual, tal como abaixo:


NameVirtualHost 172.0.0.202:80 Listen 80

# SSL name based virtual hosts are not yet supported, therefore no # NameVirtualHost statement here Listen 443 /etc/init.d/reload_environment.sh Se preferir, renomeie o arquivo a contento, lembrando que se alterado, no esquea de mudar o nome tambm no arquivo haresources. O contedo desse arquivo para exemplo. No caso, estou fazendo HA para o Asterisk:
#! /bin/sh # /etc/init.d/reload_environment.sh #

# Some things that run always touch /var/lock/reload_environment.sh # Carry out specific functions when asked to by the system case $1 in start)

#para o asterisk /usr/sbin/asterisk -rx restart now #matar o script XXX $(which kill) -9 $(ps ax|egrep XXX.py|egrep -v grep|awk {print $1}) 2>/dev/null exit 0 ;; stop) echo Nothing to do ;; *) echo Usage: /etc/init.d/blah {start|stop} exit 1 ;; esac exit 0 Adeque-o para sua necessidade. Iniciando o HeartBeat Feitas essas configuraes, o servio pode ser iniciado: /etc/init.d/heartbeat start Se tiver algum erro, verifique suas configuraes, os logs e finalmente faa uma busca no google. Se tudo estiver perdido, escreva o problema nos comentrios e __se__ realmente for algo que julgar vlido, escrevo a resposta. Em alguns momentos o IP virtual dever subir na interface eth0 (que foi a utilizada nesse exemplo) do node01. Isso representa o sucesso da operao. Se desejar fazer um teste com o HA, insira em /var/www um arquivo html com o nome do host. Com ambos os hosts em um mesmo switch, a partir de um client acesse o IP virtual e veja o nome de host que aparece; faa refreshs a vontade. Enquanto isso, pea a algum que remova o cabo do node que estiver sendo exibido durante seus refreshs. O IP virtual subir no outro node. No arquivo ha.cf voc poder ento mudar o tempo de vida conforme desejado, para mais ou para menos, mas tudo depender da aplicao que pretende rodar em seu ambiente. Fatores como qualidade de rede fsica e lgica tambm podem influenciar. Configurando o MySQL para Master-to-Master O MySQL impressionante por sua facilidade de configurao. Alm de estar toda concentrada no arquivo /etc/mysql/my.cnf, no necessrio instalar nenhum pacote adicional para a tarefa. No estou certo de que posso ser claro na explicao dos parmetros, mas seguramente uma configurao funcional. Seu

contedo:
#padrao [client] port = 3306 socket = /var/run/mysqld/mysqld.sock

[mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] # # * Basic Settings # user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp language = /usr/share/mysql/english skip-external-locking # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1 # # * Fine Tuning # key_buffer = 16M max_allowed_packet = 16M thread_stack = 128K thread_cache_size = 8 # This replaces the startup script and checks MyISAM tables if needed # the first time they are touched myisam-recover = BACKUP #max_connections = 100 #table_cache = 64 #thread_concurrency = 10 # # * Query Cache Configuration # query_cache_limit = 1M query_cache_size = 16M # # * Logging and Replication # # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. #log = /var/log/mysql/mysql.log #

# Error logging goes to syslog. This is a Debian improvement # # Here you can see queries with especially long duration #log_slow_queries = /var/log/mysql/mysql-slow.log #long_query_time = 2 #log-queries-not-using-indexes # # The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. #configuracoes para o servico #no node02 utilize 2 e no node01 utilize 1 no server-id server-id = 2 replicate-same-server-id= 0 auto-increment-increment= 2 auto-increment-offset = 2 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 500M #bases que nao serao replicadas devem ser explicitamente ignoradas binlog_ignore_db = mysql #bases a replicar binlog_do_db = asterisk replicate-do-db = asterisk binlog_do_db = base_2 replicate-do-db = base_2 binlog_do_db = base_3 replicate-do-db = base_3 binlog_do_db = base_n replicate-do-db = base_n #o master para o nodeX o outro node master-host = 172.0.0.201 #sugestao: replicar com o mesmo usuario e senha para facilitar a configuracao master-user = replicador master-password = escravo master-connect-retry = 60 # # * BerkeleyDB # # Using BerkeleyDB is now discouraged as its support will

cease in 5.1.12. skip-bdb [mysqldump] quick quote-names max_allowed_packet = 16M [mysql] #no-auto-rehash # faster start of mysql but no tab completition [isamchk] key_buffer = 16M
# # * IMPORTANT: Additional settings that can override those from this file! # The files must end with '.cnf', otherwise they'll be ignored. # !includedir /etc/mysql/conf.d/

Terminada a configurao do my.cnf, deve-se ainda executar a permisso para o usurio de replicao. Algo como isto funciona bem:
mysql> grant all privileges on *.* to replicador@'%' identified by 'escravo';

Pode ser necessrio (porque tenho certeza de que funcionou sem, mas j tive que faz-lo) utilizar um comando para levantar o slave:
mysql> start slave;

A partir de ento, pode-se testar fazendo um insert em qualquer um dos nodes e verificando sua insero no outro e vice-versa. Alguns problemas podem ser resolvidos a partir desses documentos: http://dev.mysql.com/doc/refman/4.1/pt/replication-problems.html http://dev.mysql.com/doc/refman/4.1/pt/replication-faq.html Alguns comandos tambm podem auxiliar em diagnsticos e informaes, como:
show slave statusG; show master statusG; show processlist;

O comando show slave statusG dever retornar em seu primeiro campo a informao:
Slave_IO_State: Waiting for master to send event

E mais abaixo, outras duas informaes essenciais:


Slave_IO_Running: Yes Slave_SQL_Running: Yes

Infelizmente invivel explicar todos os parmetros, todos os comandos diagnsticos, aes a tomar em casos de falhas etc, mas ao menos voc poder iniciar um projeto de replicao com HA a partir de um ambiente funcional e os avanos dependero apenas de voc.