Configurando una replicación Master a Master usando MySQL

Posted on
  • jueves, 5 de enero de 2012
  • by
  • Román
  • in
  • Etiquetas: ,
  • Todos sabemos de la importancia de implementar mecanismos de alta disponibilidad en los servidores que nos toca administrar. En este caso, voy a detallar los pasos para implementar una replicación master to master o bidireccional entre servidores MySQL (una especie de espejado o mirror).

    En ambos servers debemos hacer las siguientes tareas:

    1. Crear una carpeta Logs, por ejemplo:
    c:\program files\mysql\logs\

    2. Crear un usuario para la replicación con suficientes permisos.

    mysql -u root -pSuPassword (sin espacios el pass y el -p)
    GRANT REPLICATION SLAVE ON *.* TO 'usuario'@'%' IDENTIFIED BY 'pepe';
    FLUSH PRIVILEGES;

    En el master principal

    Hay que editar el archivo my.ini (en windows) o my.conf (en linux).
    En la sección marcada como
    [mysqld] agregar lo siguiente.
    log-bin = “D:\MySQL\MySQL Server 5.1\Logs” (cuidado con las comillas)
    binlog-do-db=mibase
    server-id=1

    y agregar al final del archivo lo siguiente:
    slave-net-timeout = 30
    master-connect-retry = 30

    Una vez hecho esto, grabamos y reiniciamos el servicio, ya sea por services o por línea de comandos:
    mysqld restart

    En el Master secundario:

    Lo mismo, cambiar my.ini o my.conf, segun sea Windows o Linux y agregar lo siguiente en la sección: [mysqld]

    log-bin = “c:\program files\mysql\logs\” (cuidado con las comillas)
    binlog-do-db=winnings
    server-id=2 (fijarse que este número es distinto al del master principal)

    y al final del archivo agregar:
    slave-net-timeout = 30
    master-connect-retry = 30

    grabar el archivo y reiniciar el servicio mysql

    mysqld restart

    En el Master principal:

    Para evitar problemas vamos a bloquear las tablas hasta que finalicemos la operatoria.

    FLUSH TABLES WITH READ LOCK;

    En el Master secundario:

    Creamos la base a ser replicada:
    mysql -u root -pSuPassword

    CREATE DATABASE suBase;

    mysql -u root -pSuPassword suBase < suBase_backup.sql

    En el Master principal:

    mysql -u root -pSuPassword

    use SuBase
    go
    SHOW MASTER STATUS;

    Esto nos mostrará algo asi
    PLAIN TEXT
    CODE:
    +---------------------+----------+-------------------------------+------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +---------------------+----------+-------------------------------+------------------+
    | mysql-bin.000001 | 21197930 | my_database,my_database | |
    +---------------------+----------+----------------------------

    Lo que nos interesa a nosotros es el dato del file (mysql-bin.000001) y el número de la posición (21197930) . Con esos datos nos vamos al master secundario.

    En el master secundario:
    mysql -u root -pSuPassword

    stop slave;
    CHANGE MASTER TO MASTER_HOST='10.33.0.14', MASTER_USER='usuario', MASTER_PASSWORD='pepe’, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=21197930;
    start slave;

    Fijense que en los parametros master_log_file y master_log_pos pusimos los datos que guardamos en el paso anterior en el master principal. En master user pusimos el usuario que creamos originalmente para la replicación y en Master_password su correspondiente password.

    A continuación ejecutamos lo siguiente para ver como está funcionando la replicación:

    Show Slave Status;

    A este punto ya tendríamos seteada la replicación desde el master principal al master secundario, pero nos faltaría hacer la inversa, replicación desde el secundario al principal, por lo tanto...
    Vamos al Master secundario.
    use SuBase
    go
    SHOW MASTER STATUS;
    Lo mismo que antes, tomamos los valores de file y position y los llevamos ahora al master principal.

    En el master principal
    mysql -u root -pSuPassword

    stop slave;
    CHANGE MASTER TO MASTER_HOST='10.33.0.13', MASTER_USER='usuarios', MASTER_PASSWORD='pepe’, MASTER_LOG_FILE='Logs.000001', MASTER_LOG_POS=107;
    start slave;

    Y como habiamos bloqueado las tablas para replicar sin problemas ahora es el momento de desbloquearlas:

    unlock tables;

    Si se siguieron todos los pasos, en este momento la replicación debería estar funcionando.

    Hugo Román Bernachea
    Mail de contacto: SQLServer777@gmail.com

    Microsoft Certified DBA
    Microsoft Certified Trainer
    Twitter: @bernachea















    2 comentarios:

    Daniel Vattimo dijo...

    Hola.! Necesito que me ayudes si podes, sabes como puedo hacer un script para reiniciar una suscripcion? estoy usando sql server 2008.
    Muchas Gracias
    DanielVattimo@gmail.com

    Franco dijo...

    Muchas Gracias, me sirvió muchisimo el tutorial.

    Publicar un comentario