Entradas Mensuales

Síguenos en:

Canal Oficial Telegram de elhacker.NET Grupo Facebook elhacker.NET Twitter elhacker.NET Canal Youtube elhacker.NET Comunidad Steam: Grupo elhacker.NET Mastodon

Entradas populares

PostHeaderIcon ProxySQL: el HAProxy (servidores web) pero para servidores SQL (MySQL, MariaDB y PostgreSQL)


ProxySQL es un proxy de MySQL de alto rendimiento que se utiliza para gestionar y optimizar la conexión de aplicaciones a bases de datos MySQL, MariaDB o Percona XtraDB. Actúa como una capa intermedia entre las aplicaciones y los servidores MySQL, permitiendo una gestión eficiente del tráfico, mejorando el balanceo de carga, la conmutación por error (failover), y el rendimiento general de las consultas.





Principales funciones y características de ProxySQL

1. Balanceo de Carga (Load Balancing):

ProxySQL distribuye automáticamente el tráfico entre varios servidores de base de datos, mejorando la disponibilidad y el rendimiento. Puedes configurarlo para balancear tanto consultas de lectura como de escritura entre servidores maestros y esclavos.

2. Conmutación por Error Automática (Failover):

En caso de que un servidor MySQL falle, ProxySQL detecta automáticamente el fallo y redirige las consultas a otro servidor disponible, sin que la aplicación lo perciba, asegurando la continuidad del servicio.

3. Routing Inteligente:

ProxySQL permite definir reglas para redirigir consultas específicas a ciertos nodos. Por ejemplo, puedes enviar las lecturas a los nodos esclavos y las escrituras al nodo maestro. Esto optimiza el rendimiento de la base de datos al reducir la carga del nodo maestro.

4. Cacheo de Consultas:

ProxySQL tiene la capacidad de almacenar en caché las consultas de lectura, lo que mejora considerablemente el rendimiento al reducir el número de consultas repetidas que llegan a los servidores de base de datos.

5. Alta Disponibilidad (HA):

ProxySQL es compatible con configuraciones de alta disponibilidad. Puede ser desplegado en modo redundante, con varios proxys ejecutándose al mismo tiempo, lo que elimina puntos únicos de fallo.

6. Monitoreo y Estadísticas:

ProxySQL incluye herramientas para monitorear el tráfico y el rendimiento de las consultas SQL. Puedes obtener estadísticas en tiempo real sobre las conexiones, latencia y uso de recursos.

7. Compatibilidad con Clústeres y Replicación:

ProxySQL es compatible con soluciones de clúster como Percona XtraDB Cluster, Galera Cluster, y replicación estándar de MySQL. Gestiona de manera inteligente las topologías de replicación, asegurando que las lecturas se dirijan a nodos esclavos y las escrituras al nodo maestro o nodos de escritura.

 8. Reescritura de Consultas:

ProxySQL permite la reescritura de consultas SQL en tiempo real. Esto es útil para mejorar el rendimiento o modificar ciertas consultas sin cambiar la aplicación.

¿Cómo funciona ProxySQL?

 ProxySQL se coloca entre la aplicación y los servidores de base de datos. Su arquitectura está diseñada para manejar grandes volúmenes de tráfico y permitir la configuración de reglas personalizadas para dirigir y optimizar el tráfico SQL. Los flujos de trabajo típicos incluyen los siguientes pasos:

  • 1. Conexiones de la Aplicación: Las aplicaciones no se conectan directamente a los servidores MySQL, sino a ProxySQL. La conexión con ProxySQL se realiza usando las mismas credenciales y métodos de autenticación que la base de datos.
  • 2. Routing de Consultas: ProxySQL evalúa las consultas recibidas y las redirige según las reglas configuradas. Esto puede incluir la distribución de consultas de lectura a nodos esclavos o consultas de escritura al nodo maestro.
  • 3. Balanceo de Carga: Cuando hay múltiples servidores disponibles, ProxySQL distribuye las consultas SQL de manera eficiente entre ellos. Los algoritmos de balanceo de carga pueden configurarse para distribuir el tráfico de manera uniforme, basada en la carga actual de los servidores o el número de conexiones.
  • 4. Failover: ProxySQL monitorea continuamente el estado de los servidores de base de datos. Si un servidor falla, redirige automáticamente las consultas a los nodos restantes disponibles.
  • 5. Cacheo de Consultas: Si está habilitado, ProxySQL almacena en caché el resultado de consultas SQL de lectura, lo que evita realizar consultas repetitivas a la base de datos.

6. Monitoreo y Ajustes Dinámicos:

ProxySQL proporciona información en tiempo real sobre el rendimiento de las bases de datos y las consultas. Esto te permite ajustar las configuraciones de ProxySQL dinámicamente para mejorar el rendimiento, sin reiniciar el servicio.

Arquitectura de ProxySQL

ProxySQL tiene dos capas principales:

·         Frontend: Esta es la capa que recibe las conexiones de las aplicaciones. Los clientes se conectan a esta capa como si fuera un servidor MySQL estándar.

·         Backend: Es la capa que maneja las conexiones a los servidores MySQL. ProxySQL redirige las consultas desde el frontend a los servidores MySQL backend, siguiendo las reglas de balanceo de carga y reescritura de consultas definidas.

