GUIA, montar y configurar una replicación maestro/esclavo de BD en MariaDB / MySQL

galansinchance

enajenao
Se incorporó
3 Enero 2006
Mensajes
7.423
Hola!

Hoy en cocinando con galansinchance, les cuento una guía de algo que tuve que hacer hace poco, y que me pareció interesante compartirlo con ustedes:

Me refiero a montar un servidor con una réplica esclava de base de datos, lo que nos permite, por ejemplo, distribuir la carga de lectura entre una o varias máquinas de la misma base de datos, mantener un backup en caliente (ojo, como buena práctica nunca reemplazar los respaldos periódicos con esto!), dar continuidad operacional, etc etc.

Para este caso la máquina principal o maestra escribe las transacciones efectuadas en su sus BDs en un log binario, el que es replicado hacia una o más máquinas esclavas, las que se actualizan de forma asincrónica.

Ahora, esto es unidireccional, es decir, todas las cosas que ocurren en el maestro se replica hacia los otros servidores, pero lo que ocurre en estos últimos no se hacen efectivas en el maestro, si desean hacerlo bidireccional, el esquema debe ser circular, es decir, cada servidor, es maestro y esclavo del otro al mismo tiempo.

Imaginemos 2 equipos con la siguiente configuración:

IP servidor maestro: 10.0.0.10
IP servidor esclavo: 10.0.0.11

Configurando el servidor maestro:
Se edita el archivo de configuración del servicio
Código:
# vi /etc/mysql/mysql.conf/mysqld.cnf #(para el caso de mysql)
# vi /etc/mysql/mariadb.conf.d/50-server.cnf #(para el caso de mariadb)

buscar en el archivo y editar, descomentar o añadir en caso que no estén los siguientes parámetros de configuración (la dirección del server maestro, el id del servicio y dónde se guardarán los registros):

Código:
bind-address = 10.0.0.10
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log

Reiniciamos el servicio mysql
Código:
# systemctl restart mysql

Creamos un usuario usuario para replicación
Código:
# mysql -u root -p
mysql> CREATE USER 'backup'@'%' IDENTIFIED BY 'backuppasswd';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%';
mysql> FLUSH PRIVILEGES;

Bloqueamos temporalmente las tablas
Código:
mysql> FLUSH TABLES WITH READ LOCK;

Registramos la posición de estado del servicio de base de datos de la máquina maestra para indicarle al server de base de datos esclava qué archivo y desde dónde debe comenzar a sincronizarse

Código:
mysql> SHOW MASTER STATUS;
+-------------------------+-----------+---------------------+-------------------------+---------------------------+
| File                    | Position  | Binlog_Do_DB  | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+---------------------+-------------------------+---------------------------+
| mysql-bin.000001        |613      |                            |                                 |                                   |
+-------------------------+----------+---------------------+-------------------------+---------------------------+

Ahora, guardamos la información anterior y volcamos la base de datos a un archivo

Código:
$ mysqldump -u root -p --all-databases --master-data > dbdump.sql

Desbloqueamos las tablas de la base de datos maestra para que puedan seguir usándose

Código:
mysql> UNLOCK TABLES;

Configurando el servidor esclavo

Desde el servidor maestro, copiamos el respaldo de la base de datos al servidor esclavo
Código:
$ scp [email protected]:/ubicacion/de/respaldo/dbdump.sql /home/usuario_esclavo/

Cambiamos la configuración del servidor esclavo en el archivo mysqld.cnf
Código:
# vi /etc/mysql/mysql.conf/mysqld.cnf #(para el caso de mysql)
# vi /etc/mysql/mariadb.conf.d/50-server.cnf #(para el caso de mariadb)

buscamos en el archivo y editamos, descomentamos o añadimos en caso que no estén los siguientes parámetros de configuración (la dirección del server esclavo, el id del servicio y dónde se guardarán los registros):

Código:
bind-address = 10.0.0.11
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log

Reiniciamos los servicios del servidor esclavo
Código:
# systemctl restart mysql

Importamos el backup que copiamos del servidor maestro en el servidor esclavo
Código:
$ mysql -u root -p < /home/usuario/dbdump.sql

Configuramos al interior del servidor esclavo para que se sincronice con el maestro, fíjense que en MASTER_LOG_FILE y MASTER_LOG_POS deben ir los valores del archivo y posición de la última transacción registrada en el server maestro antes del respaldo que realizamos, el server esclavo desde esa posición en adelante se sincronizará
Código:
$ mysql -u root -p
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.0.0.10',
-> MASTER_USER='backup',
-> MASTER_PASSWORD='backuppasswd',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=613;
mysql> START SLAVE;

Podremos probar la configuración insertando algo o modificando una tabla o base de datos en el servidor maestro, y comprobar que la acción se refleje en el servidor esclavo.

También podemos ver el estado del servidor esclavo con:

Código:
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 10.0.0.10
  Master_User: backup
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysql-bin.000001
  Read_Master_Log_Pos: 936
  Relay_Log_File: mysqld-relay-bin.000003
  Relay_Log_Pos: 4
  Relay_Master_Log_File: mysql-bin.000001
  Slave_IO_Running: No
  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: 936
  Relay_Log_Space: 249
  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: 231
  Master_SSL_Verify_Server_Cert: No
  Last_IO_Errno: 0
  Last_IO_Error:
  Last_SQL_Errno: 0
  Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
  Master_Server_Id: 1
  Master_SSL_Crl:
  Master_SSL_Crlpath:
  Using_Gtid: No
  Gtid_IO_Pos:
  Replicate_Do_Domain_Ids:
  Replicate_Ignore_Domain_Ids:
  Parallel_Mode: conservative

Si no hay errores les aparecería un response como este, indicando en el estado que está esperando información desde el master y sin errores IO o SQL, por otro lado, hay un indicador que es Seconds_Behind_Master, que indica el tiempo en segundos de desface que tiene respecto del server, este tiempo va disminuyendo en la medida que todos los registros que ocurren en el maestro se van cargando en el esclavo.

Dónde podrían tener problemas:
1.- Los equipos no se ven en red
2.- El firewall tiene filtrado el acceso a los servidores
3.- Se equivocaron con el nombre del archivo o la posición de la transacción en el log.
4.- Selinux podría en algún caso poner problemas, aunque no me ha pasado.

Saludos!
 
Última modificación:

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.721
Buen aporte.

Oye @galansinchance , ¿cuál es el parámetro en donde indicas el tiempo de replicación? Ese parámetro está directamente relacionado con el RPO.
 
Upvote 0

galansinchance

enajenao
Se incorporó
3 Enero 2006
Mensajes
7.423
Buen aporte.

Oye @galansinchance , ¿cuál es el parámetro en donde indicas el tiempo de replicación? Ese parámetro está directamente relacionado con el RPO.
Hola, la replicación es "instantánea" en el sentido que apenas el server master ejecuta una transacción, propaga esto al o a los servidores esclavos. Cada transacción queda registrado en un binary log con un código asociado, imagino debe ser correlativo, esto está pensado en poder distribuir la información en línea, el desfase ocurre en realidad cuando tienes un sistema productivo, lo detienes para configurar el maestro, obtienes el número de registro y luego sigue operando mientras configuras el esclavo.

Respecto al RPO, desconozco qué herramientas y estrategias de RPO tiene (al menos la versión comunitaria) mysql/mariadb.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.721
El RPO es una definición de negocios, significa cuanta data puede perder el negocio en caso de desastre. Por ejemplo, si la replicación es cada 15 minutos, ante un desastre podrías perder 15 minutos de datos. Ese es el RPO, 15 minutos.


Ya, ¿la replicación de datos es con herramientas propias de MySql? Es decir, cuando se finaliza una transacción (por ejemplo, mil inserts con un commit al final), ¿el master va y replica esos mil inserts? ¿O se hace a bajo nivel aplicando los cambios leídos en el log binario del master? Sorry, estoy pensando en modo Oracle.
 
Upvote 0

galansinchance

enajenao
Se incorporó
3 Enero 2006
Mensajes
7.423
Buenísima, no tenía bien claro lo del RPO.

Respecto a la replicación se hace a bajo nivel aplicando los cambios leídos en el log binario del master.

Saludos.
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.442
¿Cómo viajan los cambios del log binario del master al esclavo?

Mediante un protocolo que creo es propio de mysql. El esclavo simplemente ejecuta sql plano. De hecho es bastante simple leer el log binario con las herramientas adecuadas.

@galansinchance wena guía te mandaste!

Selinux jamás me ha dado problemas, mientras el data_dir esté bien configurado no habría cómo echarse a perder la replicación.


Sent from my iPhone using Tapatalk
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.721
Mediante un protocolo que creo es propio de mysql. El esclavo simplemente ejecuta sql plano. De hecho es bastante simple leer el log binario con las herramientas adecuadas.

@galansinchance wena guía te mandaste!

Selinux jamás me ha dado problemas, mientras el data_dir esté bien configurado no habría cómo echarse a perder la replicación.

¿Y cómo sabe el esclavo cuando tiene que aplicar los logs?
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.442
¿Y cómo sabe el esclavo cuando tiene que aplicar los logs?

Mantiene esa información en information tables ,mediante un "Show slave status" puedes ver en qué posición está actualmente y a cuál archivo corresponde. Es importante eso si que el master guarde los suficientes logs en caso de interrupciones largas, cuánto va a depender netamente de tu app y capacidades del servidor.

Lo otro que recomiendo encarecidamente es tener al menos 2 slaves, para que puedas pausar uno de ellos a modo de respaldo y en caso de desastre.

Saludos.


Sent from my iPhone using Tapatalk
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.721
Mantiene esa información en information tables ,mediante un "Show slave status" puedes ver en qué posición está actualmente y a cuál archivo corresponde. Es importante eso si que el master guarde los suficientes logs en caso de interrupciones largas, cuánto va a depender netamente de tu app y capacidades del servidor.

