Replicación MySQL » History » Version 5

« Previous - Version 5/8 (diff) - Next » - Current version
Antonio González Gómez, 12/16/2015 03:25 PM


Replicación MySQL

Se eligio una configuracion master to salve, en este caso se utilizo el Servidor coati como master y freud como slave.
Primeramente se debe aclarar que las 2 bases deben tener la misma version de mysql, si bien es cierto que pueden funcionar con una minima diferencia, se aconseja que se tenga la ultima version estable.
El primer paso, será modificar la configuración del master, para incluir el apartado referente a la replicación. Para ello, modificaremos su fichero /etc/mysql/my.cnf (sería recomendable hacer un backup del fichero, por si las moscas) y añadiremos lo siguiente, al final del apartado [mysqld]:


    [mysqld]
    ...
    # MASTER-SLAVE #
    server-id=1
    log-bin=mysql-bin
    binlog_format=mixed
    sync_binlog=1
    max-binlog-size=500M
    expire_logs_days=4
    innodb_flush_log_at_trx_commit=1


Si ya se había modificado el fichero my.cnf, será importante revisar que no se haya declarado anteriormente alguno de estos parámetros.

PASO 2 SLAVE - Configuración.
2.1. CHANGE MASTER TO

El método recomendado es usar el comando CHANGE MASTER TO en el slave. La sintaxis es la siguiente:

CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
MASTER_USER=<user>, MASTER_PASSWORD=<password> ;

Por ejemplo:


    CHANGE MASTER TO MASTER_HOST='192.168.2.175', MASTER_PORT=3306,
    MASTER_USER='replication', MASTER_PASSWORD='slavePass';


Queda claro que se necesitará indicar lo siguiente:

La IP del master, con la variable "master-host", así como el puerto (por defecto el 3306).
Las credenciales del usuario mysql, que se usará para la replicación, mediante "master-user" y "master-password". Este usuario lo daremos de alta despues.

PASO 3 - Reiniciar ambos mysqld

    /etc/init.d/mysqld restart o service mysql restart

PASO 4 - MASTER - Crear usuario

Se necesitará un usuario mysql para la replicación. En este paso, daremos de alta al usuario en el master, únicamente.

    mysql> GRANT REPLICATION SLAVE ON *.* to 'replication'@'%' IDENTIFIED BY 'slave';
    mysql> FLUSH PRIVILEGES;
    mysql> GRANT RELOAD ON *.* TO 'replication'@'%';
    mysql> GRANT SUPER ON *.* TO 'replication'@'%';
    mysql> FLUSH PRIVILEGES;


PASO 5 - MASTER - Backup datos MySQLDump.

A partir de aquí, lo que quedaría sería pasar los datos al slave, para que tanto master como slave tengan los mismos datos, y acto seguido iniciar la replicación. Para ello, podemos hacer un backup, en el master, de la base de datos a replicar, para posteriormente restaurarla en el slave, y ahí iniciar la replicación.

    mysql> FLUSH TABLES;
    Query OK, 0 rows affected (0.00 sec)

    mysql> FLUSH TABLES WITH READ LOCK;
    Query OK, 0 rows affected (0.00 sec)
    mysql> SHOW MASTER STATUS;

    $ mysqldump [miprueba] > miprueba.sql; 
    mysql> UNLOCK TABLES;

PASO 6 - SLAVE - Recovery backup

Una vez tengamos el backup, deberemos restaurarlo en el/los slave/s. A continuación se describe cómo restaurar un backup hecho con mysqldump.

    mysql> slave stop;
    mysql -u root -p < miprueba.sql;
    service mysql restart
    mysql> START SLAVE;
    mysql> SHOW SLAVE STATUS\G

NOTA: A partir de ahora, todo lo que se cree/modifique en el master, se replicará al slave. No hará falta volver a ejecutar un "start slave" al inciar el mysqld, incluso si el mysqld se para y posteriormente se incia, no hará falta iniciar ni el master ni el slave de nuevo, ya que se iniciarán automáticamente.

Errores
Si nos encontramos con algún error al iniciar los slaves, tras haber restaurado el dump del master en los slaves, siempre podemos forzar la resincronización.

En el master, ejecutaremos un show master status, lo cual nos devolverá el fichero de bin log y la posición en la que está.

    mysql> show master status;
    +------------------+-----------+--------------+------------------+
    | File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+-----------+--------------+------------------+
    | mysql-bin.000060 | 315815204 |              |                  |
    +------------------+-----------+--------------+------------------+
    1 row in set (0.00 sec)

En los slaves, los resetearemos y los forzaremos a apuntar al mismo fichero y posición de logs que el master, para que empiecen a sincronizar desde ahí:


    mysql> stop slave;
    Query OK, 0 rows affected (0.04 sec)
    mysql> RESET SLAVE;
    Query OK, 0 rows affected (0.14 sec)
    mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000060', MASTER_LOG_POS=315815204;
    Query OK, 0 rows affected (0.31 sec)
    mysql> START SLAVE;
    Query OK, 0 rows affected (0.00 sec)

PASO 7- CHECKEOS
Llegados a este punto, ya deberíamos tener la replicación Master-Slave funcionando. Una buena forma de testearlo, es creando una nueva tabla en el master, y realizando varios inserts, updates y deletes, para ver cómo se replican en el slave