Implementación típica de ProxySQL

  • 1. Configuración de ProxySQL en un servidor independiente.
  • 2. Conexión de aplicaciones: Las aplicaciones apuntan a ProxySQL en lugar de directamente a los servidores de MySQL.
  • 3. Configuración de reglas de routing: Se definen reglas de cómo ProxySQL debe redirigir las consultas (lectura/escritura, particionamiento, etc.).
  • 4. Monitoreo: Se habilitan métricas de monitoreo para analizar el rendimiento de las consultas y del balanceo de carga.

Casos de uso de ProxySQL

  • 1. Escalabilidad horizontal: Permite añadir nodos de MySQL para balancear carga, mejorando el rendimiento de grandes sistemas.
  • 2. Alta disponibilidad: En entornos de producción críticos, ProxySQL ayuda a gestionar el failover sin intervención manual.
  • 3. Optimización de consultas: A través de reescritura y cacheo de consultas, se puede optimizar el uso de los recursos de la base de datos.
  • 4. Entornos de múltiples bases de datos: Ideal para entornos con múltiples servidores de bases de datos o clusters, como Percona XtraDB Cluster o Galera Cluster.

Configuración ProxySQL.

1. Instalación de ProxySQL

Para instalar ProxySQL en un servidor independiente (que actuará como proxy para el clúster), ejecuta los siguientes comandos en un servidor con Ubuntu o Debian:

sudo apt update
sudo apt install proxysql

Una vez instalado, puedes iniciar ProxySQL con:

sudo systemctl start proxysql

Verifica que esté corriendo correctamente:

sudo systemctl status proxysql

2. Acceder a la consola de administración de ProxySQL

Para acceder a la consola de administración, usa el siguiente comando:

mysql -u admin -padmin -h 127.0.0.1 -P6032

La contraseña por defecto es admin. Cambia esta contraseña después de acceder.

3. Configuración básica de ProxySQL

Dentro de la consola de administración de ProxySQL, puedes empezar a configurar los nodos de tu clúster. Suponiendo que tienes dos nodos maestros y dos nodos esclavos, la configuración sería la siguiente:

Agregar servidores MySQL (Masters y Slaves)

Primero, añade los dos nodos maestros (servidores A y B) y los dos nodos esclavos (servidores C y D) a la tabla de servidores MySQL en ProxySQL.

-- Añadir los nodos maestros
INSERT INTO mysql_servers (hostgroup_id, hostname, port, max_connections) VALUES
(10, 'master1_ip', 3306, 1000), -- Nodo maestro 1
(10, 'master2_ip', 3306, 1000); -- Nodo maestro 2
-- Añadir los nodos esclavos
INSERT INTO mysql_servers (hostgroup_id, hostname, port, max_connections) VALUES
(20, 'slave1_ip', 3306, 1000), -- Nodo esclavo 1
(20, 'slave2_ip', 3306, 1000); -- Nodo esclavo 2

 En este caso, estamos utilizando hostgroup_id 10 para los nodos maestros y hostgroup_id 20 para los nodos esclavos.

Configuración de usuarios

A continuación, agrega un usuario de base de datos en ProxySQL que las aplicaciones utilizarán para conectarse. Suponiendo que tu usuario es app_user:

INSERT INTO mysql_users (username, password, default_hostgroup, transaction_persistent) VALUES
('app_user', 'password', 10, 1);

- default_hostgroup 10: Esto significa que el grupo predeterminado para este usuario será el hostgroup de los maestros (para escrituras).

- transaction_persistent 1: Esto garantiza que una transacción completa se ejecutará en el mismo host y no se distribuirá a varios.

Reglas de enrutamiento

Debes definir las reglas que redirijan las consultas de lectura (`SELECT`) a los nodos esclavos y las consultas de escritura (`INSERT`, UPDATE, DELETE, etc.) a los nodos maestros.

Para redirigir todas las lecturas (`SELECT`) a los esclavos, puedes crear la siguiente regla de enrutamiento:

INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES
(1, 1, '^SELECT.*', 20, 1);

- Esta regla dice que cualquier consulta que comience con SELECT será enviada al hostgroup 20 (nodos esclavos).

Las escrituras (`INSERT`, UPDATE, DELETE) no necesitan reglas especiales, ya que por defecto irán al hostgroup definido para este usuario, que en este caso son los nodos maestros (hostgroup 10).

Aplicar los cambios

Después de haber configurado los servidores, usuarios y reglas de enrutamiento, es necesario aplicar los cambios:

LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;

 4. Configuración avanzada (opcional)

Failback en caso de fallo de un maestro

Puedes configurar ProxySQL para que realice un failover automático si uno de los nodos maestros falla. Esto se hace monitoreando los servidores y definiendo prioridades de failover.

-- Habilitar monitorización de los servidores MySQL
UPDATE mysql_servers SET status='ONLINE' WHERE hostname='master1_ip' OR hostname='master2_ip';
-- Configurar intervalos de monitoreo
SET mysql-monitor_ping_interval=1000; -- Intervalo de ping para monitorear

Balanceo de carga entre esclavos

Para distribuir las consultas de lectura de manera equitativa entre los esclavos, ProxySQL puede balancear las consultas de lectura entre los nodos esclavos.

-- Balancear consultas entre esclavos
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply, multiplex) VALUES
(2, 1, '^SELECT.*', 20, 1, 1);

Failover en caso de fallo de un esclavo

