Cómo iniciar una replicación Maestro – Esclavo en MySQL >5.0

3 Dic

La replicación en MySQL funciona de una manera muy sencilla. Existe un maestro, que es el encargado de propagar los cambios y los esclavos, que son los que reciben estos cambios a fin de tener una copia exacta de lo que tiene el maestro.

Para que esto suceda, los esclavos tienen una conexión abierta contínua con el maestro para recibir estos cambios. Con esta conexión se comprueba desde el esclavo la última posición escrita en el log binario del maestro -eso es, se replican por medio del log binario. Cuando sucede algún cambio en el log binario del maestro, se remiten estos cambios a los esclavos, que posteriormente ejecutan estos cambios en sus tabla.s

Para empezar una replicación maestro esclavo sencilla hay que tener como mínimo dos instancias del servidor MySQL, una que haga de maestro y otra que haga de esclavo.

En el maestro tienen que estar las siguientes líneas en el fichero de configuración [my.cnf]:

log-bin=mysql-bin
server-id = 1

Por otro lado, en el esclavo tendremos que tener las siguientes lineas:

server-id = 2

Una vez configurados los servidores, podemos arrancarlos -obviamente aún no van a replicar porque no les hemos indicado que empiecen a replicar.

Cuando estén arrancados, en el maestro creamos o instalamos las tablas y la base de datos que queremos replicar. Cuando estén creadas y hayamos insertado los datos necesarios dentro de las tablas entonces tendremos que hacer un volcado de la base de datos a un archivo de texto. La razón de esto es que vamos a instalar esta misma base de datos en el esclavo. Para ello lo podremos hacer así:

mysql> GRANT REPLICATION PRIVILEGES ON *.bbdd TO 'usuario_replicacion'@'192.168.0.3' IDENTIFIED BY 'pass_replicacion';
mysql> flush privileges;
mysql> LOCK ALL TABLES READ ONLY
mysql> exit

Ahora desde la línea de comandos sacamos un DUMP del maestro:

joax@maestro> mysqldump bbdd > bbdd_dump_20071202.sql

Una vez terminado el proceso, tenemos que recordar la situación del log binario en el master:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 98 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Con esto ya podemos desbloquear las tablas en el maestro:

mysql> UNLOCK ALL TABLES;

Y con ello, en el esclavo ahora ejecutamos lo siguiente:

joax@esclavo> mysql bbdd < bbdd_dump_20071202.sql

Y una vez que el esclavo tenga generada la base de datos, lo configuramos para que esté posicionado con respecto al maestro:

mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.2';
mysql> CHANGE MASTER TO MASTER_USER = 'usuario_replicacion';
mysql> CHANGE MASTER TO MASTER_PASSWORD = 'pass_replicacion';
mysql> CHANGE MASTER TO MASTER_LOG_FILE = 'mysql-bin.000005';
mysql> CHANGE MASTER TO MASTER_LOG_POS = 98;
mysql> start slave;

Ahora el esclavo comenzará la replicación con el maestro. Quedándose a 0 segundos de él una vez copiado todo el log binario que le resta de lo sucedido hasta la fecha. Para comprobar que realmente está replicando, tendremos que ejecutar el siguiente comando en la consola de MySQL:

mysql> show slave status \G

Eso muestra:

*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.2
Master_User: usuario_replicacion
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 98
Relay_Log_File: esclavo-relay-bin.000001
Relay_Log_Pos: 98
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: bbdd
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 98
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)

Lo importante es lo que sigue a Seconds_Behind_Master: porque es el valor que indica el retraso de este esclavo con respecto al maestro.

En definitiva y a modo de resumen:

1. Cambiar la configuración del maestro con las líneas:

server-id=1
log-bin=mysql-bin

2. Cambiar la configuración del esclavo:

server-id=2

3. Bloquear las tablas del maestro y hacer un dump:

mysql> LOCK ALL TABLES READ ONLY
mysql> SHOW MASTER STATUS
mysql> exit
joax@maestro> mysqldump bbdd > bbdd_dump_20071202.sql

