PROXYSQL: LA SOLUCIÓN DE ALTO RENDIMIENTO PARA GESTIONAR EL TRÁFICO DE BASES DE DATOS MYSQL

ProxySQL es un proxy de bases de datos open source, de alto rendimiento y protocol-aware. Diseñado principalmente para MySQL, MariaDB, Percona Server. Actúa como intermediario inteligente entre las aplicaciones cliente y los servidores de bases de datos, permitiendo load balancing, enrutamiento avanzado de consultas, connection multiplexing, caché de consultas y mucho más, sin necesidad de modificar el código de las aplicaciones.

¿Por qué usar ProxySQL?

A diferencia de proxies TCP genéricos como HAProxy (nivel 4), ProxySQL permite inspeccionar, analizar y manipular consultas SQL individuales. Esto abre un mundo de posibilidades:
  • Connection Multiplexing: Maneja decenas o cientos de miles de conexiones de clientes usando solo unos cientos de conexiones al backend. Ideal para aplicaciones con alto grado de concurrencia.
  • Read/Write Splitting: Enruta automáticamente las lecturas a réplicas y las escrituras al primario.
  • Query Routing Avanzado: Reglas basadas en regex, usuario, esquema, tabla, digest de consulta, etc.
  • Query Caching: Almacena resultados en el proxy para reducir carga en la base de datos.
  • Firewall SQL: Bloquea o reescribe consultas peligrosas como protección contra SQL injection, etc..
  • Sharding transparente: Distribuye datos sin cambiar la aplicación.
  • Zero-downtime: Cambios de configuración en tiempo real sin reinicios.
  • Failover automático y detección de salud de backends.

Arquitectura principal

ProxySQL utiliza un modelo multi-threaded asíncrono y event-driven. Cuenta con:
  • Hilos de trabajo o workers para manejar tráfico de clientes.
  • Hilos de monitorización para chequear la salud de los servidores backend.
  • Interfaz de administración SQL, puerto 6032 por defecto, que permite configurar todo mediante sentencias SQL.
  • Base de configuración interna en SQLite.
Todo se puede modificar en tiempo de ejecución y cargarse con comandos como "LOAD ... TO RUNTIME" y "SAVE ... TO DISK".

ProxySQL vs Alternativas

Característica ProxySQL HAProxy MySQL Router MaxScale
Protocol-aware (L7) No (L4)
Connection Multiplexing Excelente No Limitado Bueno
Query Routing / Reglas Muy avanzado Básico Básico Avanzado
Query Cache No No
Zero-downtime config Reinicio Variable Bueno
SQL Firewall No Limitado
ProxySQL destaca especialmente en entornos donde se necesita controlar una a una las consultas SQL.

Ejemplo simple de configuración

-- Añadir servidores backend
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES 
(10, '192.168.1.10', 3306),  -- Writer
(20, '192.168.1.11', 3306),  -- Reader
(20, '192.168.1.12', 3306);

-- Regla básica Read/Write Split
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply)
VALUES (1, 1, '^SELECT', 20, 1),
  (2, 1, '^', 10, 1);  -- Todo lo demás al writer

LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
  • "LOAD MYSQL SERVERS TO RUNTIME;": Carga la configuración de los servidores MySQL que están en la base de datos de ProxySQL a la memoria activa, Es decir, aplica los cambios realizados hecho en la tabla "mysql_servers". Sin este comando, los cambios en servidores no tienen efecto inmediato.
  • "LOAD MYSQL QUERY RULES TO RUNTIME;": Carga las reglas de consultas desde la base de datos a la memoria activa. Este comando que activa las reglas de routing, firewall, reescritura, caché, etc.
  • "SAVE MYSQL SERVERS TO DISK;": Guarda la configuración actual de servidores en disco, en archivos de configuración persistentes. Sin este comando se perderán los cambios de servidores al reiniciar ProxySQL, se perderán los cambios de servidores.
  • "SAVE MYSQL QUERY RULES TO DISK;": Guarda las reglas de consultas en disco. También es necesario para que las reglas no se pierdan al reiniciar ProxySQL.