Puedes configurar la conmutación por error de ProxySQL si un nodo esclavo falla, de modo que redirija automáticamente el tráfico de lecturas al nodo esclavo que aún esté disponible.

5. Monitoreo y optimización

ProxySQL permite obtener estadísticas en tiempo real sobre el tráfico y los servidores de MySQL. Esto es útil para asegurarse de que el clúster está funcionando como se espera.

Para ver estadísticas del tráfico:

SELECT * FROM stats_mysql_query_digest;

Para monitorear el estado de los servidores:

SELECT * FROM runtime_mysql_servers;

Si  está en línea o desconectado.

6. Configuración de la aplicación

Finalmente, configura tu aplicación para que apunte a ProxySQL en lugar de directamente a los servidores MySQL:

host = 'proxysql_ip'
port = 6033
username = 'app_user'
password = 'password'

Tu aplicación ahora estará conectada a ProxySQL, que gestionará la distribución del tráfico entre los nodos maestros y esclavos de manera eficiente.

Comandos ProxySQL.

 1. Gestión de Servidores MySQL

 - Ver todos los servidores MySQL configurados:

SELECT * FROM mysql_servers;

- Agregar un nuevo servidor MySQL a un hostgroup:

INSERT INTO mysql_servers (hostgroup_id, hostname, port, max_connections) VALUES
(10, '192.168.1.100', 3306, 1000);

- Eliminar un servidor MySQL de un hostgroup:

DELETE FROM mysql_servers WHERE hostname = '192.168.1.100' AND hostgroup_id = 10;

- Actualizar los parámetros de un servidor MySQL:

UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostname = '192.168.1.100' AND hostgroup_id = 10;

- Aplicar cambios a los servidores (cargar cambios en el entorno de ejecución):


LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

 2. Gestión de Usuarios MySQL

- Ver todos los usuarios configurados:

SELECT * FROM mysql_users;

- Agregar un nuevo usuario MySQL:


INSERT INTO mysql_users (username, password, default_hostgroup) VALUES
('app_user', 'app_password', 10);

- Eliminar un usuario MySQL:

DELETE FROM mysql_users WHERE username = 'app_user';

- Aplicar cambios a los usuarios:


LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

 3. Reglas de Enrutamiento de Consultas

- Ver todas las reglas de enrutamiento:

SELECT * FROM mysql_query_rules;

 - Agregar una nueva regla de enrutamiento:


INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES
(1, 1, '^SELECT.*', 20, 1);

 - Eliminar una regla de enrutamiento:

DELETE FROM mysql_query_rules WHERE rule_id = 1;

- Aplicar cambios a las reglas de enrutamiento:


LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

4. Monitorización de Consultas y Servidores

Monitorización de Consultas

- Ver estadísticas de las consultas más ejecutadas:

SELECT * FROM stats_mysql_query_digest ORDER BY count_star DESC LIMIT 10;

- Ver estadísticas sobre el tiempo de ejecución de consultas:

SELECT * FROM stats_mysql_query_digest ORDER BY sum_time DESC LIMIT 10;

- Ver estadísticas por tipo de consulta (lecturas/escrituras):

SELECT hostgroup, digest_text, count_star, sum_time, min_time, max_time FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%' OR digest_text LIKE 'UPDATE%' OR digest_text LIKE 'DELETE%' ORDER BY sum_time DESC;

Monitorización de Servidores MySQL

- Ver estado en tiempo real de los servidores MySQL:

SELECT * FROM runtime_mysql_servers;

Esto te muestra información como el estado actual (ONLINE/OFFLINE), latencia, tiempos de respuesta, etc.

- Ver estadísticas de conexiones de los servidores MySQL:

SELECT * FROM stats_mysql_connection_pool;

Este comando proporciona información sobre las conexiones activas, cerradas, fallidas, y el uso del pool de conexiones para cada servidor en tiempo real.

- Ver estadísticas de tráfico de los servidores MySQL:

SELECT * FROM stats_mysql_global;

Monitorización de Errores y Fallos

- Ver el número de consultas fallidas:

SELECT * FROM stats_mysql_errors;

- Ver errores específicos de los servidores MySQL:

SELECT * FROM stats_mysql_errors_by_host;

- Ver errores específicos por tipo de consulta:

SELECT * FROM stats_mysql_errors_by_query;

 5. Monitorización de ProxySQL

- Ver estadísticas globales del proxy:

SELECT * FROM stats_mysql_global;

Esto incluye métricas generales como el tráfico total, número de consultas ejecutadas, tiempos de procesamiento, etc.

- Ver el uso del pool de conexiones:

SELECT * FROM stats_mysql_connection_pool;

- Ver el estado de las conexiones:

SELECT * FROM stats_mysql_processlist;

- Ver métricas de latencia y tiempos de respuesta:

SELECT * FROM stats_mysql_latency;

6. Gestión de la Monitorización

ProxySQL tiene un conjunto de configuraciones de monitorización que se pueden ajustar para detectar el estado de los servidores y realizar failover si es necesario.

- Configurar intervalo de ping para los servidores MySQL:

SET mysql-monitor_ping_interval = 1000;  -- en milisegundos

- Configurar el intervalo para verificar los tiempos de respuesta:

SET mysql-monitor_read_only_interval = 2000;  -- en milisegundos

- Configurar el intervalo de latencia:

SET mysql-monitor_connect_interval = 1000;

7. Reinicio y Reinicialización

- Reiniciar ProxySQL:

sudo systemctl restart proxysql

- Reiniciar la configuración (limpiar y recargar todo):


LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;

- Guardar toda la configuración en disco:


SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;

8. Tareas Administrativas Avanzadas

- Hacer un backup de la configuración de ProxySQL:

proxysql --backup-to-file=/ruta/al/archivo.sql

- Restaurar la configuración de ProxySQL desde un archivo:

proxysql --restore-from-file=/ruta/al/archivo.sql



Servidor web HTTP

ProxySQL incluye un servidor web HTTP integrado que proporciona una interfaz visual para monitorear el estado y el rendimiento del proxy. Ofrece métricas en tiempo real, estadísticas del grupo de conexiones (*connection pool*) y datos históricos en un formato fácil de leer.

El servidor web es opcional y está deshabilitado de forma predeterminada.

El servidor HTTP se controla mediante varias variables globales dentro del módulo de administración.


Variables principales

Variable Predeterminado Descripción

admin-web_enabled false Establecer en true para habilitar el servidor.

admin-web_port 6080 Puerto TCP en el que escucha el servidor.

admin-web_verbosity 0 Nivel de detalle de depuración (0-10).

Autenticación

El servidor web utiliza las credenciales definidas en la variable admin-stats_credentials. Estas consisten en pares usuario:contraseña separados por punto y coma.


SET admin-stats_credentials = 'stats:stats_pass;monitor:monitor_pass';

Características

Panel de control y métricas

La interfaz web ofrece varias páginas para un análisis detallado:


  • Grupo de conexiones (Connection Pool): Desglose detallado de las conexiones al backend (en uso, libres, OK, errores) por grupo de hosts y servidor.
  • Resumen de consultas (Query Digest): Vista en tiempo real de las consultas más frecuentes y sus métricas de rendimiento.
  • Estadísticas del sistema: Uso de CPU y memoria del proceso ProxySQL.
  • Lista de procesos (Processlist): Visualización de las conexiones de cliente activas y su estado actual.

Integración con Prometheus

El servidor web también proporciona un punto final (*endpoint*) dedicado para la recopilación de métricas de Prometheus (normalmente en /metrics cuando está habilitado).

Activación

Para habilitar el servidor web en tiempo de ejecución:


Establezca la bandera de habilitación:

SET admin-web_enabled = 'true';

Aplique el cambio:

LOAD ADMIN VARIABLES TO RUNTIME;

Consulte la documentación de comandos de administración para obtener más detalles.

 Seguridad

  • Acceso restringido: Se recomienda encarecidamente vincular la interfaz web a 127.0.0.1 o utilizar un cortafuegos para restringir el acceso, ya que contiene datos de rendimiento confidenciales.
  • Usuarios dedicados: Utilice las credenciales `admin-stats` específicamente para la monitorización, a fin de evitar compartir las credenciales administrativas `admin-admin`.
  • Solo lectura: El servidor web integrado por defecto es estrictamente de solo lectura. No puede utilizarse para modificar la configuración de ProxySQL a menos que se instale explícitamente un complemento de interfaz de usuario (UI).



Descripción general

ProxySQL es un proxy de código abierto y alto rendimiento diseñado específicamente para MySQL (y bases de datos compatibles con MySQL como Percona Server y MariaDB). Se ubica entre la capa de su aplicación y sus servidores MySQL, manejando de forma transparente la acumulación de conexiones (connection pooling), la división de lectura/escritura, el enrutamiento de consultas y la conmutación por error (failover) sin requerir cambios en el código de la aplicación.

Arquitectura


Application Servers
ProxySQL (port 3306)
- Connection Multiplexing
- Query Routing Rules
- Query Cache
- Query Rewriting
|
+---> MySQL Primary (writes)
|
+---> MySQL Replica 1 (reads)
|
+---> MySQL Replica 2 (reads)
ProxySQL Admin (port 6032)
- Runtime configuration
- Monitoring dashboard

Instalación


# On RHEL/CentOS/Amazon Linux
rpm -ivh proxysql-2.6.0-1-centos7.x86_64.rpm
systemctl enable proxysql
systemctl start proxysql
# On Debian/Ubuntu
dpkg -i proxysql_2.6.0-ubuntu22_amd64.deb
systemctl start proxysql

Configuración básica

ProxySQL utiliza una base de datos SQLite en memoria para la configuración. Conéctese a la interfaz de administración:

mysql -h 127.0.0.1 -P 6032 -u admin -padmin --prompt "ProxySQL Admin> "

Añadir servidores MySQL

-- Add backend MySQL servers
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, comment)
VALUES
(10, '10.0.1.10', 3306, 1000, 'primary'),
(20, '10.0.1.11', 3306, 1000, 'replica-1'),
(20, '10.0.1.12', 3306, 1000, 'replica-2');
-- Hostgroup 10 = writes, Hostgroup 20 = reads

Añadir usuarios MySQL

INSERT INTO mysql_users (username, password, default_hostgroup, transaction_persistent)
VALUES ('appuser', 'secret', 10, 1);
-- default_hostgroup=10 means writes go to primary by default

Configurar la división de lectura/escritura

