El poner el MySQL en master-master me ha dado algún que otro problema por no hacerlo bien desde el principio, así que vamos paso a paso. Para empezar, pondremos el MySQL en master-slave. Es una configuración que no da problemas y el modo master-master es un master-slave doble.
Con el MySQL en master-slave conseguiremos que se replique todo lo que pasa en un servidor en el otro, pero no al revés. En nuestro caso, si lo hiciésemos así, antes de recuperar el funcionamiento del servidor principal habría que hacer una copia de seguridad del secundario y restaurarla, pero tratamos de automatizar todo lo posible el sistema así que no nos interesaría que se quedase así.
Para hacer el master-slave, lo primero es editar el archivo de configuración del mysql de los dos nodos (/etc/my.cnf en mi caso) y añadimos:
Nodo 1:
[mysqld]
log-bin=mysql-bin
server-id=1
Nodo 2:
[mysqld]
server-id=2
Cada servidor tiene que tener un id distinto, y en log-bin será el encargado de revisar el log para la replicación.
Luego tenemos que crear un usuario en el master (Nodo 1) y darle acceso desde la IP del esclavo (Nodo 2):
mysql> create user 'replicator'@'%' identified by 'C0ntraseña';
mysql> grant replication slave on *.* to 'replicator'@IPSLAVE \
identified by 'slave';
Tenemos que obtener ahora la información del log binario para poder usarla, para ello en el Nodo 1:
mysql> FLUSH TABLES WITH READ LOCK; <- Dejar ejecutado en una sesión durante la creación de la copia de seguridad
mysql> SHOW MASTER STATUS;
Que nos devolverá algo similar a esto:
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000001 | 324 | | |
+------------------+-----------+--------------+------------------+
Deberemos apuntar "File" y "Position".
Hacemos una copia de seguridad del master (Nodo 1):
$ mysqldump -u da_admin -p --all-databases --master-data > dbdump.db
Y la restauramos en el slave (Nodo 2):
$ mysql -u da_admin -p < dbdump.db
Ya sólo falta en el slave (Nodo 2) declarar el master:
mysql> CHANGE MASTER TO
MASTER_HOST='IP MASTER',
MASTER_USER='replicatror',
MASTER_PASSWORD='C0ntraseña',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=324;
Y arrancar el esclavo:
mysql> START SLAVE;
Podremos comprobar el estado en todo momento con el comando:
mysql> SHOW SLAVE STATUS\G;
Nodo 1:
[mysqld]
log-bin=mysql-bin
server-id=1
Nodo 2:
[mysqld]
server-id=2
Cada servidor tiene que tener un id distinto, y en log-bin será el encargado de revisar el log para la replicación.
Luego tenemos que crear un usuario en el master (Nodo 1) y darle acceso desde la IP del esclavo (Nodo 2):
mysql> create user 'replicator'@'%' identified by 'C0ntraseña';
mysql> grant replication slave on *.* to 'replicator'@IPSLAVE \
identified by 'slave';
Tenemos que obtener ahora la información del log binario para poder usarla, para ello en el Nodo 1:
mysql> FLUSH TABLES WITH READ LOCK; <- Dejar ejecutado en una sesión durante la creación de la copia de seguridad
mysql> SHOW MASTER STATUS;
Que nos devolverá algo similar a esto:
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000001 | 324 | | |
+------------------+-----------+--------------+------------------+
Deberemos apuntar "File" y "Position".
Hacemos una copia de seguridad del master (Nodo 1):
$ mysqldump -u da_admin -p --all-databases --master-data > dbdump.db
Y la restauramos en el slave (Nodo 2):
$ mysql -u da_admin -p < dbdump.db
Ya sólo falta en el slave (Nodo 2) declarar el master:
mysql> CHANGE MASTER TO
MASTER_HOST='IP MASTER',
MASTER_USER='replicatror',
MASTER_PASSWORD='C0ntraseña',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=324;
Y arrancar el esclavo:
mysql> START SLAVE;
Podremos comprobar el estado en todo momento con el comando:
mysql> SHOW SLAVE STATUS\G;