El mayor portal de MU Online de Brasil — desde 2003
Tutorial Avanzado Infraestructura

Replicación MySQL Master-Slave para servidores de MU Online

Configura paso a paso la replicación MySQL Master-Slave para la base de datos de tu servidor de MU Online, con GTID, monitoreo de lag y procedimiento de promoción del slave en caso de falla del master.

RO Rodrigo · Actualizado el 31 ene 2024 · ⏱ 17 min de lectura
Respuesta rápida

La replicación MySQL Master-Slave es la técnica más usada para dar redundancia y distribuir la carga de lectura en servidores de MU Online que ya superaron la etapa inicial y necesitan más confiabilidad. A diferencia de un backup estático, la réplica se mantiene constantemente sincronizada con la ba

La replicación MySQL Master-Slave es la técnica más usada para dar redundancia y distribuir la carga de lectura en servidores de MU Online que ya superaron la etapa inicial y necesitan más confiabilidad. A diferencia de un backup estático, la réplica se mantiene constantemente sincronizada con la base principal, permitiendo tanto contingencia contra fallas como alivio de carga en consultas pesadas. Este tutorial detalla la configuración completa usando GTID (el método recomendado actualmente), el monitoreo de lag y el procedimiento de promoción del slave.

Qué es la replicación Master-Slave y cuándo tiene sentido implementarla

En la replicación Master-Slave, el servidor master recibe todas las escrituras (todo lo que el GameServer registra: inicio de sesión, creación de personaje, movimiento de objetos, subida de nivel) y registra cada transacción en un log binario (binlog). El servidor slave lee ese binlog continuamente y aplica los mismos cambios en su propia copia de la base de datos. Tiene sentido implementarla cuando el servidor ya tiene una población estable, cuando las consultas administrativas/informes empiezan a impactar el rendimiento de la base principal, o como base para un plan de contingencia más serio que solo backups periódicos.

Requisitos técnicos previos

  • Dos instancias de MySQL/MariaDB en la misma versión mayor (evita incompatibilidades de replicación).
  • Red confiable entre los dos servidores, idealmente privada/VPN.
  • Espacio en disco en el slave equivalente o mayor al del master.
  • Acceso root a ambas instancias para la configuración inicial.
  • Ventana de mantenimiento de bajo movimiento para el volcado inicial.

Habilitando GTID en el servidor master

GTID (Global Transaction Identifier) simplifica drásticamente la configuración y la recuperación de la replicación, eliminando la necesidad de rastrear manualmente el archivo y la posición del binlog. En el my.cnf del master:

[mysqld]
server-id = 1
log_bin = mysql-bin
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_format = ROW

Reinicia el servicio MySQL después del cambio.

Creando el usuario de replicación

CREATE USER 'repl_mu'@'%' IDENTIFIED BY 'SenhaForteReplicacao456';
GRANT REPLICATION SLAVE ON *.* TO 'repl_mu'@'%';
FLUSH PRIVILEGES;

Restringe el % a la IP específica del slave siempre que sea posible, reduciendo la superficie de ataque de este usuario privilegiado.

Haciendo el volcado inicial de la base de datos

Con el master aún en funcionamiento, genera un volcado consistente incluyendo la posición de GTID:

mysqldump --all-databases --single-transaction --gtid --master-data=2 \
  -u root -p > dump_inicial_mu.sql

La bandera --single-transaction evita un bloqueo prolongado en tablas InnoDB (el motor predeterminado de las tablas de cuentas en la mayoría de los emuladores), reduciendo el impacto en el GameServer durante la exportación.

Restaurando el volcado en el slave

Transfiere el archivo al servidor slave e impórtalo:

scp dump_inicial_mu.sql usuario@ip_do_slave:/tmp/
mysql -u root -p < /tmp/dump_inicial_mu.sql

Configurando el slave con GTID

En el my.cnf del slave:

[mysqld]
server-id = 2
log_bin = mysql-bin
gtid_mode = ON
enforce_gtid_consistency = ON
read_only = ON

Reinicia el MySQL del slave y configura la conexión con el master:

CHANGE MASTER TO
  MASTER_HOST='ip_do_master',
  MASTER_USER='repl_mu',
  MASTER_PASSWORD='SenhaForteReplicacao456',
  MASTER_AUTO_POSITION = 1;
START SLAVE;

Validando el funcionamiento de la replicación

SHOW SLAVE STATUS\G

Confirma Slave_IO_Running: Yes, Slave_SQL_Running: Yes y observa Seconds_Behind_Master. Una prueba práctica adicional es crear un personaje de prueba en el GameServer conectado al master y verificar, pocos segundos después, si el registro aparece en el slave mediante una consulta directa.

Tabla de parámetros importantes de configuración

ParámetroDónde configurarFunción
server-idMaster y slaveIdentificador único obligatorio para cada instancia
gtid_modeMaster y slaveHabilita el rastreo de transacciones por GTID
read_onlySlaveImpide la escritura accidental directa en el slave
binlog_formatMasterROW es el más seguro para una replicación consistente
MASTER_AUTO_POSITIONSlaveUsa GTID en vez de posición manual de binlog

Monitoreando el lag de replicación continuamente

Configura un script simple que se ejecute cada minuto y alerte si Seconds_Behind_Master supera un límite aceptable (recomendación: 5-10 segundos para servidores de MU, donde la experiencia del jugador depende de datos actualizados rápidamente):

#!/bin/bash
LAG=$(mysql -u root -p"senha" -e "SHOW SLAVE STATUS\G" | grep Seconds_Behind_Master | awk '{print $2}')
if [ "$LAG" -gt 10 ]; then
  echo "ALERTA: lag de replicación en ${LAG}s" | ./notify_discord.sh
fi

Usando el slave para aliviar la carga de lectura

Después de validar la replicación, redirige las consultas de lectura no críticas al slave: informes administrativos del panel web, rankings, consultas de auditoría y estadísticas. Mantén todas las escrituras y lecturas críticas en tiempo real (inicio de sesión, verificación de objeto durante un intercambio) apuntando al master, ya que el slave puede tener algunos segundos de atraso.

Procedimiento de promoción del slave en caso de falla del master

Cuando el master falla, el slave debe promoverse manualmente (sin una herramienta de orquestación automatizada):

  1. Confirma que el master realmente está indisponible (no es solo lentitud de red).
  2. En el slave, ejecuta STOP SLAVE; y luego RESET SLAVE ALL; para sacarlo del modo réplica.
  3. Desactiva read_only (SET GLOBAL read_only = OFF;).
  4. Reapunta la connection string del GameServer y del panel web a la IP del (ahora ex-)slave.
  5. En cuanto el antiguo master vuelva, reconfigúralo como slave del nuevo master antes de reintroducirlo, nunca al revés.

Errores comunes y soluciones

SíntomaCausa probableSolución
Slave_SQL_Running: No después de iniciarDivergencia de datos entre master y slave en el volcado inicialRehaz el volcado con --single-transaction --gtid y reimpórtalo
La replicación se detiene tras reiniciar el slaveGTID no persistido correctamenteConfirma gtid_mode = ON en ambos antes de reiniciar
Lag creciente constanteHardware del slave inferior al del masterAumenta los recursos del slave o reduce la carga de lectura en él
Una escritura accidental rompió la réplicaread_only no configurado en el slaveActiva read_only = ON y rehaz el volcado si es necesario
El volcado inicial trabó al GameServermysqldump sin --single-transaction en tabla InnoDBUsa siempre --single-transaction para tablas InnoDB
La promoción del slave tardó demasiadoAusencia de un procedimiento documentadoDocumenta y entrena al equipo en el paso a paso de la promoción

Lista de verificación de replicación MySQL Master-Slave

  • GTID habilitado en master y slave (gtid_mode = ON).
  • Usuario de replicación creado con el permiso mínimo necesario.
  • Volcado inicial hecho con --single-transaction --gtid y restaurado en el slave.
  • SHOW SLAVE STATUS confirmando que los threads IO y SQL están funcionando.
  • read_only activado en el slave para prevenir escritura accidental.
  • Monitoreo de lag configurado con alerta automática.
  • Procedimiento de promoción del slave documentado y probado.
  • Parte de las lecturas administrativas redirigidas al slave.

Con la replicación funcionando, el siguiente paso es integrar esto a un plan general de contingencia de infraestructura, cubriendo también el GameServer y el ConnectServer — el tutorial de creación de servidor de MU Online trae la base completa para quien esté estructurando o revisando este entorno.

Preguntas frecuentes

¿Cuál es la diferencia entre la replicación basada en posición de log y GTID?

La replicación por posición de log (archivo binlog + posición) exige que indiques manualmente el archivo y la posición exacta al configurar el slave, lo cual es frágil y propenso a errores. GTID (Global Transaction Identifier) identifica cada transacción de forma única, permitiendo un failover y una reconfiguración mucho más simples y confiables, siendo la opción recomendada para instalaciones nuevas.

¿El slave puede usarse para quitar carga de lectura del master?

Sí, esa es una de las grandes ventajas de la replicación además de la redundancia. Informes, consultas administrativas pesadas e incluso parte de las lecturas del panel web pueden dirigirse al slave, reduciendo la carga en el master que atiende al GameServer en tiempo real.

¿Es necesario detener el GameServer durante la configuración inicial de la replicación?

No necesariamente, pero es más seguro hacerlo en horario de bajo movimiento. El proceso de volcado inicial del master para poblar el slave puede causar un bloqueo temporal de tablas dependiendo del método usado (mysqldump con --lock-tables), lo que puede generar lentitud perceptible durante la copia.

¿Cuánto atraso (lag) entre master y slave es aceptable?

Para la mayoría de los servidores de MU, un lag por debajo de 2-5 segundos se considera saludable. Un lag consistente por encima de 30 segundos indica que el slave no está siguiendo el volumen de escritura del master y merece investigación, ya sea por hardware insuficiente o queries lentas.

¿La replicación MySQL por sí sola garantiza alta disponibilidad automática?

No. La replicación por sí sola solo mantiene una copia sincronizada; la promoción del slave a master en caso de falla debe hacerse manualmente o a través de una herramienta adicional de orquestación, como Orchestrator o ProxySQL con detección de failover.

RO
Fundador y editor jefe

Rodrigo mantiene ViciadosMU desde los inicios del portal. Especialista en creación y administración de servidores de MU Online, historia del juego y la evolución de las seasons — escribió buena parte del archivo antes de 2024.

Sigue leyendo

Artículos relacionados