-- Route SELECT queries to the read hostgroup (20)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES
(1, 1, '^SELECT.*FOR UPDATE', 10, 1), -- SELECT FOR UPDATE stays on primary
(2, 1, '^SELECT', 20, 1); -- All other SELECTs go to replicas
-- Apply changes
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

Monitoreo de Backends

-- Check server health status
SELECT * FROM mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;
-- Check connection pool stats
SELECT hostgroup, srv_host, status, ConnUsed, ConnFree, ConnERR
FROM stats_mysql_connection_pool;
+-----------+------------+--------+----------+----------+---------+
| hostgroup | srv_host | status | ConnUsed | ConnFree | ConnERR |
+-----------+------------+--------+----------+----------+---------+
| 10 | 10.0.1.10 | ONLINE | 5 | 15 | 0 |
| 20 | 10.0.1.11 | ONLINE | 3 | 17 | 0 |
| 20 | 10.0.1.12 | ONLINE | 2 | 18 | 0 |
+-----------+------------+--------+----------+----------+---------+

Estadísticas de consultas

ProxySQL realiza un seguimiento del rendimiento de las consultas para cada resumen de consulta (query digest) distinto:

SELECT digest_text, count_star, sum_time, min_time, max_time, sum_time/count_star AS avg_time
FROM stats_mysql_query_digest
ORDER BY sum_time DESC
LIMIT 10;

Esto convierte a ProxySQL en una herramienta inestimable para identificar consultas lentas sin depender del registro de consultas lentas de MySQL.

Multiplexación de conexiones

ProxySQL multiplexa miles de conexiones de aplicaciones en un número mucho menor de conexiones backend:

-- Configure connection pool size per hostgroup
UPDATE mysql_servers SET max_connections = 50
WHERE hostgroup_id = 10;
UPDATE mysql_servers SET max_connections = 100
WHERE hostgroup_id = 20;
LOAD MYSQL SERVERS TO RUNTIME;

Almacenamiento en caché de consultas

-- Cache queries matching a pattern for 5 seconds
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, cache_ttl, apply)
VALUES (100, 1, '^SELECT.*FROM product_catalog', 5000, 1);
LOAD MYSQL QUERY RULES TO RUNTIME;

Gestión de conmutación por error (Failover)

Combinado con un gestor de topología de replicación como Orchestrator o MHA, ProxySQL puede actualizar automáticamente el enrutamiento cuando un nodo primario falla:

# Orchestrator calls this on failover
mysql -h 127.0.0.1 -P 6032 -u admin -padmin -e "
UPDATE mysql_servers SET status = 'OFFLINE_HARD'
WHERE hostname = 'old-primary-host';
UPDATE mysql_servers
SET hostgroup_id = 10
WHERE hostname = 'new-primary-host';
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

Resumen

ProxySQL es el proxy estándar de facto para despliegues de MySQL que requieren alta disponibilidad, escalado de lectura y gestión de conexiones a gran escala. Proporciona división transparente de lectura/escritura, agrupamiento de conexiones que reduce los costes de conexión de MySQL en varios órdenes de magnitud y análisis de consultas en tiempo real. Su arquitectura reconfigurable en tiempo de ejecución permite que los cambios de topología y las actualizaciones de enrutamiento de consultas se realicen sin reiniciar la aplicación ni sufrir tiempos de inactividad.

Cómo verificar la versión de ProxySQL

$ proxysql --version
ProxySQL version 3.0.4-162-gfaa64a5, codename Truls

Una versión de depuración contiene _DEBUG en su cadena de versión. Es más lenta que la versión que no es de depuración, pero más fácil de depurar en caso de fallos.

$ proxysql --version
ProxySQL version 3.0.4-162-gfaa64a5_DEBUG, codename Truls

Configurar ProxySQL a través de la interfaz de administración

En primer lugar, tenga en cuenta que la mejor manera de configurar ProxySQL es a través de su interfaz de administración. Esto permite una configuración en línea (sin tener que reiniciar el proxy) mediante consultas SQL a su base de datos de administración. Es una forma eficaz de configurarlo tanto de manera manual como automatizada.

Como forma secundaria de configurarlo, tenemos el archivo de configuración.

Configurar ProxySQL a través de la interfaz de administración

Para iniciar sesión en la interfaz de administración de MySQL (con las credenciales predeterminadas), use un cliente mysql y conéctese utilizando las siguientes credenciales de admin localmente en el puerto (6032):

$ mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.30 (ProxySQL Admin Module)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Admin>

nota: Si la versión de su cliente MySQL es la versión 8.04 o superior, agregue --default-auth=mysql_native_password al comando anterior para conectarse a la interfaz de administración.

Para iniciar sesión en la interfaz de administración para PostgreSQL, use el cliente psql y conéctese usando admin en el puerto 6132 (los comandos SQL de Admin son los mismos):

$ export PGPASSWORD=admin
$ psql -U admin -h 127.0.0.1 -p6132
psql (17.4 (Ubuntu 17.4-1.pgdg22.04+2), server 16.1)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: none)
Type "help" for help.
admin=#

Una vez conectado a la interfaz de administración, tendrá a su disposición una lista de bases de datos y tablas que se pueden consultar utilizando el lenguaje SQL:


Admin> SHOW DATABASES;
+-----+---------+-------------------------------+
| seq | name | file |
+-----+---------+-------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
+-----+---------+-------------------------------+
4 rows in set (0.00 sec)

