Portada del sitio > Documentación > Servidores IPLAN > Como hacer sincronización master-master en MySQL
Como hacer sincronización master-master en MySQL
Martes 17 de noviembre de 2015, por
Pasos a seguir:
1- Habilitamos binary logging en ambas bases
2- Exportamos la base de datos del server A
3- Importamos la base de datos al server B
4- Configuramos un túnel SSH entre ambos server
5- Configuramos los permisos de replicación
6- Hacemos B como esclavo de A
7- Hacemos A como esclavo de B
Paso 1: Habilitar Binary Logging
Los ajustes se hacen en el archivo de configuracion de MySQL en debian (/etc/mysql/my.cnf).
Agregar en el my.cnf del server A:
server_id = 1
log-bin = /var/db/mysql/mysql-bin
expire-logs-days = 10
sync-binlog = 1
server_id = 1
relay_log = /var/db/mysql/mysql-relay-bin
relay_log_index = /var/db/mysql/mysql-relay-bin.index
max_binlog_size = 100M
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
binlog_do_db = form_y_cap_uf
Y despues en el server B:
server_id = 2
log-bin = /var/db/mysql/mysql-bin
expire-logs-days = 10
sync-binlog = 1
server_id = 1
relay_log = /var/db/mysql/mysql-relay-bin
relay_log_index = /var/db/mysql/mysql-relay-bin.index
max_binlog_size = 100M
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 2
binlog_do_db = form_y_cap_uf
Con binlog_do_db le indicamos que base de datos queremos sincronizar, sin este parámetro sincrosariamos todo el server.
Luego de modificar el my.cnf reiniciar el server mysql para que tome las modificaciones.
Paso 2: Exportamos la base de datos del server A
Hacemos un dump, pero con el agregado de ver en que archivo bin y position se encuentra en el servidor maestro para así poder después sincronizar.
Entrando en mysql -u root -p, ejecutamos dichas sentencias, bloqueamos las bases para que nadie pueda escribir mientras estamos haciendo esto:
a> FLUSH TABLES WITH READ LOCK;
a> SHOW MASTER STATUS;
Nos sale en pantalla algo como esto anotemos en algun lugar estos nombres y numeros:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 |
+------------------+----------+--------------+------------------+
En otra terminal del server A, hacemos un mysqldump de la base en cuestión:
a$ mysqldump -u root -p database > /my_database.sql
Después de que se haya hecho el backup desbloquear las tablas:
a> UNLOCK TABLES;
Paso 3: Importar la base de datos al server B
Si la base es muy grande y tenemos que pasarla por una conexión wan es recomendable comprimirla:
a$ gzip my_database.sql
Luego copiamos la base al server B:
a$ scp my_database.sql.gz user@database-b: /my_database.sql.gz
Luego de haber terminado de copiar la base nos conectamos al server B y la descomprimimos:
b$ gunzip database.sql.gz
Luego importamos dicha base en el server MySQL, primero creamos dicha base y luego la volcamos:
b$ mysqladmin -u root -p create my_database
b$ mysql -u root -p my_database < my_database.sql
Ya tenemos en ambos server la misma base de datos, ahora crearemos los túneles entre ambos.
Paso 4: Crear túnel SSH
Configuramos el túnel SSH para que el server A escuche en el puerto localhost:13306 y este a subes sea reenviado al puerto 3306 del server B y vise versa:
a$ sudo ssh -N -f -L13306:127.0.0.1:3306 -R13306:127.0.0.1:3306 user@database-b
b$ sudo ssh -N -f -L13306:127.0.0.1:3306 -R13306:127.0.0.1:3306 user@database-a
Paso 5: Configurar permisos de replicación
Primero en la base de datos del server A creamos el usuario replication para que pueda acceder desde el server B:
a> GRANT REPLICATION SLAVE ON *.* TO ’replication’@’127.0.0.1’ IDENTIFIED BY ’replication_password’;
Segundo en la base de datos del server B creamos el usuario replication para que pueda acceder desde el server A:
b> GRANT REPLICATION SLAVE ON *.* TO ’replication’@’127.0.0.1’ IDENTIFIED BY ’replication_password’;
Ya creado esto podemos proseguir con el testeo de la conexión por SSH, Probemos la conexin desde el server A al Server B vía mysql:
a$ mysql -u replication -p -h 127.0.0.1 -P 13306
Ahora probamos desde el B al A:
b$ mysql -ureplication -p -h 127.0.0.1 -P 13306
Si todo sale bien proseguimos en el siguiente paso.
Paso 6: Base de datos B como esclavo de la A:
Ahora veremos cómo configuramos para que se replique la base del server A en el B, recordemos el binary log y el posicionamiento de la pantalla en el paso 2.
b> CHANGE MASTER TO master_host=’127.0.0.1’, master_port=13306, master_user=’replication’, master_password=’replication_password’, master_log_file=’mysql-bin.000001’, master_log_pos=106;
Ahora iniciamos el esclavo:
b> START SLAVE;
b> SHOW SLAVE STATUS\G
Paso 7: Base de datos A como esclavo de la B:
Hacemos lo mismo que en el paso anterior solo que a la inversa.
Hacemos como en el paso 2 pero en el server B.
b> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 480764 |
+------------------+----------+--------------+------------------+
a> CHANGE MASTER TO master_host=’127.0.0.1’, master_port=13306, master_user=’replication’, master_password=’replication_password’, master_log_file=’mysql-bin.000001’, master_log_pos=480764;
a> START SLAVE;
a> SHOW SLAVE STATUS\G
Ahora todo lo que hagamos en ambos server será sincronizado.