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.