Esto le permitirá controlar la lista de servidores backend, cómo se enruta el tráfico hacia ellos y otros ajustes importantes (como el almacenamiento en caché, control de acceso, etc.). Una vez que haya realizado modificaciones en la estructura de datos en memoria, debe cargar la nueva configuración en el runtime o persistir los nuevos ajustes en el disco (para que sigan allí después de reiniciar el proxy). Un tutorial detallado sobre cómo configurar ProxySQL a través de la interfaz de Admin está disponible aquí.

Configurar ProxySQL a través del archivo de configuración

Aunque el archivo de configuración solo debe considerarse como una forma secundaria de configurar el proxy, no debemos descartar su valor como una forma válida de inicializar una nueva instalación de ProxySQL.

Repasemos rápidamente las secciones principales del archivo de configuración (esta visión general sirve como un resumen de alto nivel de la configuración de ProxySQL).

Secciones de nivel superior:

· admin_variables: contiene variables globales que controlan la funcionalidad de la interfaz de administración.

· mysql_variables: contiene variables globales que controlan la funcionalidad para manejar el tráfico entrante de MySQL.

· mysql_servers: contiene filas para la tabla mysql_servers de la interfaz de administración. Básicamente, estas definen los servidores backend hacia los cuales se enruta el tráfico entrante de MySQL. Las filas se codifican según el formato de archivo .cfg, aquí hay un ejemplo:


 mysql_servers =
 (
  {
  address="127.0.0.1"
  port=3306
  hostgroup=0
  max_connections=200
  }
 )

· mysql_users: contiene filas para la tabla mysql_users de la interfaz de administración. Básicamente, estas definen los usuarios que pueden conectarse al proxy y los usuarios con los que el proxy puede conectarse a los servidores backend. Las filas se codifican según el formato de archivo .cfg, aquí hay un ejemplo:


 mysql_users:
 (
  {
  username="root"
  password="root"
  default_hostgroup=0
  max_connections=1000
  default_schema="information_schema"
  active=1
  }
 )

· mysql_query_rules: contiene filas para la tabla mysql_query_rules de la interfaz de administración. Básicamente, estas definen las reglas utilizadas para clasificar y enrutar el tráfico entrante de MySQL, según varios criterios (patrones coincidentes, usuario utilizado para ejecutar la consulta, etc.). Las filas se codifican según el formato de archivo .cfg, aquí hay un ejemplo (Nota: el ejemplo es una regla de enrutamiento de consultas muy genérica y se recomienda crear reglas específicas para las consultas en lugar de usar una regla genérica como esta):

 mysql_query_rules:
 (
  {
  rule_id=1
  active=1
  match_pattern="^SELECT .* FOR UPDATE$"
  destination_hostgroup=0
  apply=1
  },
  {
  rule_id=2
  active=1
  match_pattern="^SELECT"
  destination_hostgroup=1
  apply=1
  }
 )

· pgsql_variables: contiene variables globales que controlan la funcionalidad para manejar el tráfico entrante de PostgreSQL.

· pgsql_servers: contiene filas para la tabla pgsql_servers de la interfaz de administración. Básicamente, estas definen los servidores backend hacia los cuales se enruta el tráfico entrante de PostgreSQL. Las filas se codifican según el formato de archivo .cfg, aquí hay un ejemplo:

 pgsql_servers =
 (
  {
  address="127.0.0.1"
  port=5432
  hostgroup=0
  max_connections=200
  }
 )

· pgsql_users: contiene filas para la tabla pgsql_users de la interfaz de administración. Básicamente, estas definen los usuarios que pueden conectarse al proxy y los usuarios con los que el proxy puede conectarse a los servidores backend. Las filas se codifican según el formato de archivo .cfg, aquí hay un ejemplo:

 pgsql_users:
 (
  {
  username="postgres"
  password="postgres"
  default_hostgroup=0
  max_connections=1000
  active=1
  }
 )

· pgsql_query_rules: contiene filas para la tabla pgsql_query_rules de la interfaz de administración. Básicamente, estas definen las reglas utilizadas para clasificar y enrutar el tráfico entrante de PostgreSQL, según varios criterios (patrones coincidentes, usuario utilizado para ejecutar la consulta, etc.). Las filas se codifican según el formato de archivo .cfg, aquí hay un ejemplo (Nota: el ejemplo es una regla de enrutamiento de consultas muy genérica y se recomienda crear reglas específicas para las consultas en lugar de usar una regla genérica como esta):

 pgsql_query_rules:
 (
  {
  rule_id=1
  active=1
  match_pattern="^SELECT .* FOR UPDATE$"
  destination_hostgroup=0
  apply=1
  },
  {
  rule_id=2
  active=1
  match_pattern="^SELECT"
  destination_hostgroup=1
  apply=1
  }
 )

Diferencias entre ProxySQL, Redis y Memcached


ProxySQL, Redis y Memcached cumplen funciones distintas dentro de una arquitectura de software, aunque los tres se utilicen para mejorar el rendimiento y acelerar el acceso a los datos.