4. Instalar la base de datos en el esclavo:

joax@esclavo> mysql bbdd < bbdd_dump_20071202.sql
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.2';
mysql> CHANGE MASTER TO MASTER_USER = 'usuario_replicacion';
mysql> CHANGE MASTER TO MASTER_PASSWORD = 'pass_replicacion';
mysql> CHANGE MASTER TO MASTER_LOG_FILE = 'mysql-bin.000005';
mysql> CHANGE MASTER TO MASTER_LOG_POS = 98;
mysql> start slave;

En un cluster podremos incluir tantos esclavos como necesitemos. He llegado a ver clusteres de varias decenas de esclavos sobre el mismo maestro. Pero son puntos donde a lo mejor tienes que tomar una estrategia de particionado de la base de datos. Estrategia que veremos próximamente.

11 comentarios to “Cómo iniciar una replicación Maestro – Esclavo en MySQL >5.0”

  1. boche Vie 21, diciembre 2007 a 04:30 #

    Nene, solo felicitarte a ti y a los de WiW…
    Ahora que sois famosos y los primeros , muchos os diran tal y cual!…
    Yo solo pretendo felicitarte por lo bien que lo habeis y estais haciendo y solo que me da un poco de rabia que mi coraje a vivir a Madrid no me haya permitido embarcarme con vosotros en esta movida…
    Estaba claro que triunfabais… clarisimo!
    un saludo!
    Boche

  2. Mario Vie 18, enero 2008 a 12:42 #

    Enhorabuena por el trabajo que haceis en tuenti y por este blog, gracias por la explicación.

    Un saludo!

  3. alexander mafaldo Vie 8, mayo 2009 a 02:27 #

    sin duda es un tutorial super entendible aunque soy un novato en mysql . te doy un 100000 señor programador.antes de irme alguien me podria decir en cuanto tiempo puedo aprender mysql?gracias.

  4. Fernando Lun 26, julio 2010 a 03:11 #

    Mi interesante tu tutorial. Gracias

  5. luiselbarbas Mie 2, noviembre 2011 a 08:16 #

    Está muy clara la explicación, pero tengo una pregunta: ¿Y si las dos mysql están en dos redes distintas en puntos distintos?. Es decir, ¿Cómo replicar dos bd a través de internet?. ¿Qué protocolos y puertos utiliza esta replicación?, Supongo que abriéndo dichos puertos en los respectivos cortafuegos será suficiente.
    Saludos.

  6. Javier Manzano Mie 2, noviembre 2011 a 05:04 #

    Excelente Artículo! Esta de pokemon.

    Sabes si es posible replicar una tabla de los esclavos hacia el maestro?

  7. sergio Mie 7, diciembre 2011 a 07:05 #

    muy bueno pero te falta para que sea un tutorial completo el comando de crear el usuario de reaplicacion ya que brincas de una vez a dar privilegios.

  8. Antonio Mie 4, julio 2012 a 03:18 #

    Genial, ya tengo solucionado un problema que arrastraba de hace tiempo.
    Muchas gracias por la info

  9. cgz - exito en los negocios por internet Mie 2, enero 2013 a 01:47 #

    Muchas gracias por el tutorial, me ha servido bastante para los servidores de mi empresa.
    saludos y feliz 2013

  10. irineocoria Sab 15, junio 2013 a 06:42 #

    No me funciona la replicacion

    El ejecutar el comando

    show slave status \G

    Me sale el siguiente error:

    Last_IO_error: relay log write failure: could not queue event from master mysql

Trackbacks/Pingbacks

  1. Conectarse a varios esclavos de MySQL con Ruby « joax|blog - Mie 15, septiembre 2010

    […] como nos conectamos a varios esclavos de MySQL que replican de un maestro. Como comentamos en el capitulo anterior, la replicación  de MySQL nos permite aumentar la capacidad de lecturas de nuestra base de […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: