Programación y sistemas

ProxySQL Binlog Reader: Garantizando lecturas consistentes en MySQL

Imagen de cabecera para ProxySQL

En sistemas distribuidos que manejan bases de datos a gran escala, la consistencia de las lecturas es uno de los retos más importantes a superar. Cuando múltiples nodos están replicando datos en tiempo real, puede ser complicado garantizar que las lecturas reflejen siempre los datos más recientes. En este contexto, ProxySQL Binlog Reader se destaca como una solución efectiva para lograr lecturas consistentes en entornos MySQL.

En este artículo exploraremos qué es el ProxySQL Binlog Reader, cómo funciona, se instala y configura, y por qué es esencial para mantener la consistencia en sistemas de replicación MySQL.

¿Qué es el ProxySQL Binlog Reader?

ProxySQL es un proxy de alto rendimiento para bases de datos MySQL, ampliamente utilizado para mejorar la escalabilidad, disponibilidad y fiabilidad de los sistemas que gestionan grandes volúmenes de datos. Dentro de sus numerosas funcionalidades, Binlog Reader es una característica clave que permite al proxy monitorear el binlog (log binario) de MySQL en los servidores de réplicas para garantizar lecturas consistentes.

En un entorno de replicación, los datos se escriben en el servidor primario y luego se replican en los servidores secundarios (réplicas). Sin embargo, debido a los retrasos en la replicación, una consulta de lectura a una réplica puede devolver datos obsoletos, lo que puede ser problemático para aplicaciones que requieren datos actualizados de inmediato. Aquí es donde entra en juego el Binlog Reader de ProxySQL.

¿Cómo funciona ProxySQL Binlog Reader?

El binlog en MySQL es un registro de todas las modificaciones a la base de datos (inserciones, actualizaciones y eliminaciones) realizadas en el servidor primario. Las réplicas utilizan este binlog para sincronizarse con el primario y reflejar los cambios.

El ProxySQL Binlog Reader se conecta al binlog de las réplicas y monitorea continuamente su progreso. Con esta información, ProxySQL puede determinar qué réplicas están al día con las últimas transacciones registradas en el servidor primario y, de esta manera, garantizar que las lecturas provengan de réplicas actualizadas.

Cuando se requiere una lectura consistente, ProxySQL consulta el binlog para verificar qué réplicas han replicado las transacciones más recientes. Solo envía la consulta a una réplica que haya procesado todas las transacciones necesarias, evitando la posibilidad de lecturas de datos obsoletos. Esto asegura que los datos leídos sean siempre consistentes con el último estado del servidor primario, sin retrasos significativos.

Beneficios de ProxySQL Binlog Reader para lecturas consistentes

  1. Garantía de consistencia en tiempo real: Al utilizar ProxySQL Binlog Reader, puedes estar seguro de que las lecturas en réplicas reflejan los datos más recientes del servidor primario. Esto es crucial en aplicaciones que no pueden tolerar inconsistencias, como las transacciones financieras, las plataformas de comercio electrónico o cualquier sistema que requiera precisión en tiempo real.
  2. Optimización del rendimiento: Con ProxySQL, puedes continuar distribuyendo las consultas de lectura entre las réplicas, lo que mejora el rendimiento general del sistema al reducir la carga en el servidor primario. El Binlog Reader permite realizar esta distribución sin comprometer la consistencia, ya que solo selecciona réplicas que estén completamente sincronizadas.
  3. Reducción del riesgo de datos obsoletos: Las aplicaciones que dependen de información precisa y actualizada pueden tener problemas graves si leen datos obsoletos. ProxySQL Binlog Reader mitiga este riesgo al garantizar que todas las réplicas seleccionadas para lecturas estén sincronizadas con el estado actual del servidor primario.
  4. Flexibilidad para diferentes escenarios de replicación: Esta característica es especialmente útil en entornos con replicación semisíncrona o asíncrona, donde las réplicas pueden no estar inmediatamente al día. ProxySQL Binlog Reader ajusta dinámicamente el enrutamiento de consultas para reflejar el estado de sincronización actual.

Detectar si la réplica está sincronizada con la fuente en base al último GTID procesado

Está técnica compara el GTID de la fuente con el GTID de la réplica, si no coinciden es que la réplica aun no se ha actualizado y por tanto hay que esperar y volver a intentarlo.

Para aplicar esta técnica ProxySQL nos provee de una pequeña aplicación llamada ProxySQL Binlog Reader que simplemente lo que hace es leer el GTID del binlog y lo envía a ProxySQL que es el encargado de redirigir las peticiones a la primera réplica que contenga el GTID de la fuente.

