Configurar balanceador de cargas para MariaDB Galera Cluster
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 |
Contenido
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
- https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-14/setting-up-maxscale/
- https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-14/maxscale-readwrite-splitting-with-galera-cluster/
- https://linoxide.com/cluster/configure-mariadb-maxscale-galera-cluster/
- https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-14/maxscale-configuration-usage-scenarios/
- https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-14/maxadmin/