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.
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ámetro | Dónde configurar | Función |
|---|---|---|
server-id | Master y slave | Identificador único obligatorio para cada instancia |
gtid_mode | Master y slave | Habilita el rastreo de transacciones por GTID |
read_only | Slave | Impide la escritura accidental directa en el slave |
binlog_format | Master | ROW es el más seguro para una replicación consistente |
MASTER_AUTO_POSITION | Slave | Usa 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):
- Confirma que el master realmente está indisponible (no es solo lentitud de red).
- En el slave, ejecuta
STOP SLAVE;y luegoRESET SLAVE ALL;para sacarlo del modo réplica. - Desactiva
read_only(SET GLOBAL read_only = OFF;). - Reapunta la connection string del GameServer y del panel web a la IP del (ahora ex-)slave.
- 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íntoma | Causa probable | Solución |
|---|---|---|
Slave_SQL_Running: No después de iniciar | Divergencia de datos entre master y slave en el volcado inicial | Rehaz el volcado con --single-transaction --gtid y reimpórtalo |
| La replicación se detiene tras reiniciar el slave | GTID no persistido correctamente | Confirma gtid_mode = ON en ambos antes de reiniciar |
| Lag creciente constante | Hardware del slave inferior al del master | Aumenta los recursos del slave o reduce la carga de lectura en él |
| Una escritura accidental rompió la réplica | read_only no configurado en el slave | Activa read_only = ON y rehaz el volcado si es necesario |
| El volcado inicial trabó al GameServer | mysqldump sin --single-transaction en tabla InnoDB | Usa siempre --single-transaction para tablas InnoDB |
| La promoción del slave tardó demasiado | Ausencia de un procedimiento documentado | Documenta 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 --gtidy restaurado en el slave. SHOW SLAVE STATUSconfirmando que los threads IO y SQL están funcionando.read_onlyactivado 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.