Instalar ProxySQL BinLog

Descarga el binario desde github:

wget - 0 https://github.com/sysown/proxysql_mysqlbinlog/releases/download/v2.1/proxysql-mysqlbinlog_2.1-5-g7f50bd0-debian11_amd64.deb

Ejecuta la herramienta de instalación:

dpkg -i proxysql-mysqlbinlog_2.1-5-g7f50bd0-debian11_amd64.deb

Levantar el servicio

Con el siguiente comando:

proxysql_binlog_reader -h (ip interna, no localhost) -urootdb -p(contraseña) -P 3306 -l3307 -L /var/log/proxysql_binlog_reader.log

El comando dispone de algunos parámetros que detallo a continuación:

  • h: Es el host de MySQL, tendrás que indicar la ip interna.
  • u: Es el usuario para conectar a MySQL.
  • p: Es la contraseña del usuario de MySQL.
  • P: Es el puerto para conectar a MySQL. Por defecto 3306.
  • l: Es el puerto que usará ProxySQL BinLog Reader para conectar con ProxySQL.
  • L: Es el fichero de log que usará el comando.

Configurar ProxySQL

Es necesario que los servidores en ProxySQL estén configurados para escuchar el puerto 3307:

UPDATE mysql_servers SET gtid_port = 3307;
LOAD MYSQL SERVERS TO RUNTIME; 
SAVE MYSQL SERVERS TO DISK;

Configurar MySQL

Y MySQL también necesita unos cambios en la configuración:

gtid_mode=ON
enforce_gtid_consistency=ON
session_track_gtids=OWN_GTID
binlog_format=ROW

Con esta configuración se activa el modo GTID, además en el formato de binlog debe ser «ROW«. Esta configuración tiene que estar en la fuente y las réplicas. Reinicia MySQL para aplicar los cambios de la configuración:

service mysql restart

Añadir la rotación de logs

Simplemente hay que añadir un fichero a /etc/logrotate.d para poder rotar el log de proxysql_binlog_reader con el siguiente contenido:

/var/log/proxysql_binlog_reader.log {
        rotate 7
        daily
        compress
        delaycompress
        missingok
        notifempty
}

Esto permite rotar los logs de forma diaria y mantener hasta siete ficheros de logs.

Asegurar que el servicio siempre está activo

Si por alguna razón el servicio se cae provocará que ProxySQL no pueda localizar una réplica a la que redirigir las peticiones de lectura. Para evitarlo, o al menos paliar el problema lo máximo posible vamos a añadir Supervisor a la instancia y lo usaremos para levantar el proceso en caso de caída.

Para ello primero instala SupervisorD, si no sabes cómo puedes leer el artículo de su instalación y configuración en Interadictos: Guía completa: Cómo instalar y configurar SupervisorD en tu servidor

Una vez instalado dirígete a /etc/supervisor/conf.d y crea un fichero .conf donde añadirás la siguiente configuración para controlar el proceso:

[program:proxysql_binlog_reader]
command=proxysql_binlog_reader -h (ip interna, no localhost) -urootdb -p(contraseña) -P 3306 -l3308 -L /var/log/proxysql_binlog_reader.log
process_name=%(program_name)
numprocs=1
startsecs=3
startretries=10
stopwaitsecs=300
exitcodes=2
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/%(program_name).log
user=root

Reinicia SupervisorD con:

service supervisor restart

Si ya habías ejecutado manualmente el comando para levantar el servicio, quizás ahora tengas dos procesos funcionando. Puedes matar ambos y además probar que SupervisorD está funcionando correctamente, ya que deberá detectar que no existe el proceso y levantarlo él mismo.

Comprobar que se envían correctamente los GTIDs de cada instancia a ProxySQL

En ProxySQL puedes ejecutar la siguiente consulta para comprobar qué GTIDs está recibiendo de cada instancia:

SELECT hostname,gtid_executed FROM stats_mysql_gtid_executed\G;

Conclusión

El ProxySQL Binlog Reader es una herramienta poderosa para cualquier entorno de base de datos MySQL que necesite garantizar lecturas consistentes en sistemas distribuidos y replicados. Al monitorear activamente los logs binarios y asegurarse de que solo se consultan réplicas actualizadas, ProxySQL mejora significativamente la fiabilidad de los datos, permitiendo a los desarrolladores y administradores de sistemas centrarse en mejorar el rendimiento sin comprometer la consistencia de los datos.

Si tu aplicación depende de la precisión de la información y no puedes permitir inconsistencias en las lecturas, integrar el Binlog Reader de ProxySQL es una solución altamente recomendada.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Descubre más desde Interadictos

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo