Implementar Percona Cluster - Parte 1

By rogerarjona Aug. 24, 2024, 6:58 p.m. Base de Datos

Para este laboratorio realizaremos una configuración para conseguir un escensario como el siguiente

diagrama.png

Es importante realizar los pasos para la configuración de cada servidor que se describen a continuación

1. Como instalar Percona XtraDB Cluster

En cada uno de nuestros servidores ejecutamos lo siguiente:

apt-get update

apt-get install -y wget lsb-release gnupg curl 

apt update 

wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb

dpkg -i percona-release_latest.generic_all.deb

percona-release setup pxc57

apt install -y libdbi-perl libdbd-mysql-perl libmecab2 socat  libcurl4-openssl-dev libev4

apt install -y percona-xtrabackup-24  qpress

apt install -y percona-xtradb-cluster-full-57=5.7.40-31.63-1.focal percona-xtradb-cluster-server-5.7=5.7.40-31.63-1.focal percona-xtradb-clust>

service mysql start

Edite mysqld.cnf en todos los nodos y proporcione server-id=<value>, en todos los nodos esto debería ser diferente, ahora configuraremos todos los nodos manualmente para pxc.</value>

2. Configurar el primer nodo

Los nodos individuales deben configurarse para poder iniciar el clúster, para obtener mas información sobre como iniciar el cluster [Bootstrapping the First Node.]https://docs.percona.com/percona-xtradb-cluster/5.7/bootstrap.html#bootstrap(http://)

Asegúrese de que el archivo de configuración /etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf para el primer nodo (pxc1) contenga lo siguiente

[mysqld]
# Path to Galera library
wsrep_provider=/usr/lib/galera3/libgalera_smm.so

wsrep_cluster_address=gcomm://192.168.12.3,192.168.12.4,192.168.12.5
binlog_format=ROW

default_storage_engine=InnoDB

wsrep_slave_threads= 4

wsrep_log_conflicts

innodb_autoinc_lock_mode=2

wsrep_node_address=192.168.12.5
wsrep_cluster_name=pxc-cluster

wsrep_node_name=Node-1

pxc_strict_mode=PERMISSIVE

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth="sstuser:xxxxxxxxxxx"

Inicializa el primer nodo usando el siguiente comando

/etc/init.d/mysql bootstrap-pxc

Este comando incializara el primer nodo asi como el bootsrap cluster, una vez que se ha iniciado el primer nodo, puede verificar el estado con el siguiente comando

show status like 'wsrep%';

La salida del comando deberia mostrarnos que el cluster se ha iniciado correctamente

+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | b598af3e-ace3-11e2-0800-3e90eb9cd5d3 |
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
| wsrep_cluster_size         | 1                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)

Para realizar la transferencia de instantáneas de estado usando XtraBackup, configure un nuevo usuario con los privilegios adecuados

CREATE USER 'sstuser'@'%' IDENTIFIED BY 'xxxxxxxxxxx';
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'%';
FLUSH PRIVILEGES;

3. Configurar el segundo nodo

Asegúrese de que el archivo de configuración /etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf para el primer nodo (pxc1) contenga lo siguiente

[mysqld]
# Path to Galera library
wsrep_provider=/usr/lib/galera3/libgalera_smm.so

wsrep_cluster_address=gcomm://192.168.12.3,192.168.12.4,192.168.12.5
binlog_format=ROW

default_storage_engine=InnoDB

wsrep_slave_threads= 4

wsrep_log_conflicts

innodb_autoinc_lock_mode=2

wsrep_node_address=192.168.12.5
wsrep_cluster_name=pxc-cluster

wsrep_node_name=Node-2

pxc_strict_mode=PERMISSIVE

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth="sstuser:xxxxxxxxxxx"

Inicia el segundo nodo con el siguiente comando

/etc/init.d/mysql start

Después de iniciar el servidor, debería recibir SST automáticamente. El estado del clúster se puede verificar en todos los nodos.

Ejemplo de consulta de estado desde el segundo nodo(pxc2)

show status like 'wsrep%';

La salida del comando deberia mostrarnos que el segundo nodo se ha añadido correctamente al cluster

+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | b598af3e-ace3-11e2-0800-3e90eb9cd5d3 |
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
| wsrep_cluster_size         | 2                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)

4. Configurar el tercer nodo

Asegúrese de que el archivo de configuración /etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf para el primer nodo (pxc1) contenga lo siguiente

[mysqld]
# Path to Galera library
wsrep_provider=/usr/lib/galera3/libgalera_smm.so

wsrep_cluster_address=gcomm://192.168.12.3,192.168.12.4,192.168.12.5
binlog_format=ROW

default_storage_engine=InnoDB

wsrep_slave_threads= 4

wsrep_log_conflicts

innodb_autoinc_lock_mode=2

wsrep_node_address=192.168.12.5
wsrep_cluster_name=pxc-cluster

wsrep_node_name=Node-3

pxc_strict_mode=PERMISSIVE

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth="sstuser:xxxxxxxxxxx"

Inicia el tercer nodo con el siguiente comando

/etc/init.d/mysql start

Después de iniciar el servidor, debería recibir SST automáticamente. El estado del clúster se puede verificar en todos los nodos.

Ejemplo de consulta de estado desde el tercer nodo(pxc2)

show status like 'wsrep%';

La salida del comando deberia mostrarnos que el tercer nodo se ha añadido correctamente al cluster

+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | b598af3e-ace3-11e2-0800-3e90eb9cd5d3 |
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
| wsrep_cluster_size         | 3                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)

Este resultado confirma que el tercer nodo se ha unido al clúster.

5. Configuración de ProxySQL

5.1 Instalación

Ubuntu / Debian

Añadir el repositorio

apt-get install -y --no-install-recommends lsb-release wget apt-transport-https ca-certificates gnupg
wget -O - 'https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/repo_pub_key' | apt-key add - 
echo deb https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/$(lsb_release -sc)/ ./ | tee /etc/apt/sources.list.d/proxysql.list

apt-get update
apt-get install proxysql

Iniciamos el servicio

systemctl start proxysql

La configuración predeterminada inicial se puede encontrar en estos archivos

root@ip-172-31-51-244:~# systemctl status proxysql | grep cnf
    Process: 8000 ExecStart=/usr/bin/proxysql --idle-threads -c /etc/proxysql.cnf $PROXYSQL_OPTS (code=exited, status=0/SUCCESS)
             ├─8002 /usr/bin/proxysql --idle-threads -c /etc/proxysql.cnf
             └─8003 /usr/bin/proxysql --idle-threads -c /etc/proxysql.cnf
Jan 22 12:21:42 ip-172-31-51-244 proxysql[8000]: 2024-01-22 12:21:42 [INFO] Using config file /etc/proxysql.cnf
root@ip-172-31-51-244:~#

Por ejemplo, con las credenciales de la consola de administración, donde puedes cambiar la contraseña

ProxySQL Admin> SET admin-admin_credentials="test_admin:admin123;radminuser:radminpass";

Después de configurar las credenciales de administrador, aplique los cambios a la configuración del tiempo de ejecución

ProxySQL Admin> LOAD ADMIN VARIABLES TO RUNTIME;
ProxySQL Admin> SAVE ADMIN VARIABLES FROM RUNTIME;

Y podemos ver que está activo y escuchando en dos puertos TCP y dos sockets

# netstat -lpn | grep proxysql

root@ip-172-31-51-244:~# netstat -lpn | grep proxysql
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      8003/proxysql
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      8003/proxysql
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      8003/proxysql
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      8003/proxysql
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      8003/proxysql
root@ip-172-31-51-244:~#

El puerto 6032 es para administrar ProxySQL, mientras que el 6033 es para conexiones de clientes a servicios backend de MySQL. Por supuesto, el segundo aún no está listo, pero ya podemos iniciar sesión en la consola de administración de ProxySQL usando un cliente mysql estándar; también necesita instalar el cliente MySQL

root@ip-172-31-51-244:~# apt install mysql-client-core-8.0
# mysql --protocol=tcp -P 6032 -uadmin -padmin --prompt='Admin >'
(...)
Server version: 5.5.30 (ProxySQL Admin Module)proxysql>
Admin >show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.00 sec)

Admin >select * from mysql_servers;
Empty set (0.00 sec)

5.2 Configuración Agregue nodos del clúster a ProxySQL. Para configurar los nodos backend del clúster Percona XtraDB en ProxySQL, inserte los registros correspondientes en la tabla mysql_servers.

Este ejemplo agrega tres nodos del clúster Percona XtraDB al grupo de hosts predeterminado 11 y 12, y decidiremos cuál es el lector HG y cuál es el grupo de hosts RW.

INSERT INTO mysql_servers (hostgroup_id, hostname, port,status, weight,max_connections) VALUES (3, '192.168.12.3', 3306, 'ONLINE', 1000,10000);
INSERT INTO mysql_servers (hostgroup_id, hostname, port,status, weight,max_connections) VALUES (3, '192.168.12.4', 3306, 'ONLINE', 1000,10000);
INSERT INTO mysql_servers (hostgroup_id, hostname, port,status, weight,max_connections) VALUES (3, '192.168.12.5', 3306, 'ONLINE', 1000,10000);

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

5.3 Crear un usuario de monitoreo ProxySQL Para habilitar la supervisión de los nodos del clúster Percona XtraDB en ProxySQL, cree un usuario con privilegios de USO en cualquier nodo del clúster y configure el usuario en ProxySQL.

El siguiente ejemplo muestra cómo agregar un usuario de monitoreo en el Nodo 2

CREATE USER 'proxysql_monitor'@'%' IDENTIFIED WITH mysql_native_password by 'ProxySQLPa55';

GRANT USAGE ON *.* TO 'proxysql_monitor'@'%';

El siguiente ejemplo muestra cómo configurar este usuario en el nodo ProxySQL:

UPDATE global_variables SET variable_value='proxysql_monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='ProxySQLPa55' WHERE variable_name='mysql-monitor_password';

Para cargar esta configuración en tiempo de ejecución, emita un comando LOAD. Para guardar estos cambios en el disco (asegurándose de que persistan después de que se cierre ProxySQL), emita un comando GUARDAR.

LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

Para asegurarse de que la supervisión esté habilitada, consulte los registros de supervisión

ProxySQLAdmin> select * from runtime_mysql_servers order by 1,5;
+--------------+--------------+------+-----------+---------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | gtid_port | status  | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+-----------+---------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 2            | 192.168.12.5 | 3306 | 0         | ONLINE  | 1000   | 0           | 10000           | 0                   | 0       | 0              |         |
| 2            | 192.168.12.3 | 3306 | 0         | SHUNNED | 1000   | 0           | 10000           | 0                   | 0       | 0              |         |
| 2            | 192.168.12.4 | 3306 | 0         | SHUNNED | 1000   | 0           | 10000           | 0                   | 0       | 0              |         |
| 3            | 192.168.12.3 | 3306 | 0         | ONLINE  | 1000   | 0           | 10000           | 0                   | 0       | 0              |         |
| 3            | 192.168.12.4 | 3306 | 0         | ONLINE  | 1000   | 0           | 10000           | 0                   | 0       | 0              |         |
| 3            | 192.168.12.5 | 3306 | 0         | ONLINE  | 1000   | 0           | 10000           | 0                   | 0       | 0              |         |
| 4            | 192.168.12.3 | 3306 | 0         | ONLINE  | 1000   | 0           | 10000           | 0                   | 0       | 0              |         |
| 4            | 192.168.12.4 | 3306 | 0         | ONLINE  | 1000   | 0           | 10000           | 0                   | 0       | 0              |         |
+--------------+--------------+------+-----------+---------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
8 rows in set (0.02 sec)

5.4 Configurar los Host Groups Ahora podemos configurar el comportamiento de ProxySQL para nuestro clúster PXC. Configuramos max_writers=1 y queremos un escritor dedicado, que no manejaría el tráfico SELECT (writer_is_also_reader=0) en la configuración actual.

INSERT INTO mysql_galera_hostgroups (writer_hostgroup,reader_hostgroup,backup_writer_hostgroup,offline_hostgroup,active,max_writers,writer_is_also_reader,max_transactions_behind) 
VALUES (2,4,3,1,1,1,1,100);
ProxySQLAdmin> select * from mysql_galera_hostgroups;
+------------------+-------------------------+------------------+-------------------+--------+-------------+-----------------------+-------------------------+---------+
| writer_hostgroup | backup_writer_hostgroup | reader_hostgroup | offline_hostgroup | active | max_writers | writer_is_also_reader | max_transactions_behind | comment |
+------------------+-------------------------+------------------+-------------------+--------+-------------+-----------------------+-------------------------+---------+
| 2                | 4                       | 3                | 1                 | 1      | 1           | 1                     | 100                     | NULL    |
+------------------+-------------------------+------------------+-------------------+--------+-------------+-----------------------+-------------------------+---------+
1 row in set (0.00 sec)

5.5 Definir las reglas de consulta para la división R/W Ahora es el momento de seguir adelante y definir las reglas de consulta, que manejarán la división de lectura/escritura. El default_hostgroup para el usuario de la aplicación en la tabla mysql_users está configurado en 11, es decir, el grupo de hosts del escritor.

Primera regla: el procesador de consultas escanea la regla de consulta para encontrar una coincidencia para el patrón ^SELECT. y, si se encuentra una coincidencia, proxysql reenviará estas consultas a destino_hostgroup=12;

Segunda regla: las consultas con un patrón ^SELECT. FOR UPDATE siempre deben entregarse desde el grupo de hosts del escritor, por lo que configuramos el destino_hostgroup=11;

INSERT INTO mysql_query_rules (active, match_digest, destination_hostgroup, apply) VALUES (1, '^SELECT.*',2, 0);
INSERT INTO mysql_query_rules (active, match_digest, destination_hostgroup, apply) VALUES (1, '^SELECT.* FOR UPDATE',3, 1);

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
ProxySQLAdmin> SELECT rule_id, match_digest,destination_hostgroup FROM mysql_query_rules;
+---------+---------------------+-----------------------+
| rule_id | match_digest        | destination_hostgroup |
+---------+---------------------+-----------------------+
| 100     | ^SELECT.*FOR UPDATE | 2                     |
| 101     | ^SELECT             | 3                     |
+---------+---------------------+-----------------------+
2 rows in set (0.00 sec)

5.6 Importar usuarios de MySQL a ProxySQL Importante: asegúrese de utilizar el complemento de autenticación predeterminado = mysql_native_password, ya que proxysql no admite caching_sha2_password en el momento de escribir este artículo. Para mas información puede consultar [ProxySQL Support for MySQL caching_sha2_password]https://www.percona.com/blog/proxysql-support-for-mysql-caching_sha2_password/(http://)

INSERT INTO mysql_users (username, password, active, default_hostgroup, transaction_persistent) VALUES
('apps', 'It_is_so_Secure1', 1, 2, 1);

Inserte los comandos creados en el paso anterior en proxysql en uno de los nodos

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

5.7 MySQL Configurar interfaces mysql De forma predeterminada, las interfaces mysql están configuradas a continuación

show variables like 'mysql-interfaces';
+------------------+--------------+
| Variable_name    | Value        |
+------------------+--------------+
| mysql-interfaces | 0.0.0.0:6033 |

En caso de que desee configurar las interfaces mysql en 0.0.0.0:3306 o cualquier otro puerto, puede hacerlo como se muestra a continuación

proxysql> show variables like 'mysql-interfaces';
+------------------+--------------+
| Variable_name    | Value        |
+------------------+--------------+
| mysql-interfaces | 0.0.0.0:6033 |
+------------------+--------------+

SET mysql-interfaces='0.0.0.0:3306';

LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

PROXYSQL RESTART;

Ahora, cuando nos conectamos como cliente de aplicación a la instancia de ProxySQL

root@ip-172-31-51-244:~# mysql -h127.0.0.1 -P 6033 -umysqladmin -pthe_secure_password -e "select user,host from mysql.user where user='mysqladmin'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+------+
| user       | host |
+------------+------+
| mysqladmin | %    |
+------------+------+

Vuelva a verificar si nuestro equilibrio de carga funciona como se esperaba

root@Proxy:~# for seq in `seq 1 100`; do mysql --host=192.168.12.2 -u apps -pIt_is_so_Secure1 -P 3306 -BNe"select @@hostname;"  2> /dev/null ; done | sort | uniq -c
     31 Node-1
     31 Node-2
     38 Node-3
root@Proxy:~#

Cómo conectar la aplicación a la base de datos a través de proxysql

Hostname: 167.172.249.178
Port: 3306

Estado de la replica slave

La configuración de la replicación es simple, puede seguir el siguiente enlace para seguir cómo configuré la replicación Streaming MySQL Backups with Percona XtraBackup – Another Alternative