Probar ReadWriteSplit de MaxScale con MariaDB
Introducción
MaxScale provee una funcionalidad que permite que las instrucciones de UPDATE
INSERT
DELETE
sean enviadas al nodo Master y las consultas
SELECT
sean enviadas a los nodos Esclavo al usar el enrutador ReadWriteSplit
.
De acuerdo a la documentación de MaxScale:
El ruteador readwritesplit está diseñado para incrementar la capacidad de procesamiento de sólo lectura de un cluster manteniendo la consistencia.
Las consultas de lectura, que no modifican datos, son esparcidas en múltiples nodos mientras que todas las instrucciones de escritura serán enviadas a un sólo nodo.
Probemos esta funcionalidad.
Ambiente
Para esta prueba vamos a usar nuestro Cluster de Galera con MaxScale ya construido en virtual machines instances de la Google Cloud Platform. Para más información favor de visitar MaxScale con MariaDB Galera Cluster en Instancias Virtuales y MariaDB Galera Cluster en Instancias Virtuales.
MaxScale para Cluster de Galera
Servidores
Enviando el comando maxctrl
podemos ver que tenemos un servidor Master patomariagm:3306
y los servidores patomariag1:3306
y patomariag2:3306
como nodos Esclavos:
pato@patomaxgalera~$ maxctrl list servers
+----------------------------------------------------------------------------------+
¦ Server ¦ Address ¦ Port ¦ Connections ¦ State ¦ GTID ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node0 ¦ patomariagm ¦ 3306 ¦ 0 ¦ Master, Synced, Running ¦ 1-1-12 ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node1 ¦ patomariag1 ¦ 3306 ¦ 0 ¦ Slave, Synced, Running ¦ 1-1-12 ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node2 ¦ patomariag2 ¦ 3306 ¦ 0 ¦ Slave, Synced, Running ¦ 1-1-12 ¦
+----------------------------------------------------------------------------------+
Configuración de MaxScale
Nuestro archivo de configuración de MaxScale incluye los siguientes servicios que usan esta funcionalidad definida como router=readwritesplit
que divide la actividad SIUD de la base de datos entre los nodos Pato-Node0
(Master) y Pato-Node1
(Esclavo):
[RW-Service]
type=service
router=readwritesplit
servers=Pato-Node0,Pato-Node1
user=maxpato
password=.....
[RW-Listener]
type=listener
service=RW-Service
protocol=MariaDBClient
port=4006
Servicios
Enviando el comando maxctrl
podemos ver listado el servicio RW-Service
para los servidores Pato-Node0, Pato-Node1
:
pato@patomaxgalera~$ maxctrl list services
+----------------------------------------------------------------------------------------+
¦ Service ¦ Router ¦ Connections ¦ Total Connections ¦ Servers ¦
+------------+----------------+-------------+-------------------+------------------------¦
¦ CLI ¦ cli ¦ 0 ¦ 2 ¦ ¦
+------------+----------------+-------------+-------------------+------------------------¦
¦ RW-Service ¦ readwritesplit ¦ 0 ¦ 0 ¦ Pato-Node0, Pato-Node1 ¦
+------------+----------------+-------------+-------------------+------------------------¦
¦ RO-Service ¦ readconnroute ¦ 0 ¦ 0 ¦ Pato-Node2 ¦
+----------------------------------------------------------------------------------------+
Probar Funcionalidad Read Write Split
Preparación
Habilitemos las estadísticas de usuario en ambos nodos para que podamos capturar la actividad de los usuarios:
MariaDB [mysql]> set global userstat = 1 ;
Query OK, 0 rows affected (0.000 sec)
Conectarse a la Base de Datos usando MaxScale
Nos conectamos al servidor de MaxScale que está escuchando en el puerto 4006
para el servicio RW-Service
:
$ mysql -u remoto -p -h patomaxgalera -P 4006
y validamos que estamos conectados en el servidor Pato-Node1 patomariag1
:
MariaDB [(none)]> select @@hostname ;
+-------------+
| @@hostname |
+-------------+
| patomariag1 |
+-------------+
1 row in set (0.000 sec)
Entonces hacemos un INSERT
y un SELECT
:
MariaDB [(none)]> use taller
Database changed
MariaDB [taller]> insert into r1 (c2,d3) values (@@hostname,now());
Query OK, 1 row affected (0.398 sec)
MariaDB [taller]> commit;
Query OK, 0 rows affected (0.000 sec)
MariaDB [taller]> select * from r1;
...
Validar Lectura Realizada en el Esclavo
Revisando la actividad en el servidor patomariag1 (Pato-Node1)
podemos ver que el usuario remoto
ejecutó un comando SELECT
y obtuvo 15 registros:
pato@patomariag1~$ mysql
MariaDB [(none)]> select USER, ROWS_READ, ROWS_INSERTED, SELECT_COMMANDS, UPDATE_COMMANDS
-> from information_schema.user_statistics where user = 'remoto';
+--------+-----------+---------------+-----------------+-----------------+
| USER | ROWS_READ | ROWS_INSERTED | SELECT_COMMANDS | UPDATE_COMMANDS |
+--------+-----------+---------------+-----------------+-----------------+
| remoto | 15 | 0 | 1 | 0 |
+--------+-----------+---------------+-----------------+-----------------+
1 row in set (0.001 sec)
podemos ver que no hubo actividad de INSERT
o UPDATE
registrada en este nodo Esclavo.
Validar Escritura Realizada en el Master
Luego revisando la actividad en el servidor patomariagm (Pato-Node0)
podemos ver que el usuario remoto
ejecutó un INSERT
y un UPDATE
:
pato@patomariagm~$ mysql
MariaDB [(none)]> select USER, ROWS_READ, ROWS_INSERTED, SELECT_COMMANDS, UPDATE_COMMANDS
-> from information_schema.user_statistics where user = 'remoto';
+--------+-----------+---------------+-----------------+-----------------+
| USER | ROWS_READ | ROWS_INSERTED | SELECT_COMMANDS | UPDATE_COMMANDS |
+--------+-----------+---------------+-----------------+-----------------+
| remoto | 0 | 1 | 0 | 1 |
+--------+-----------+---------------+-----------------+-----------------+
1 row in set (0.000 sec)
podemos ver que no hubo actividad de SELECT
registrada en el nodo Master.
¡La funcionalidad de Read Write Split está trabajando!
Conclusión
Como pudimos ver la funcionalidad de MaxScale ReadWriteSplit realmente divide las consultas enviadas al Cluster de Galera en instrucciones de escritura y lectura y las envía respectivamente hacia el Master o hacia cualquiera de los nodos Esclavo.
Para más información acerca de ReadWriteSplit ir a la Documentación de MaxScale.