Característica ProxySQL Redis Memcached
Tipo de sistema Proxy / Middleware de capa 7 para MySQL Almacén de datos clave-valor en memoria (NoSQL) Caché clave-valor simple en memoria
Integración en la app Transparente: La aplicación se conecta como si fuera una base de datos MySQL (no requiere cambiar código). Manual: La aplicación debe estar programada para leer/escribir explícitamente en Redis usando un SDK. Manual: La aplicación debe estar programada para usar la librería de Memcached.
Nivel de funcionamiento Intercepta y entiende el protocolo SQL (analiza comandos SELECT, INSERT, etc.). Trabaja con estructuras de datos (Strings, Hashes, Lists, Sets, JSON). Trabaja con pares Clave-Valor simples (cadenas de texto o binarios).
Persistencia No aplica (solo cachea respuestas SQL en RAM). Sí: Permite guardar copias en disco (RDB/AOF) para no perder datos tras un reinicio. No: Es 100% volátil. Si el servicio se reinicia, los datos desaparecen.
Multihilo / Rendimiento Diseñado para miles de conexiones concurrentes a MySQL. Monohilo para operaciones de datos (ultra rápido, pero usa 1 núcleo de CPU para datos). Multihilo (escala eficientemente en servidores con múltiples núcleos de CPU).
Funciones extra Separación Lectura/Escritura, balanceo de carga, failover y reescritura de queries. Pub/Sub (mensajería), colas de trabajo, expiración de claves (TTL), transacciones. Solo almacenamiento y recuperación por clave con expiración por tiempo.

¿Cuál elegir según el caso?

  • Usa ProxySQL si: Tienes una aplicación existente (por ejemplo, un software a medida o un CMS) conectada a MySQL y quieres acelerarla o separar tráfico de lectura/escritura sin tocar ni una sola línea de código.

  • Usa Redis si: Estás desarrollando una aplicación o usas un framework (Laravel, Symfony, Django, WordPress) que soporta caché de objetos, manejo de sesiones de usuario, colas de tareas en segundo plano o almacenamiento persistente en memoria.

  • Usa Memcached si: Necesitas un sistema de caché de datos simple, ligero y distribuido donde solo requieras consultar claves simples sin lógica compleja ni persistencia, aprovechando múltiples núcleos de CPU.

ProxySQL Query Cache

ProxySQL cuenta con una caché de consultas en memoria integrada que se sitúa entre la aplicación y MySQL. Cuando llega una consulta almacenada en caché, ProxySQL devuelve el resultado directamente desde la memoria sin reenviar la solicitud a ningún servidor de fondo. Las entradas de la caché caducan tras un TTL configurable. Este enfoque funciona mejor para cargas de trabajo con un uso intensivo de lecturas, en las que se ejecutan repetidamente las mismas consultas y los datos subyacentes cambian con poca frecuencia.


La caché de consultas de ProxySQL reduce la carga de MySQL al servir los resultados de las sentencias SELECT repetidas desde la memoria, utilizando la columna `cache_ttl` de `mysql_query_rules`. Supervisa los índices de aciertos a través de `stats_mysql_global`, limita el almacenamiento en caché a consultas o esquemas específicos mediante patrones de expresiones regulares y excluye a los usuarios sensibles con una regla que impida el almacenamiento en caché. Mantén los TTL cortos para los datos que cambian con frecuencia, a fin de evitar lecturas obsoletas.

Habilitar caché


La caché se controla por cada regla de consulta mediante la columna «cache_ttl» (valor en milisegundos). No es necesario activar ni desactivar ninguna opción global: basta con añadir o actualizar una regla.

-- Cache all SELECT queries for 5 seconds (5000 ms)
INSERT INTO mysql_query_rules (
  rule_id, active, match_pattern, cache_ttl, apply
) VALUES (50, 1, '^SELECT', 5000, 1);

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

Almacenamiento en caché de consultas específicas

Para un control más preciso, busca un patrón más específico y establece un TTL más largo para los datos que rara vez cambian:

 -- Cache product catalog queries for 60 seconds

INSERT INTO mysql_query_rules (

  rule_id, active, match_pattern, cache_ttl, apply

) VALUES (51, 1, '^SELECT .* FROM products', 60000, 1);


-- Cache exchange rate lookup for 10 minutes

INSERT INTO mysql_query_rules (

  rule_id, active, match_pattern, cache_ttl, apply

) VALUES (52, 1, 'SELECT .* FROM exchange_rates', 600000, 1);


LOAD MYSQL QUERY RULES TO RUNTIME;

SAVE MYSQL QUERY RULES TO DISK;


Configuración del tamaño de la caché

Establece el umbral de memoria que utiliza el hilo de purga de la caché. Se trata de un límite flexible: cuando el uso supera este valor, el hilo de purga se vuelve más agresivo a la hora de eliminar entradas: 

SET mysql-query_cache_size_MB = 256;

LOAD MYSQL VARIABLES TO RUNTIME;

SAVE MYSQL VARIABLES TO DISK;


Supervisión de la eficacia de la caché

Consulta la tabla `stats_mysql_global` para ver los contadores de aciertos y fallos de la caché: 

SELECT Variable_Name, Variable_Value

FROM stats_mysql_global

WHERE Variable_Name LIKE 'Query_Cache%';


Key variables


Query_Cache_count_GET       - total cache lookups

Query_Cache_count_GET_OK    - cache hits (result found)

Query_Cache_count_SET       - entries added to cache

Query_Cache_bytes_IN        - bytes written into cache

Query_Cache_bytes_OUT       - bytes read from cache

Query_Cache_Purged          - entries evicted due to TTL or memory pressure 


Una relación alta entre GET_OK y GET indica que la caché es eficaz.


