Configurar balanceador de cargas para MariaDB Galera Cluster

De Apuntes
Saltar a: navegación, buscar

MariaDB es un sistema de gestión de bases de datos derivado de MySQL con licencia GPL (General Public License). Es desarrollado por Michael (Monty) Widenius (fundador de MySQL), la fundación MariaDB y la comunidad de desarrolladores de software libre.[1]

Por otro lado Galera es un sistema de cluster síncrono y multi-maestro para MariaDB. [2]

MariaDB MaxScale es un proxy de base de datos que extiende la disponibilidad, escalabilidad, y seguridad de MariaDB al mismo tiempo que simplifica el desarrollo de aplicaciones al desacoplarlo de la infraestructura de base de datos.[3]

Esta guía es parte de un conjunto de tutoriales para bases de datos con MariaDB y mostrará la manera más básica para balancear la carga en un cluster de MariaDB configurando un maestro para escrituras y esclavos en solo lectura (Read/Write Splitting).

Guías
Crear un cluster de base de datos MariaDB con Galera
Configurar balanceador de cargas para MariaDB Galera Cluster


Prerequisitos

MariaDB Galera Cluster

Se asume que se cuenta con un Galera Cluster con al menos 3 nodos según se describe en la primera guía.

Servidores

Se requiere de un servidor para desplegar el proxy, ya sea físicos o virtuales. Puede crearse redundancia en el servicio realizando la instalación en dos servidores y manteniendo una IP virtual

Software

Esta guía esta planteada para ser ejecutada en el sistema Debian GNU/Linux 9, no obstantes muchos de los pasos pueden ser replicados en otras distribuciones de GNU/Linux.

Se asume que el sistema operativo ya se encuentra instalado, que el equipos cuenta con conectividad de red y puede comunicarse con los nodos del Galera Cluster.

Asimismo, es necesario que cada equipo pueda resolver el nombre de los otros por lo que se debe editar el archivo /etc/hosts y agregar cada nodo:

127.0.0.1	localhost
172.16.0.34	db00.beta.ucr.ac.cr	db00
172.16.0.35	db01.beta.ucr.ac.cr	db01
172.16.0.36	db02.beta.ucr.ac.cr	db02
172.16.0.40	lb00.beta.ucr.ac.cr     lb00

Instalación

MaxScale

Se ejecuta el script de auto-configuración para el repositorio de MaxScale (Se usa el parámetro --skip-server para no instalar el repositorio correspondiente a MariaDB Server, pero si fuera necesario puede prescindir de él)

sudo apt-get install software-properties-common dirmngr curl
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --skip-server

Luego, se procede a instalara el paquete correspondiente

sudo apt-get install maxscale

Configuración de la Base de datos

Se procede a configurar la base de datos de backend para que pueda aceptar las conexiones de MaxScale.

Los siguientes comandos deben ser ejecutados en solo uno de los nodos del Galera cluster y no necesariamente desde el servidor de MaxScale.

Una vez en la terminal de uno de los nodos de MariaDB, se crea el usuario y se le garantizan los permisos necesarios ejecutando la siguiente serie de comandos. Se debe cambiar IP_SERVIDOR_MAXSCALE por la IP correspondiente al servidor de MaxScale y CONTRASEÑA por la contraseña que se utilizará para conectarse al cluster.

$ MS_IP="IP_SERVIDOR_MAXSCALE"
$ MS_PASS="CONTRASEÑA"
$ mysql -u root -p <<EOF
 CREATE USER 'maxscale'@${MS_IP} IDENTIFIED BY "${MS_PASS}";
 GRANT SELECT ON mysql.db TO 'maxscale'@${MS_IP};
 GRANT SELECT ON mysql.tables_priv TO 'maxscale'@${MS_IP};
 GRANT SELECT ON mysql.user TO 'maxscale'@${MS_IP};
 GRANT SHOW DATABASES ON *.* TO 'maxscale'@${MS_IP};
 GRANT REPLICATION SLAVE on *.* TO 'maxscale'@${MS_IP};
 GRANT REPLICATION CLIENT on *.* TO 'maxscale'@${MS_IP};
EOF

Luego, en cada uno de los servidores de base de datos de backend se debe activar la opción de proxy-protocol-networks que permitirá al balanceador enviarle la dirección IP real del cliente que está realizando la conexión a la base de datos (Requiere de MariaDB 10.3.1 o superior). Se crea el archivo /etc/mysql/mariadb.conf.d/proxy_protocol.cnf son el siguiente contenido, donde se debe cambiar IP_SERVIDOR_MAXSCALE por la IP correspondiente al servidor de MaxScale:

[mysqld]
proxy-protocol-networks=::1,localhost, IP_SERVIDOR_MAXSCALE

Por último se reinicia el servicio de MariaDB en cada uno de los nodos de backend

sudo systemctl restart mariadb

Configuración

MaxScale

Se crea un respaldo de la configuración original de MaxScale

sudo mv /etc/maxscale.cnf /etc/maxscale.cnf.bkp

Se crean las llaves para luego cifrar la contraseña del usuario de base de datos.

sudo maxkeys /var/lib/maxscale/
sudo chown maxscale:maxscale /var/lib/maxscale/.secrets

Se cifra la contraseña. Se debe recordar sustituir CONTRASEÑA por la contraseña que se utilizó en el proceso de instalación y que es la que se utilizará para conectar MaxScale con la base de datos de backend

