Multi Master Replication Manager (MMM)

By | October 2, 2010

UPDATE: Acho que arrumei a formatação. Deve estar legível agora.
!!!ATENÇÃO – A visualização de algumas sessões pode estar truncando conteúdo! Pelo jeito a tag <pre> tá quebrada. Preciso olhar isso, mas preguiça, né? Dá pra ler direitinho usando o RSS !!!!

Mesmo com a a infra-estrutura toda virtualizada e clusterizada nos ESXi fazer um cluster de MySQL ainda é uma boa idéia.

Não só você pode colocar as duas máquinas em storages diferentes e eliminar mais um ponto de falha mas também você pode dedicar uma (ou mais) VM(s) para read-only.

Isso quer dizer que seus usuários rodando reports e chamando estatísticas/gráficos no meio do dia não vão afetar o desempenho de quem está entrando operações em produção.

Isso dito entra em cena o MySQL Multi Master Replication Manager (MMM): Um conjunto de scripts Perl que facilita a replicação e gerenciamento do seu cluster MySQL.

Abaixo os passos que utilizei para criar um cluster de 2 máquinas CentOS 5.5. Vou assumir que você já tem as máquinas em pé com MySQL devidamente instalado.

Além das máquinas rodando o MySQL você vai precisar de uma terceira, que é o monitor. É esse cara que vai manter os olhos no cluster, decidir quando uma máquina morreu e gerenciar os papéis de cada uma.

Nem idéia ainda dos requisitos mínimos desse servidor, visto que apenas fiz um teste pequeno aqui. Mas tá rodando sem reclamar em 1 processador e 512 de RAM.

Cenário:

IP Leitura/Gravação MySQL -> 10.0.0.1

IP Somente Leitura MySQL -> 10.0.0.100

IP Servidor MySQL 1 (hostname master) -> 10.0.0.2

IP Servidor MySQL 2 (hostname master2) -> 10.0.0.3

IP Monitor (hostname mon) -> 10.0.0.10

Editando a configuração do MySQL:

Em cada um dos servidores adicione as seguintes linhas embaixo da sessão [mysqld] do /etc/my.cnf:

#MMM
read-only
replicate-ignore-db = mysql
binlog-ignore-db = mysql
log-bin=master-binary
relay-log=master-relay
server-id=2
Atenção!! master (ali no log-bin e relay-bin) é o HOSTNAME da máquina em questão. Então no meu caso no outro servidor o arquivo receberá as linhas:
#MMM
read-only
replicate-ignore-db = mysql
binlog-ignore-db = mysql
log-bin=master2-binary
relay-log=master2-relay
server-id=2
Isso vai evitar que mudanças sejam feitas no banco de dados mysql e também define um nome único para os logs que vamos usar mais tarde.
Não esqueça do restart no serviço.

Instalando o MMM:

Não sei vocês, mas já passei da idade de compilar pacote na mão. Eu instalo a EPEL e já era.
Nos servidores MySQL:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
yum -y install perl-Algorithm-Diff perl-Class-Singleton perl-DBD-MySQL perl-Log-Log4perl perl-Log-Dispatch perl-Proc-Daemon perl-MailTools
yum install mysql-mmm.noarch mysql-mmm-agent.noarch mysql-mmm-tools.noarch

Configurando os Usuários:

Dentro de cada servidor precisamos criar 3 usuários: replication, agent e monitor. Abra seu console do MySQL e mande:

GRANT REPLICATION CLIENT                 ON *.* TO 'mmm_monitor'@'10.0.0.%' IDENTIFIED BY 'monitor_password';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'10.0.0.%'   IDENTIFIED BY 'agent_password';
GRANT REPLICATION SLAVE                  ON *.* TO 'replication'@'10.0.0.%' IDENTIFIED BY 'replication_password';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;

Abra duas sessões (uma em cada MySQL) e não as feche depois de rodar os comandos acima. Com eles executados faça a seguir:

SHOW MASTER STATUS;

E o resultado vai ser algo como:

mysql> SHOW MASTER STATUS;
+-----------------------+----------+--------------+------------------+
| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------------+----------+--------------+------------------+
| master2-binary.000003 |       98 |              | mysql            |
+-----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql>

Você vai usar essa informação nos comandos abaixo. Note que você deve utilizar o output da execução em uma máquina no input da outra, de forma que crie uma cross-reference entre elas:

change master to master_host = '10.0.0.3', master_user='replication', master_password='replication_password', master_log_file='master2-binary.000001', master_log_pos=98;

A seguir vamos editar o /etc/mysql-mmm/mmm_common.conf:

active_master_role      writer

<host default>
    cluster_interface       eth1
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid
    bin_path                /usr/libexec/mysql-mmm/
    replication_user        replication
    replication_password    replication_password
    agent_user              mmm_agent
    agent_password          agent_password
</host>

<host master>
    ip      10.0.0.2
    mode    master
    peer    master2
</host>

<host master2>
    ip      10.0.0.3
    mode    master
    peer    master
</host>

<role writer>
    hosts   master,master2
    ips     10.0.0.1
    mode    exclusive
</role>

<role reader>
    hosts   master,master2
    ips     10.0.0.100
    mode    balanced
</role>

Este arquivo deve ser exatamente o mesmo nos dois lados do cluster!

E só fica faltando agora editar o /etc/mysql-mmm/mmm_agent.conf:

include mmm_common.conf
this master
A variável “this” indica o hostname. Portanto no meu caso o outro servidor vai ter um “this master2”

Com tudo isso pronto vamos no servidor de monitoramento e fazemos:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
yum install mysql-mmm-monitor.noarch

Copiamos nele também o /etc/mysql-mmm/mmm_common.conf.

E depois editamos o /etc/mysql-mmm/mmm_mon.conf:

<monitor>
    ip                  127.0.0.1
    pid_path            /var/run/mysql-mmm/mmm_mond.pid
    bin_path            /usr/libexec/mysql-mmm
    status_path         /var/lib/mysql-mmm/mmm_mond.status
    ping_ips            10.0.0.1,10.0.0.2,10.0.0.3,10.0.0.100
    auto_set_online     60

    # The kill_host_bin does not exist by default, though the monitor will
    # throw a warning about it missing.  See the section 5.10 "Kill Host
    # Functionality" in the PDF documentation.
    #
    # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host
    #
</monitor>

<host default>
    monitor_user        mmm_monitor
    monitor_password    monitor_password
</host>

debug 0

Iniciando os serviços:

Nos servidores MySQL:

service mysql-mmm-agent start
chkconfig mysql-mmm-agent on

No servidor de monitoração:

service mysql-mmm-monitor start
chkconfig mysql-mmm-monitor on

Se tudo correu bem em alguns segundos você vai ter os serviços rodando e pode ver o status deles à partir do servidor de monitoração com o seguinte comando:

[root@mon ~]# mmm_control show
  master(10.0.0.2) master/ONLINE. Roles: writer(10.0.0.1)
  master2(10.0.0.3) master/ONLINE. Roles: reader(10.0.0.100)
Agora é só aprender mais sobre as opções do mmm_control e correr pro abraço.

Referências:

http://www.packtpub.com/article/install-manage-use-mmm-for-mysql-high-availability

http://www.packtpub.com/article/setting-up-mysql-replication-for-high-availability?utm_source=rk_mysql_cb_abr2_0510&utm_medium=content&utm_campaign=ramsai

http://fedoraproject.org/wiki/EPEL/FAQ#What_is_EPEL.3F

http://mysql-mmm.org/mmm2:guide