Omitir la caché para usuarios específicos

Si se desea que determinados usuarios obtengan siempre datos actualizados (por ejemplo, herramientas de administración), añade una regla que coincida con sus consultas sin establecer cache_ttl y utiliza un rule_id más bajo para que se evalúe en primer lugar. Al establecer apply=1 se detiene el procesamiento de reglas, por lo que no se aplicará ninguna regla de almacenamiento en caché posterior: 

INSERT INTO mysql_query_rules (

  rule_id, active, username, match_pattern, apply

) VALUES (1, 1, 'admin_user', '^SELECT', 1);


LOAD MYSQL QUERY RULES TO RUNTIME;

SAVE MYSQL QUERY RULES TO DISK;


Borrar la caché

En ProxySQL 2.x, se puede vaciar toda la caché de consultas con un solo comando:

PROXYSQL FLUSH QUERY CACHE; 


En producción, es preferible utilizar TTL cortos en lugar de vaciados manuales.


ProxySQL con Docker


 Descripción de la imagen

Para descargar la imagen más reciente, basta con ejecutar:

$ docker pull proxysql/proxysql

O bien, para una versión específica (las imágenes utilizan versionado semántico), especifica la etiqueta correspondiente:

por ejemplo, para la versión 3.0.3:

$ docker pull proxysql/proxysql:3.0.3

por ejemplo, para la versión 2.7.3:

$ docker pull proxysql/proxysql:2.7.3

Si se omite la versión o parte de ella, se entiende que se refiere a la última de la serie:

Por ejemplo, la última de la serie 3.0.y:

$ docker pull proxysql/proxysql:3.0

Por ejemplo, la última de la serie 3.x.y:

$ docker pull proxysql/proxysql:3

La imagen se basa en Debian y ejecuta ProxySQL como proceso en primer plano.

NOTA: El paquete no contiene el cliente MySQL



Run

Para ejecutar un contenedor de ProxySQL con un archivo de configuración personalizado de ProxySQL:


$ docker run -p 16032:6032 -p 16033:6033 -p 16070:6070 -d -v /ruta/a/proxysql.cnf:/etc/proxysql.cnf proxysql/proxysql

NOTA: Tendrás que definir un segundo par de credenciales de administrador para conectarte desde fuera del contenedor.


Ejemplo de archivo de configuración (es decir, /ruta/a/proxysql.cnf mencionado anteriormente)

El siguiente archivo de configuración básica debería ser suficiente para fines de desarrollo; esta configuración te permitirá conectarte de forma remota a tu contenedor Docker de ProxySQL utilizando el segundo par de credenciales de administrador, por ejemplo:


mysql -h127.0.0.1 -P16032 -uradmin -pradmin --prompt "ProxySQL Admin>"


datadir="/var/lib/proxysql"


admin_variables=

{

    admin_credentials="admin:admin;radmin:radmin"

    mysql_ifaces="0.0.0.0:6032"

}


mysql_variables=

{

    threads=4

    max_connections=2048

default_query_delay=0

    default_query_timeout=36000000

    have_compress=true

    poll_timeout=2000

    interfaces="0.0.0.0:6033"

    default_schema="information_schema"

    stacksize=1048576

server_version="5.5.30"

    connect_timeout_server=3000

    monitor_username="monitor"

    monitor_password="monitor"

    monitor_history=600000

    monitor_connect_interval=60000

    monitor_ping_interval=10000

    monitor_read_only_interval=1500

tiempo_de_espera_solo_lectura_del_monitor=500

    intervalo_de_ping_del_servidor_en_milisegundos=120000

    tiempo_de_espera_de_ping_del_servidor=500

    estadísticas_de_comandos=true

    ordenar_sesiones=true

    reintentos_de_conexión_en_caso_de_fallo=10

}

Dockerfile

FROM debian:13

LABEL authors="Miro Stauder <miro@sysown.com>"


ARG VERS

ENV PROXYSQL_VERSION="${VERS}"


RUN [ -z "$VERS" ] && echo -n "\nERROR: Especifica la versión que se va a compilar. Por ejemplo:\ndocker build --build-arg VERS=2.5.1 .\n\n" >&2 && exit 1 || true


RUN cat /etc/os-release


RUN apt-get update && \

apt-get install -y apt-utils


RUN apt-get install -y \

default-mysql-client \

postgresql-client \

wget \

lsb-release \

gnupg \

apt-transport-https \

ca-certificates


RUN wget -nv -O - "https://repo.proxysql.com/ProxySQL/proxysql-${VERS%.*}.x/repo_pub_key" | \

gpg --dearmor > /etc/apt/trusted.gpg.d/proxysql-${VERS%.*}.x-keyring.gpg


RUN echo "deb https://repo.proxysql.com/ProxySQL/proxysql-${VERS%.*}.x/$(lsb_release -sc)/ ./" | \

tee /etc/apt/sources.list.d/proxysql.list && \

apt-get update && \

apt-get install proxysql=${VERS}


# limpiar la caché de apt

RUN apt clean && \

rm -rf /var/cache/apt/* && \

rm -rf /var/lib/apt/lists/*



CMD ["proxysql", "-f", "--idle-threads", "-D", "/var/lib/proxysql"]


0 comments :

Publicar un comentario

Los comentarios pueden ser revisados en cualquier momento por los moderadores.

Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.

Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.