Como montar replicación en master-slave con MySQL
Mediante la replicación master-slave de MySQL podemos repartir las lecturas de la base de datos entre varios hosts. Vamos a ver como montar un slave de MySQL.
Primero de todo debemos tener habilitado los binary logs y definir un server-id único dentro del entorno de replicación. Para hacer esto deberemos editar el my.cnf añadiendo:
server-id=1 log-bin = mysql-bin sync_binlog = 1 max-binlog-size = 500M expire_logs_days = 4 innodb_flush_log_at_trx_commit = 1
En el slave debemos añadir también un server-id único:
server-id=2 relay-log = mysqld-relay-bin max-relay-log-size = 500M relay_log_purge = 1
Deberemos reiniciar los MySQL para aplicar los cambios. A continuación deberemos crear un usuario para la replicación en el master:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'secretoreplicacion'; Query OK, 0 rows affected (0.04 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
A continuación deberemos realizar la copia inicial de la base de datos. Se puede hacer de muchas formas, por ejemplo mediante snapshots:
mysql> FLUSH TABLES; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.00 sec) mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 1284 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
Creamos un snapshot y copiamos los datos del datadir del master al datadir del slave:
$ lvcreate -L16G -s -n mysql.snap /dev/local/mysql
Una vez tenemos los datos podemos liberar el LOCK, o si lo hacemos con un snapshot inmediatamente después de crearlo:
mysql> UNLOCK TABLES;
En el slave deberemos indicar los datos del master para empezar la replicación:
mysql> slave stop; Query OK, 0 rows affected, 1 warning (0.00 sec)
Los datos que hemos sacado del SHOW MASTER STATUS deberemos pasárselos al slave:
CHANGE MASTER TO MASTER_HOST='192.168.4.1', MASTER_USER='slave', MASTER_PASSWORD='secretoreplicacion', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=1284, MASTER_PORT=3306;
A continuación iniciamos la replicación mediante el siguiente comando:
START SLAVE;
Mediante SHOW SLAVE STATUS podemos ver el estado del slave:
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.4.1 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 951 Relay_Log_File: mysqld-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: 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: 951 Relay_Log_Space: 407 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: 382 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec)
Veremos como poco a poco se va reduciendo el “Seconds_Behind_Master” hasta estar sincronizados con las escrituras que se hayan hecho mientras copiabamos los datafiles.
Seconds_Behind_Master: 0
A continuación, podemos hacer una prueba con los siguientes comandos en el master:
mysql> create database lolme; Query OK, 1 row affected (0.00 sec) mysql> use lolme; Database changed mysql> create table aaa(id int); Query OK, 0 rows affected (0.00 sec) mysql> insert into aaa values(2); Query OK, 1 row affected (0.00 sec)
A continuación en el slave podremos comprobar como se han replicado:
mysql> use lolme; Database changed mysql> select * from aaa; +------+ | id | +------+ | 2 | +------+ 1 row in set (0.00 sec)
11. August 2010 at 11:32 pm :
Muchas gracias me sera muy util para mi web.
12. April 2012 at 3:57 pm :
Hola, lo primero, felicidades por tu blog, me encanta.
Quería hacer una pregunta que te resultará obvia pero que te estaría muy agradecido si contestases.
Este esquema master-slave nos aporta cierta tranquilidad al tener los datos duplicados pero…
¿qué pasa si se cae el master? ¿qué pasos habría que seguir? Por ejemplo, ¿simplemente valdría con configurar las aplicaciones para que tiren del esclavo o habría que “deshacer” la configuración y convertir el esclavo en maestro?
13. April 2012 at 8:05 am :
Hola,
Depende un poco de lo que quieras hacer luego con el server caído. Si el site puede trabajar en “read-only” puedes hacer que la aplicación vaya contra el slave. Sino debes quitar el read_only del MySQL y eliminar toda la configuración e datos del slave que tengas (master.info, relay-log.info y los mysqld-relay-bin.*) para promocionarlo a master.
saludos,
17. April 2012 at 11:16 am :
Muchas gracias por tu respuesta!!
18. April 2012 at 11:59 am :
Igual este post sobre una migración usando el slave como master te aclara un poco más la cosa
saludos,
25. April 2012 at 12:51 pm :
Pues si, lo había visto porque sigo el blog con asiduidad, muchas gracias!!
2. January 2013 at 3:04 pm :
Muchas gracias por el tutorial, pero no me salió, quisiera saber si tienen que ver las distribuciones de linux? porque tengo fedora, y quise replicar de un servidor de ubuntu.
saludos
7. February 2014 at 3:46 am :
Disculpa amigo una pregunta, por cierto muy buen post
pero tengo una duda es que como le hago q me muestre en el master los registros(INSERT INTO DB VALUES) que me genera el slave ( le di permiso de lectura y escritura) solo con updates o hay otra forma
27. February 2015 at 5:58 pm :
Oye podrias decirme como se diferencia una replicacion instantanea de una replicacion transaccional dentro del archivo my.cnf
1. March 2015 at 11:51 pm :
La verdad es que no entiendo la pregunta, ¿puedes repetirla con otras palabras?
12. May 2015 at 12:00 am :
Hola. Muy concreto tu despliegue para el montaje de la replicación, de lo más claro que he visto hasta ahora, felicitaciones.
Va mi consulta. Debo mover el contenedor de datos de un esclavo, de disco E: …bla bla… a disco H: bla bla… al mover el contenedor no me levanta el MySQL, y es porque sigue estando atado al Master por alguna ruta que no estoy moviendo. Ahora lo que yo quiero es DESACTIVAR POR COMPLETO el esclavo. No consigo hacerlo. Alguna recomendación. Gracias.
12. May 2015 at 12:15 am :
Lo conseguí. Se deben eliminar los archivos de configuracion .info y todos los binary logs. Se encuentran en la carpeta \DATA\ de la configuración del MySQL. Luego se arranca el Server y funciona. Saludos.
11. April 2016 at 9:48 pm :
que onda amigo en que versión de mysql y si es replicacion instantánea o transaccional