Replicación en mysql
(→Configuración de replicación de MySQL (maestro-esclavo)) |
(→Procedimiento para resincronizar) |
Revisión de 18:41 27 jun 2014
Configuración de replicación de MySQL (maestro-esclavo)
a) Configuración
Maestro: /etc/mysql/my.cnf
# para que otro servidor pueda conectarse bind-address = 0.0.0.0 # cosas propias de la replicación server-id = 1 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 1 max_binlog_size = 10M
(hacer restart)
Esclavo: /etc/mysql/my.cnf
# cosas propias de la replicación server-id = 2 # para que se pueda hacer respaldo incremental, también le activamos las bitácoras al esclavo log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 1 max_binlog_size = 10M # si se quiere limitar la replicación a una BD en concreto. Si se quiere varias, debe repetirse la sentencia por cada una, NO USAR COMAS. replicate-do-db = egresos
(hacer restart)
b) Usuario Ejecutar en el maestro las siguientes sentencias para crear el usuario de replicación:
CREATE USER 'replicante'@'la-ip-del-esclavo' IDENTIFIED BY 'clavedelreplicante'; GRANT REPLICATION SLAVE ON *.* TO 'replicante'@'la-ip-del-esclavo';
c) Obtener el punto de sincronización del maestro En el maestro ejecutar dos terminales. En la primera hacer un bloqueo de tablas:
FLUSH TABLES WITH READ LOCK;
En la segunda hacer:
SHOW MASTER STATUS ;
La columna File muestra el nombre del fichero de bitácora y Position la posición dentro del fichero. Recordar estos valores para indicárselos al esclavo, pues representan las coordenadas donde el esclavo deberá procesar las actualizaciones realizadas por el maestro.
d) levantar el respaldo de datos -> Parar el maestro (sólo es necesario si puede haber tablas InnoDB, pero por si acaso...). Dejar abierta la sesión donde se ejecutó el FLUSH TABLES WITH READ LOCK; -> Copiar/transferir las bases de datos a replicar (/var/lib/mysql) en maestro y esclavo, que queden igualitas! -> Iniciar el maestro (si es que lo habíamos parado) -> Ejecutar UNLOCK TABLES; en el cliente abierto
e) activar la sincronización ejecutar en el esclavo
CHANGE MASTER TO MASTER_HOST='la-ip-del-maestro', MASTER_USER='replicante', MASTER_PASSWORD='clavedelreplicante', MASTER_LOG_FILE='recorded_log_file_name', MASTER_LOG_POS=recorded_log_position;
y reiniciar el esclavo.
Procedimiento para resincronizar
Ejecutar en este orden
Esclavo: Suposición: sólo hay una aplicación que escribe en el maestro (p.e. Apache), para nuestro ejemplo está en el esclavo. Si hubiera más, hay que pararlas TODAS
/etc/init.d/apache2 stop mysql -u root -p
stop slave; \q
/etc/init.d/mysql stop
Maestro:
/etc/init.d/mysql stop cd /var/lib/mysql
Suposición: hay que transferir las tablas que han podido cambiar del maestro al esclavo, en nuestro ejemplo comienzan por la palabra egresos, pero eliminamos varias antiguas que sabemos que no han cambiado y que se encuentran en el fichero "quitaestaticos.txt"
tar cf egresos.tar egresos --exclude-from=quitaestaticos.txt scp egresos.tar administrador@10.10.20.16: rm egresos.tar
Esclavo:
cd /var/lib/mysql mv /home/administrador/egresos.tar . tar xf egresos.tar rm egresos.tar
Maestro:
/etc/init.d/mysql start mysql -u root -p
SHOW master STATUS;
(copiar nombre de archivo de bitácora y posición)
Esclavo:
/etc/init.d/mysql start mysql -u root -p
stop slave; (cambiar en la siguiente línea el nombre de la bitácora y posición) CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106; START slave; \q
Reiniciamos los procesos que acceden a la BD con operaciones de escritura
/etc/init.d/apache2 start