maxpasswd "CONTRASEÑA"

El comando anterior generará un hash que se usará en el archivo de configuración.

Crear la nueva configuración con el siguiente comando

sudo editor /etc/maxscale.cnf

El archivo de configuración debe ser similar al siguiente. Se debe recordar cambiar HASH_MAXPASSWD por la contraseña cifrada en el paso anterior

[maxscale]
threads=4
# 'auto' se ajusta automáticamente al número de procesadores del servidor
#threads=auto

[Galera Monitor]
type=monitor
module=galeramon
disable_master_failback=1
servers=dbserver00, dbserver01, dbserver02
user=maxscale
passwd=HASH_MAXPASSWD

[Splitter Service]
type=service
router=readwritesplit
servers=dbserver00, dbserver01, dbserver02
user=maxscale
passwd=HASH_MAXPASSWD
# El Master puede aceptar lecturas
#master_accept_reads=true
# Usar el 100% de los Slaves para conexiones
#max_slave_connections=100%
# Enviar consultas al Slave que tenga menos conexiones
#router_options=slave_selection_criteria=LEAST_CURRENT_OPERATIONS


[Splitter Listener]
type=listener
service=Splitter Service
protocol=MySQLClient
port=3306
# Para forzar IPv4
address=0.0.0.0


[dbserver00]
type=server
address=db00
port=3306
protocol=MySQLBackend
proxy_protocol=on

[dbserver01]
type=server
address=db01
port=3306
protocol=MySQLBackend
proxy_protocol=on

[dbserver02]
type=server
address=db02
port=3306
protocol=MySQLBackend
proxy_protocol=on

[CLI]
type=service
router=cli

[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
address=localhost
port=6603

[CLI Unix Listener]
type=listener
service=CLI
protocol=maxscaled
socket=default

Es importante notar que cada servidor de backend se declara en una sección separada, por ejemplo [dbserver00], y dentro de esta sección se especifica la IP o nombre de dicho servidor (address)

Después, se reinicia el servicio de MaxScale para arrancar con las nuevas configuraciones

sudo systemctl restart maxscale

Pruebas

Para probar el funcionamiento se pueden ejecutar los siguientes comandos

sudo maxadmin list services

Debe retornar la lista de servicios disponibles en MaxScale

Services.
--------------------------+-------------------+--------+----------------+-------------------
Service Name              | Router Module     | #Users | Total Sessions | Backend databases
--------------------------+-------------------+--------+----------------+-------------------
Splitter Service          | readwritesplit    |      2 |              2 | dbserver00, dbserver01, dbserver02
CLI                       | cli               |      3 |              4 | 
--------------------------+-------------------+--------+----------------+-------------------
sudo maxadmin list listeners

Debe retornar la lista de listeners disponibles en MaxScale

Listeners.
---------------------+---------------------+--------------------+-----------------+-------+--------
Name                 | Service Name        | Protocol Module    | Address         | Port  | State
---------------------+---------------------+--------------------+-----------------+-------+--------
Splitter Listener    | Splitter Service    | MySQLClient        | *               |  3306 | Running
CLI Listener         | CLI                 | maxscaled          | localhost       |  6603 | Running
CLI Unix Listener    | CLI                 | maxscaled          | default         |     0 | Running
---------------------+---------------------+--------------------+-----------------+-------+--------

Por último, si ya existe un usuario y una base de datos disponible puede configurar la aplicación para realizar la conexión por medio de MaxScale. Por ejemplo, continuando con la base de datos de pruebas creada durante el proceso de instalación de MariaDB en la guía anterior se pueden realizar las siguientes pruebas:

Crear un usuario externo al cluster para la consulta de la base de datos; desde uno de los nodos del cluster se ejecuta el siguiente comando, donde IP_CLIENTE_EXTERNO corresponde a la dirección IP del cliente externos al cluster que se conectará a la base de datos y CONTRASEÑA debe ser cambiado por la contraseña que autentica al cliente:

mysql -u root -p -e 'GRANT ALL PRIVILEGES ON playground.* TO 'test'@IP_CLIENTE_EXTERNO IDENTIFIED BY "CONTRASEÑA"; FLUSH PRIVILEGES;';

Una vez creado el usuario, se puede realizar la consulta a la base de datos, pasando por el balanceado de MaxScale; se ejecuta el siguiente comando desde el cliente externo, donde IP_SERVIDOR_MAXSCALE es la dirección IP del servidor de MaxScale:

mysql -u test -p -h IP_SERVIDOR_MAXSCALE playground -e "SELECT * FROM playground.equipment;"

El resultado de la consulta debe ser similar al siguiente:

+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  5 | slide  |     2 | blue   |
|  8 | swing  |    10 | yellow |
| 11 | seesaw |     3 | green  |
+----+--------+-------+--------+

Problemas

No puedo utilizar el usuario root de la base de datos con MaxScale

Por defecto, y por razones de seguridad, MaxScale no permite al usuario root realizar conexiones a los servidores de backend, para cambiar este comportamiento y permitir que root realice conexiones directas al cluster por medio de MaxScale se debe agregar la siguiente linea al archivo de configuración:

enable_root_user=true

Es importante resaltar que esto puede atraer serios riesgos de seguridad y no se recomienda.

Enlaces

Enlaces de referencia