icono_twiter icono Facebook
Carlos García Pérez

Técnico especialista en informática de empresa (CEU).

Ingeniero Técnico en Informática de Sistemas (UPM)

Creador de MobileTest, Haaala!, Girillo, toi18n.

Charla sobre desarrollo de aplicaciones en Android.

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2009-12-08

Tutorial visitado 36.838 veces Descargar en PDF
MySQL: Replicación de bases de datos en MySQL

MySQL: Replicación de bases de datos en MySQL

Introducción.

El proceso de replicación de una base de datos consiste en replicar las consultas de actualización (tanto DML como DDL) en una base de datos maestra (master) sobre una o varias bases de datos esclavas (slave), de manera que tengamos una copia de las mismas a lo largo del tiempo.

MySQL soporta replicación unidireccional asíncrona, es decir, las consultas de actualización ejecutadas en el maestro son replicadas en los servidores esclavos. Esta replicación se realiza de forma transparente. Además es instantánea si los servidores esclavos están levantandos y en estado de replicación.

Antes de continuar hay que tener claro que las modificaciones de datos siempre deben realizarse en el maestro, si quereis poder modificar los datos en cualquier base de datos tendreis que iros a otras soluciones como MySQL Cluster.

Atención:

El presente documento se centra en un escenario en donde la replicación se realiza desde cero, es decir, el maestro y el esclavo no estaban configurados previamente para realizar replicaciones.

Debe saber que si por algún motivo hay errores en la replicación hay que realizar otros pasos y tener más conocimientos más profundos de como funciona todo esto.. En estos casos, deberá documentarse más o recurrir a expertos.. si lo desea puede llamarnos.

¿Para qué nos puede interasar replicar bases de datos?

La replicación es útil para:

  1. Copia de seguridad:

    En condiciones normales, una base de datos replicada de forma correcta es válida como copia de seguridad.

    Además se puede realizar copias de seguridad usando un servidor esclavo para así no interferir al servidor maestro.

  2. Mejorar la escalabilidad:

    Podríamos configurar nuestras aplicaciones para balancear las consultas de lectura (SELECT) entre los servidores replicados.

    Podríamos usar herramientas como MySQL Proxy para balancear las consultas de lectura entre los servidores replicados y enviar las consultas de actualización de datos al maestro.

  3. Alta disponibilidad:

    En aplicaciones y entornos en donde sólo se requieren lecturas, podríamos configurar nuestras aplicaciones para balancear las consultas de lectura (SELECT) entre los servidores replicados de manera que si uno se cae se continue prestando servicio.

Conceptos necesarios de conocer relacionados con la replicación en MySQL

A continuación exponemos algunos conceptos necesarios para comprender algo mejor todo esto...

El Log Binario

El log binario es un archivo binario gestionado por el servidor de base de datos en el que se registran todas las sentencias SQL de modificación de datos o estructura.

En el caso de la replicación es importante saber que cada servidor esclavo se conecta al servidor maestro y le solicita que le envie las sentencias registradas en los logs binarios a partir de una posición, para ello, cada esclavo mantiene un archivo a modo de índice en donde registra la posición actual de la replicación.

Gracias a esto, podemos detener el esclavo (STOP SLAVE), que haya un corte de red, etc.. de manera que cuando se vuelva a iniciar la replicación (START SLAVE) o se reestablezca la comunicación... Pase el tiempo que pase) el esclavo solicitará al maestro todas las sentencias a ejecutar desde su estado actual y las irá ejecutando secuencialmente de manera que en cuestión de segundos ambos servidores tendrán las bases de datos con el mismo contenido y estructura.

Master

(Solicita Log Binario desde la posición X)
« « « « «  «  «  « « « « « «  «  «  «

(Devuelve el Log Binario)
» » » » »  »  »  » » » » » »  »  »  »

Esclavo

El log binario por defecto está ubicado en la carpeta <MYSQL_HOME>/data y se llama igual que la máquina con el sufijo -bin y un número como extensión.
Ejemplos: pccarlos-bin.00001, pccarlos-bin.00002, pccarlos-bin.00003

Pasos para poner en marcha la replicación

A continuación vamos a exponer los pasos a realizar la replicación de una base de datos bd_autentia en un único servidor esclavo. Si quisieramos configurar más esclavos, los pasos a realizar serían los mismos sobre cada uno de los esclavos.

Creamos de un usuario MySQL en el servidor maestro con privilegios de replicación

El servidor esclavo se autenticará frente al servidor maestro como un usuario normal.

Para crear el usuario debemos ejecutar desde la consola de comandos de mysql las siguientes sentencias SQL:

CREATE USER '<replication_user>'@'<slave_address>' IDENTIFIED BY '<replication_user_password>' GRANT REPLICATION SLAVE ON *.* TO '<replication_user>'@'<slave_address>'

Con la sentencia anterior el usuario sólo tendría permiso de acceso desde la máquina <slave_address>, en caso de no requerir esta medida de seguridad puedes sustituir el comodin % por el parámetro <slave_address>.

Configuración del servidor maestro

Deberemos agregar las siguientes lineas al final del archivo de configuración del servidor MySQL, por defecto: <MySQL_HOME>/my.ini

# Identificador único del servidor MySQL dentro de todos los servidores implicados en la replicación. server-id=1 # Al especificar el parámetro log-bin estamos activando el log binario. # No especificamos un valor para el parámetro de configuración (por defecto será <nombre_maquina>-bin). log-bin= # El log binario sólo tendrá las actualizaciones realizadas sobre la base de datos "bd_autentia" # Si además quisieramos replicar otras bases de datos, duplicariamos este parámetro para cada base de datos. binlog-do-db=bd_autentia

Configuración del servidor esclavo

Deberemos agregar las siguientes lineas al final del archivo de configuración del servidor MySQL, por defecto: <MySQL_HOME>/my.ini

# Identificador único del servidor MySQL dentro de todos los servidores implicados en la replicación. server-id=2 # Nombre del archivo binario que almacena las instrucciones pendientes de ejecutar, por defecto: <host_name>-relay-bin.index relay-log= # Nombre o dirección IP del maestro. master-host=<master_address> # El esclavo se conecta a través de un usuario al maestro. Identificador del usuario master-user=<replication_user> # El esclavo se conecta a través de un usuario al maestro. Contraseña del usuario master-password=<replication_user_password> # Número de segundos que esperará el esclavo para reintentar conectarse al maestro en caso de una perdida de conexión. master-connect-retry=50 # Número de reintentos de reconexión master-retry-count=5000

Realizamos una copia de seguridad de la base de datos del maestro sobre el servidor el esclavo

Desde la consola ejecutamos los siguientes comandos:

  1. [maestro]: <MYSQL_HOME>/bin/mysql -u root --password=<contraseña> -e "FLUSH TABLES WITH READ LOCK"
    Para limpiar las caches y bloquear el acceso de cualquier aplicacion a la base de datos.
  2. [maestro]: <MYSQL_HOME>/bin/mysqldump --u root --password=<contraseña> --opt bd_autentia > backup.sql
    Realizamos una copia completa de la base de datos en el archivo backup.sql.
  3. [esclavo]: <MYSQL_HOME>/bin/mysql --user=root --password=<contraseña> bd_autentia < backup.sql
    Para restaurar la copia de seguridad en el esclavo.
  4. [esclavo]: <MYSQL_HOME>/bin/mysqladmin -u root --password=<contraseña> shutdown
    Detenemos el servidor esclavo
  5. [maestro]: <MYSQL_HOME>/bin/mysqladmin -u root --password=<contraseña> shutdown
    Detenemos el servidor maestro (Se desbloquearán las tablas de las bases de datos previamente bloquadas)
  6. [esclavo]: <MYSQL_HOME>/bin/mysqld-nt --defaults-file="<MYSQL_HOME>\my.ini" MySQL
    Iniciamos el servidor el cual tomará la nueva configuración.
  7. [maestro]: <MYSQL_HOME>/bin/mysqld-nt --defaults-file="<MYSQL_HOME>\my.ini" MySQL
    Iniciamos el servidor el cual tomará la nueva configuración.

Probando la replicación

  • En el servidor esclavo ejecute el comando SHOW SLAVE STATUS y observe que el mensaje que le muestra es un mensaje que indica que está esperando eventos del maestro...
  • Modifique algo en el maestro y verifique que instantaneamente se replica en el esclavo.
  • Detenga el esclavo durante un tiempo, realize cambios (cree tablas, modifique registros..) en el maestro e inicie el esclavo. En cuestion de milisegundos ambas bases de datos deberían de ser iguales.

Otra información

Dentro del directorio <MYSQL_HOME>/bin existe una herramienta a través de la cuál podemos extraer las sentencias ejecutadas. Por ejemplo la siguiente sentencia exporta las sentencias ejecutadas durante un determinado dia:
    mysqlbinlog ../data/pccarlos-bin.00002 --start-date="2008-03-01 00:00:00" --stop-date="2008-03-02 00:00:00" > statementsSQL.sql

Además, MySQL responde a los siguientes comandos de administración:

SHOW BINLOG EVENTSMuestra el contenido de los archivos de logs, es decir las sentencias SQL.
 
SHOW BINARY LOGSMuestra el nombre y tamaño en bytes de los archivos binarios de logs.
 
PURGE BINARY LOGS BEFORE '2008-02-01 21:00:00'Elimina los logs desde una determinada fecha
 
RESET MASTERBorra todos los logs binarios.
 
PURGE BINARY LOGS
TO 'pccarlos-bin.000001'
Elimina un archivo de log binario.
 
SHOW SLAVE STATUSMuestra el estado de la replicación.
 

CHANGE MASTER TO MASTER_HOST='maestro_host_name',
MASTER_USER='replicacion_user',
MASTER_PASSWORD='replicacion_user',
MASTER_LOG_FILE='maestro_log_binario_a_usar',
MASTER_LOG_POS=maestro_log_binario_posicion

Comando en donde todos los parámetros son opcionales y a través del
cual podemos modificar el origen de la replicación.. (Es útil cuando hay errores)

Referencias

Conclusiones

En este tutorial hemos visto de forma sencilla los pasos a realizar para crear bases da datos replicadas en el escenario más simple,.. como todo, hacen falta horas de pruebas para ver hasta donde se puede llegar con todo esto y ver que posibilidades nos ofrece...

Recordar que esto no es un libro.. es un simple tutorial, hay mucho más en donde profundizar.... os lo dejo en vuestras manos :-)

Carlos García Pérez. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.
cgpcosmad@gmail.com

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2014-09-30-01:47:11

Autor: elmich

Buenas tardes:
Es posible tener un maestro trabajando en local y el esclavo tenerlo en algún servidor en la nube?

Mi duda surge por los siguiente: Tengo un sistema montado en la nube; el problema viene cuando se llega a caer el servidor de la nube por cualquier motivo o porque se me va la señal de Internet, se para la operación por completo del negocio. Si lo trabajo en local y no tengo Internet, no importa porque el servicio sigue en local.

Gracias por tu apoyo.

Fecha publicación: 2010-10-20-21:22:32

Autor: ricardito29

UNA CONSULTA SABES SI HAY ALGUNA MANERA DE HACER UNA COPIA DE UNA BASE DE MYSQL Y MIGRARLO A POSTGRESQL, PERO LA BASE DE DATOS TIENE REGISTROS, ADEMAS TIENE PROCEDURES Y TRIGGERS Y FUNCTIONS.

SE PODRA MIGRAR TODO ?

EXISTE ALGUN PROGRAMA QUE PERMITA MIGRARLOS, BUENO DEJO MI CORREO :
sistemassistemas@hotmail.com

SALUDOS.

Fecha publicación: 2010-10-20-21:21:03

Autor: ricardito29

BUENA, DIGAME SEÑOR QUE PASAS SI LA BASE DE DATOS ESTA EN UN SERVIDOR, Y LA OTRA EN OTRA MAQUINA, Y QUE PASA SI EL SERVIDOR ESTA APAGADO, Y LOS CLIENTES SE CONECTARIAN ALA MAQUINA QUE TIENE LA OTRA COPIA ?, Y CUANDO SE PRENDA EL SERVIDOR, QUE PASA SE COPIA DE MANERA AUTOMATICA? EXPLIQUEME BIEN ESO.

SOY NOVATO EN ESTO DE REPLICACION.


Fecha publicación: 2010-03-25-22:34:36

Autor: Arcadia

PERO NO ES LO QUE BUSCABA

Fecha publicación: 2010-01-26-12:46:12

Autor: jcarmonaloeches

Muy buena calidad de tutorial. ¡Se ve de lejos que te gusta la enseñanza!