sql >> Base de Datos >  >> RDS >> Mysql

Equilibrio de carga con ProxySQL para Percona XtraDB Cluster

Deberíamos considerar la instalación de ProxySQL en los nodos del cliente para una administración eficiente de la carga de trabajo en todo el clúster sin cambios en las aplicaciones que generan consultas. Esta es la solución de alta disponibilidad recomendada para Percona XtraDB Cluster.
Algunas de las características populares de ProxySQL son:

  • Alto rendimiento
  • Gestión eficiente de la carga de trabajo
  • Almacenamiento en caché de consultas
  • Enrutamiento de consultas
  • Admite conmutación por error
  • Configuración avanzada con 0 tiempo de inactividad
  • Proxy de capa de aplicación
  • Multiplataforma
  • Soporte de topología avanzada
  • Cortafuegos
Especificación del entorno:

192.168.56.115
centos

Requisitos previos:

Necesitamos abrir los siguientes puertos en todos los servidores

firewall-cmd --zone=public --add-service=mysql --permanent

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=4567/tcp --permanent
firewall-cmd --zone=public --add-port=4568/tcp --permanent
firewall-cmd --zone=public --add-port=4444/tcp --permanent
firewall-cmd --zone=public --add-port=4567/udp --permanent

Permitir el puerto de servicio ProxySQL 6033/tcp (es el reverso del puerto predeterminado MySQL 3306) en el Firewall de Linux.

firewall-cmd --permanent --add-port=6033/tcp

firewall-cmd --reload
Instalación del balanceador de carga de ProxySQL para el clúster Percona XtraDB en CentOS 7

ProxySQL v2 es compatible de forma nativa con Percona XtraDB Cluster. Para instalar ProxySql, instálelo desde el repositorio de Percona

sudo yum install proxysql2

Para conectarse a la interfaz de administración de ProxySQL, necesita un cliente MySQL.

yum install Percona-XtraDB-Cluster-client-57

Ahora inicia el servicio proxysql

[[email protected] ~]# systemctl start proxysql.service

Para comprobar el puerto en el nodo del clúster, utilice la siguiente consulta.

mysql -uroot -p -e "SHOW GLOBAL VARIABLES LIKE 'PORT'";

Ahora conéctese al panel de administración de ProxySQL y configure el balanceador de carga.

mysql -u admin -p123 -h 127.0.0.1 -P6032 --prompt='ProxySQL> '

INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,'192.168.56.110',3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,'192.168.56.113',3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,'192.168.56.114',3306);

ProxySQL> SELECT * FROM mysql_servers;
+--------------+----------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+----------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 0 | 192.168.56.110 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
| 0 | 192.168.56.113 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
| 0 | 192.168.56.114 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
+--------------+----------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
3 rows in set (0.00 sec)
Configurar el monitoreo de nodos ProxySQL:

Inicie sesión en la instancia de la base de datos MySQL y ejecute los siguientes comandos para crear el usuario de supervisión  con privilegio de USO

en cualquier NODO percona:

CREATE USER 'proxysql'@'%' IDENTIFIED BY 'ProxySQL';
GRANT USAGE ON *.* TO 'proxysql'@'%';

mysql> CREATE USER 'proxysql'@'%' IDENTIFIED BY 'ProxySQL';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT USAGE ON *.* TO 'proxysql'@'%';
Query OK, 0 rows affected (0.02 sec)

UPDATE global_variables SET variable_value='proxysql' WHERE variable_name='mysql-monitor_username';

UPDATE global_variables SET variable_value='ProxySQL' WHERE variable_name='mysql-monitor_password';

LOAD MYSQL VARIABLES TO RUNTIME;

SAVE MYSQL VARIABLES TO DISK;

ProxySQL> UPDATE global_variables SET variable_value='proxysql' WHERE variable_name='mysql-monitor_username';
Query OK, 1 row affected (0.01 sec)

ProxySQL> UPDATE global_variables SET variable_value='ProxySQL' WHERE variable_name='mysql-monitor_password';
Query OK, 1 row affected (0.00 sec)

ProxySQL> LOAD MYSQL VARIABLES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

ProxySQL> SAVE MYSQL VARIABLES TO DISK;
Query OK, 136 rows affected (0.01 sec)

ProxySQL> LOAD MYSQL SERVERS TO RUNTIME;
Query OK, 0 rows affected (0.01 sec)
Creación de usuario de cliente ProxySQL
Provide read/write access to the cluster for ProxySQL, add this user on one of the Percona XtraDB Cluster nodes:

CREATE USER 'lbuser'@'192.168.56.115' IDENTIFIED BY 'lbpass';

GRANT ALL ON *.* TO 'lbuser'@'192.168.56.115';
Creación de usuario de cliente ProxySQL:
ProxySQL> INSERT INTO mysql_users (username,password) VALUES ('lbuser','lbpass');
Query OK, 1 row affected (0.00 sec)
ProxySQL> LOAD MYSQL USERS TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)
ProxySQL> SAVE MYSQL USERS TO DISK;
Query OK, 0 rows affected (0.02 sec)

confirme que el usuario se ha configurado correctamente, puede intentar iniciar sesión:

[[email protected] ~]# mysql -u lbuser -plbpass -h 127.0.0.1 -P 6033
mysql: [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)

Copyright (c) 2009-2019 Percona LLC and/or its affiliates
Copyright (c) 2000, 2019, 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.
mysql>

Veamos a qué nodo se va a conectar nuestro cliente del clúster.

[[email protected] ~]# mysql -u lbuser -plbpass -h 127.0.0.1 -P 6033 -e "select @@hostname;";
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------+
| @@hostname |
+----------------------+
| percona3.localdomain |
+----------------------+

puede ver que el servidor proxy está conectado a percona3

Probé desde otra sesión de masilla y luego se conecta a percona2:

[[email protected] ~]# mysql -u lbuser -plbpass -h 127.0.0.1 -P 6033 -e "select @@hostname;";
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------+
| @@hostname |
+----------------------+
| percona2.localdomain |
+----------------------+

Después de algunas sesiones múltiples, se conecta a percona1:

[[email protected] ~]# mysql -u lbuser -plbpass -h 127.0.0.1 -P 6033 -e "select @@hostname;";
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------+
| @@hostname |
+----------------------+
| percona1.localdomain |
+----------------------+
Conexión desde MySQL Workbench:

A continuación se muestra la configuración de mi sesión en MySQL Workbench:

Intenté ver qué nodo se conectará desde MySQL Workbench

Conmutación por error:

Ahora comprobaremos cómo esto realizará la conmutación por error

[[email protected] mysql]# service mysql stop
Redirecting to /bin/systemctl stop mysql.service

ProxySQL> select hostgroup_id,hostname,port,status from runtime_mysql_servers;
+--------------+----------------+------+---------+
| hostgroup_id | hostname | port | status |
+--------------+----------------+------+---------+
| 0 | 192.168.56.110 | 3306 | ONLINE |
| 0 | 192.168.56.114 | 3306 | SHUNNED |
| 0 | 192.168.56.113 | 3306 | ONLINE |
+--------------+----------------+------+---------+
3 rows in set (0.01 sec)

Ahora, inicie mysql en el nodo 3 nuevamente y verifique el estado del clúster nuevamente desde el servidor proxy

[[email protected] mysql]#systemctl start mysql.service

ProxySQL> SELECT hostgroup_id hg,count(status) cnt from main.runtime_mysql_servers WHERE status = "ONLINE" GROUP BY hg having cnt ;
+----+-----+
| hg | cnt |
+----+-----+
| 0 | 3 |
+----+-----+
1 row in set (0.00 sec)

ProxySQL> select hostgroup_id,hostname,port,status from runtime_mysql_servers;
+--------------+----------------+------+--------+
| hostgroup_id | hostname | port | status |
+--------------+----------------+------+--------+
| 0 | 192.168.56.110 | 3306 | ONLINE |
| 0 | 192.168.56.114 | 3306 | ONLINE |
| 0 | 192.168.56.113 | 3306 | ONLINE |
+--------------+----------------+------+--------+
3 rows in set (0.00 sec)

NOTA:  Si ve el estado del nodo como SHUNNED  luego intente conectarse varias veces para que el cliente obtenga el estado más reciente del clúster, ya que runtime_mysql_servers almacena el estado más reciente del nodo cuando se intentó conectar por última vez.

Clúster de prueba con sysbench:
yum install sysbench

sysbench requiere las credenciales de usuario del cliente ProxySQL que creó (lbuser/lbpass) en Creación de un usuario de cliente ProxySQL.

sysbench /usr/share/sysbench/oltp_read_only.lua --threads=4 --mysql-host=127.0.0.1 
--mysql-user=lbuser --mysql-password=lbpass --mysql-port=6033 --tables=10 --table-size=10000 prepare

sysbench /usr/share/sysbench/oltp_read_only.lua --threads=4 --events=0 --time=300 --mysql-host=27.0.0.1 
--mysql-user=lbuser --mysql-password=lbpass --mysql-port=6033 --tables=10 
--table-size=10000 --range_selects=off --db-ps-mode=disable --report-interval=1 run

Para ver la cantidad de comandos que se ejecutan en el clúster:

proxysql> SELECT * FROM stats_mysql_commands_counters;