Lo otro que recomiendo encarecidamente es tener al menos 2 slaves, para que puedas pausar uno de ellos a modo de respaldo y en caso de desastre.

Saludos.

Pero es un proceso del esclavo que consulta esa tabla cada... no se... ¿10 segundos?
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.442
Mantiene esa información en information tables ,mediante un "Show slave status" puedes ver en qué posición está actualmente y a cuál archivo corresponde. Es importante eso si que el master guarde los suficientes logs en caso de interrupciones largas, cuánto va a depender netamente de tu app y capacidades del servidor.

Lo otro que recomiendo encarecidamente es tener al menos 2 slaves, para que puedas pausar uno de ellos a modo de respaldo y en caso de desastre.

Saludos.


Sent from my iPhone using Tapatalk

Pd: de otra forma tendrás que pausar el master, mala idea jajajaj


Sent from my iPhone using Tapatalk
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.442
Pero es un proceso del esclavo que consulta esa tabla cada... no se... ¿10 segundos?

No, mantiene una conexión abierta al master 24/7, en unos 60ms (dependiendo de latencia, implicaciones de la query y otros factores muchos más complejos) debería ejecutar la query en todos los esclavos.


Sent from my iPhone using Tapatalk
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.721
No, mantiene una conexión abierta al master 24/7, en unos 60ms (dependiendo de latencia, implicaciones de la query y otros factores muchos más complejos) debería ejecutar la query en todos los esclavos.


Sent from my iPhone using Tapatalk

Ah, entonces el esclavo está a cada rato (¿cada 1 segundo o menos?) preguntándole si le falta por aplicar un log binario. ¿Eso es?
 
Upvote 0

galansinchance

enajenao
Se incorporó
3 Enero 2006
Mensajes
7.423
Ah, entonces el esclavo está a cada rato (¿cada 1 segundo o menos?) preguntándole si le falta por aplicar un log binario. ¿Eso es?
Depende ya que son configurables, el modo por defecto es una comunicación bidireccional, cuando hay una nueva transacción el maestro difunde la réplica a los esclavos y a su vez los esclavos verifican en su binary log el estado local, el del master y se sincronizan.

Hay un modo synced, semisynced y delayed y ahí todo depende de las necesidades.

https://dev.mysql.com/doc/refman/8.0/en/replication.html


Saludos.

Enviado desde mi SM-G925I mediante Tapatalk
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.396
nosotros tenemos configurado mariadb con prácticamente todas las opciones de seguridad, en nuestro caso en el master la transaccion no se considera comiteada hasta que no esta en la tabla y el binary log de la replicacion.
Una vez esta en el binary log del master este se envia al slave, el slave comprueba que tiene nuevos "eventos" en el log de la replicacion y comienza a aplicarlos. Si la conexion entre el slave y el master se muere mientras esta transfiriendo no hay problema, cuando se restablece el slave le informa al master cual fue el ultimo evento que proceso y este comienza a enviar desde alli.
Si el master tiene mil insert el slave replica los mil insert 1 por uno (ojo que eso puede causar una brutalidad de io en el slave). En nuestro caso el log binario guarda los ultimos 30 dias, es gordito pero lo vale.
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.442
Ah, entonces el esclavo está a cada rato (¿cada 1 segundo o menos?) preguntándole si le falta por aplicar un log binario. ¿Eso es?

No simplemente escucha via sockets. Master transmite, os le informa al proceso que hubo una modificación en el log local y proceso aplica los cambios.

Sin duda alguna debe ser algo así como inotifywait, pero orientado específicamente a la situación de mysql en particular.


Sent from my iPhone using Tapatalk
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
777
Lo bueno también es que luego el slave puede pasar a ser master en el caso que algo le pase a la maquina del master.
 
Upvote 0

Amenadiel

Ille qui nos omnes servabit
Fundador
OVERLORD
REPORTERO
Se incorporó
15 Enero 2004
Mensajes
18.398
Me encanta MariaDB pero la falta de soporte para operaciones geométricas es un No-Go para apps que, bueno, ocupen operaciones geométricas.

Sent from my HMA-L29 using Tapatalk
 
Upvote 0

galansinchance

enajenao
Se incorporó
3 Enero 2006
Mensajes
7.423
Me encanta MariaDB pero la falta de soporte para operaciones geométricas es un No-Go para apps que, bueno, ocupen operaciones geométricas.

Sent from my HMA-L29 using Tapatalk
Lo bueno de las herramientas actuales es que, el año pasado, la plataforma que teníamos operando estaba funcionando sobre MariaDB, y tuvimos que integrarnos con otra plataforma que usaba precisamente operaciones geométricas y particularmente geográficas, cuento corto, estuvimos obligados a abandonar MariaDB, y pasarnos a Posgres en producción, la migración partió un viernes en la tarde y el lunes en la mañana ya estábamos andando en producción con Pg. Una maravilla.
 
Upvote 0
Subir