Configuración de una replicación Master-Master en MySQL

Actualizado el 13 de septiembre, 2016. Por BlueHosting.

Una replicación Master-Master en MySQL agrega velocidad y redundancia en sitios web activos. Con una replicación, dos servidores MySQL actúan como un cluster. La técnica de agrupamiento o clustering es particularmente útil para sitios web que requieren alta disponibilidad. Use dos servidores BlueHosting separados, cada uno con direcciones IPv4 privadas, para configurar una réplica.

Esta guía está escrita para un usuario no root. Los comandos que requieren privilegios elevados están precedidos por sudo. Puede obviar el uso de este prefijo si inició sesión como root.

Tenga en cuenta que esta guía está escrita para Debian 7 o Ubuntu 14.04, los comandos para su distribución podrían cambiar.

Instalar MySQL

Use los siguientes comandos para instalar MySQL en cada uno de sus servidores:

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install mysql-server mysql-client

Editar la configuración de MySQL

  1. Edite el archivo de configuración /etc/mysql/my.cnf. Agregue o modifique los siguiente valores:
    Servidor 1:
    Extracto del archivo: /etc/mysql/my.cnf

    server_id           = 1
    log_bin             = /var/log/mysql/mysql-bin.log
    log_bin_index       = /var/log/mysql/mysql-bin.log.index
    relay_log           = /var/log/mysql/mysql-relay-bin
    relay_log_index     = /var/log/mysql/mysql-relay-bin.index
    expire_logs_days    = 10
    max_binlog_size     = 100M
    log_slave_updates   = 1
    auto-increment-increment = 2
    auto-increment-offset = 1
    

    Servidor 2:
    Extracto del archivo: /etc/mysql/my.cnf

    server_id           = 2
    log_bin             = /var/log/mysql/mysql-bin.log
    log_bin_index       = /var/log/mysql/mysql-bin.log.index
    relay_log           = /var/log/mysql/mysql-relay-bin
    relay_log_index     = /var/log/mysql/mysql-relay-bin.index
    expire_logs_days    = 10
    max_binlog_size     = 100M
    log_slave_updates   = 1
    auto-increment-increment = 2
    auto-increment-offset = 2
    
  2. Para cada uno de los servidores, edite la configuración del archivo bind-address con el fin de usar las direcciones IP privadas:
    Extracto del archivo: /etc/mysql/my.cnf

    bind-address    = 123.45.67.8
    
  3. Una vez completado, reinicie la aplicación MySQL:

    sudo service mysql restart
    

Crear usuarios para la replicación

  1. Inicie su sesión MySQL en cada uno de sus servidores:

    mysql -u root -p
    
  2. Configure los usuarios de replicación en cada BlueHosting. Remplace 123.45.67.8 con la dirección IP privada del servidor opuesto, y SuContraseña con una contraseña apropiada y segura:

    GRANT REPLICATION SLAVE ON *.* TO 'replication'@'123.45.67.8' IDENTIFIED BY 'SuContraseña';
    
  3. Ejecute el siguiente comando para probar la configuración. Use la dirección IP privada del BlueHosting opuesto:

    mysql -ureplication -p -h 123.45.67.8 -P 3306
    

    Este último comando debería conectarlo con la instancia de MySQL en el otro servidor remoto.

Configurar una replicación de la base de datos

  1. Con su sesión MySQL iniciada en el primer servidor, haga una petición sobre el estatus del maestro o master:

    SHOW MASTER STATUS;
    

    Note los valores file y position que se muestran:

    mysql> SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |      277 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    
  2. En el segundo servidor, desde la línea de comandos de MySQL, establezca la función de esclavo (slave) para esa base de datos. Remplace 123.45.67.9 con la dirección IP privada del primer servidor. También remplace el valor de master_log_file con el nombre del archivo (file) del paso anterior, y el valor master_log_poscon el valor de posición (position) en el paso anterior:

    SLAVE STOP;
    CHANGE MASTER TO master_host='123.45.67.9', master_port=3306, master_user='replication', master_password='SuContraseña', master_log_file='mysql-bin.000001', master_log_pos=106;
    SLAVE START;
    
  3. En el Servidor 2, solicite el estatus del maestro o master. Una vez más, tome nota de los valores file y position:

    SHOW MASTER STATUS;
    
  4. Establezca el estatus de base de datos esclava en el Servidor 1, remplazando los mismos valores del paso 2 con los del Servidor 2.

    SLAVE STOP;
    CHANGE MASTER TO master_host='123.45.67.8', master_port=3306, master_user='replication', master_password='SuContraseña', master_log_file='mysql-bin.000001', master_log_pos=277;
    SLAVE START;
    
  5. Pruebe creando una base de datos e insertando una fila:
    Servidor 1:

    create database test;
    create table test.flowers (`id` varchar(10));
    

    Servidor 2:

    show tables in test;
    

Cuando haga la petición o query, debería ver las tablas del servidor 1 replicadas en el segundo servidor. ¡Felicidades, ahora tiene un cluster Master-Master para sus bases de datos MySQL!

Recursos adicionales

Para complementar la información presentada en esta guía puede consultar los siguientes recursos. Aunque este material es provisto esperando que sea útil, tenga en cuenta que no podemos certificar su actualidad o precisión.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...