2 Balanceadores de carga para MariaDB con Galera con Virtual IP
· 5min · linux
Introducción
En esta entrada vamos a ver cómo instalar y configurar un balanceador de carga para MariaDB con Galera.
Nodos del Cluster
- nodo1: 192.168.1.81
- nodo2: 192.168.1.82
- nodo3: 192.168.1.83
- maxscale1: 192.168.1.84
- maxscale2: 192.168.1.85
- maxscalevip: 192.168.1.86
Balanceador de carga
Para balancear la carga de los nodos del clúster de MariaDB con Galera, vamos a usar un balanceador de carga.
Nodos del balanceador de carga
Lo primero sería realizar la instalación de los nodos del balanceador de carga usando Ubuntu 24.04 Server, configurando la dirección IP fija y el hostname de cada uno de ellos.
Instalación de repositorios automática en Todos los nodos del balanceador de carga
curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
Instalación de Mariadb MaxScale
Para ello vamos a usar el balanceador de carga MaxScale de MariaDB.
sudo apt update
sudo apt install maxscale
Creación del usuario para MaxScale
Para ello vamos a crear un usuario en el nodo 1 del clúster de MariaDB con Galera.
mysql -u root -p
CREATE USER 'maxscale'@'%' IDENTIFIED BY 'maxscale_pw';
GRANT SELECT ON mysql.user TO 'maxscale'@'%';
GRANT SELECT ON mysql.db TO 'maxscale'@'%';
GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.columns_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.procs_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.proxies_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.roles_mapping TO 'maxscale'@'%';
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%';
FLUSH PRIVILEGES;
Creación del la cuenta de usuario de la bbdd para MaxScale
CREATE USER 'usuario_cliente'@'192.168.1.84' IDENTIFIED BY 'my_secret_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'usuario_cliente'@'192.168.1.84';
CREATE USER 'usuario_cliente'@'192.168.1.85' IDENTIFIED BY 'my_secret_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'usuario_cliente'@'192.168.1.85';
FLUSH PRIVILEGES;
Ojo con el la contraseña y la ip del nodo de MaxScale
Creación del usuario monitor
CREATE USER 'monitor_user'@'%' IDENTIFIED BY 'my_password';
FLUSH PRIVILEGES;
Ojo con la contraseña del usuario de monitor
Configuración de MaxScale en ambos nodos del balanceador de carga
Para ello editamos el fichero de configuración de MaxScale
sudo nano /etc/maxscale.cnf
Contenido del fichero de configuración
[maxscale]
threads=auto
admin_enabled=1 # Habilita el servicio administrativo (REST API + GUI)
admin_auth=1 # Obliga a usar usuario/contraseña para acceder
admin_gui=1
admin_host=0.0.0.0
admin_port=8989
admin_secure_gui=false
[dbserv1]
type=server
address=192.168.1.81
port=3306
[dbserv2]
type=server
address=192.168.1.82
port=3306
[dbserv3]
type=server
address=192.168.1.83
port=3306
[Galera-Monitor]
type=monitor
module=galeramon
servers=dbserv1, dbserv2, dbserv3
user=monitor_user
password=my_password
monitor_interval=2000ms
[Read-Write-Service]
type=service
router=readconnroute
router_options=synced,master,slave
servers=dbserv1, dbserv2, dbserv3
user=maxscale
password=maxscale_pw
[RW_Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=3306
Arranque del servicio
sudo systemctl start maxscale
Verificación del estado del servicio
sudo systemctl status maxscale
Acceso al panel de administración
Para acceder al panel de administración de MaxScale, abre un navegador y accede a la siguiente URL: http://192.168.1.84:8989/
Con el usuario y contraseña: admin/mariadb
Instalación del cliente de MariaDB
sudo apt update
sudo apt install mariadb-client
Verificación con el cliente de MariaDB
sudo mariadb --protocol=TCP \
--host=192.168.1.84 \
--port=3306 \
--user=usuario_cliente \
--skip-ssl \
--password
Mete la contraseña del usuario cliente que has creado anteriormente: my_secret_password
SHOW DATABASES;
Verificación del estado del MAXSCALE
sudo maxctrl list services --user=admin --password=mariadb
sudo maxctrl list servers --user=admin --password=mariadb
sudo maxctrl list listeners --user=admin --password=mariadb
Configuración de la IP Virtual
Para configurar la IP Virtual, vamos a usar keepalived
en ambos nodos del balanceador de carga.
Instalación de keepalived
sudo apt update
sudo apt install keepalived
Configuración de keepalived en el nodo maxscale1
Creamos el fichero de configuración de keepalived /etc/keepalived/keepalived.conf
global_defs {
# set hostname
router_id maxscale1
}
vrrp_instance VRRP1 {
# on primary node, specify [MASTER]
# on backup node, specify [BACKUP]
# if specified [BACKUP] + [nopreempt] on all nodes, automatic failback is disabled
state MASTER
# if you like disable automatic failback, set this value with [BACKUP]
# nopreempt
# network interface that virtual IP address is assigned
interface enp1s0
# set unique ID on each VRRP interface
# on the a VRRP interface, set the same ID on all nodes
virtual_router_id 101
# set priority : [Master] > [BACKUP]
priority 200
# VRRP advertisement interval (sec)
advert_int 1
# virtual IP address
virtual_ipaddress {
192.168.1.86/24
}
}
Reiniciamos el servicio de keepalived
sudo systemctl restart keepalived
comprobamos el estado del servicio
sudo systemctl status keepalived
Comprobamos que la IP Virtual está activa
ip a s
Debería darnos esta salida
alumno@maxscale1:~$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:75:57:a8 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.84/24 brd 192.168.1.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet 192.168.1.86/24 scope global secondary enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe75:57a8/64 scope link
valid_lft forever preferred_lft forever
Configuración de keepalived en el nodo maxscale2
Creamos el fichero de configuración de keepalived /etc/keepalived/keepalived.conf
# create new
global_defs {
router_id maxscale2
}
vrrp_instance VRRP1 {
state BACKUP
# nopreempt
interface enp1s0
virtual_router_id 101
priority 100
advert_int 1
virtual_ipaddress {
192.168.1.86/24
}
}
Reiniciamos el servicio de keepalived
sudo systemctl restart keepalived
comprobamos el estado del servicio
sudo systemctl status keepalived
Comprobamos que la IP Virtual está activa
ip a s
Debería darnos esta salida
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:9f:4f:bd brd ff:ff:ff:ff:ff:ff
inet 192.168.1.85/24 brd 192.168.1.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe9f:4fbd/64 scope link
valid_lft forever preferred_lft forever
Verificación del balanceador de carga
Para verificar que el balanceador de carga está funcionando correctamente, podemos usar e cliente de MariaDB
sudo mariadb --protocol=TCP \
--host=192.168.1.86 \
--port=3306 \
--user=usuario_cliente \
--skip-ssl \
--password
Mete la contraseña del usuario cliente que has creado anteriormente: my_secret_password Y debes ver las bases de datos que tienes en el clúster de MariaDB con Galera.
SHOW DATABASES;
Verificación del failover
Para verificar que el failover funciona correctamente, podemos detener el servicio de keepalived en el nodo maxscale1 y comprobar que la IP Virtual se mueve al nodo maxscale2. Desde el nodo maxscale1, paramos la interfaz de red para simular una caída del nodo. Ten en cuenta que si estás conectado por SSH a este nodo, perderás la conexión.
sudo ip link set down enp1s0
Ahora, desde el nodo maxscale2, comprobamos que la IP Virtual se ha movido al nodo maxscale2.
ip a s
Debería darnos esta salida
alumno@maxscale2:~$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:9f:4f:bd brd ff:ff:ff:ff:ff:ff
inet 192.168.1.85/24 brd 192.168.1.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet 192.168.1.86/24 scope global secondary enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe9f:4fbd/64 scope link
valid_lft forever preferred_lft forever
Ahora la IP Virtual está activa en el nodo maxscale2. Si probamos a conectarnos al balanceador de carga desde el nodo maxscale2, deberíamos poder acceder a las bases de datos del clúster de MariaDB con Galera.
sudo mariadb --protocol=TCP \
--host=192.168.1.86 \
--port=3306 \
--user=usuario_cliente \
--skip-ssl \
--password
Mete la contraseña del usuario cliente que has creado anteriormente: my_secret_password
SHOW DATABASES;
Deberíamos ver las bases de datos que tienes en el clúster de MariaDB con Galera.
Recuperación del nodo maxscale1
Si volvemos a levantar la interfaz de red en el nodo maxscale1, la IP Virtual volverá a estar activa en el nodo maxscale1.
sudo ip link set up enp1s0
Debríamos ver que la IP Virtual vuelve a estar activa en el nodo maxscale1.
ip a s
Debería darnos esta salida
alumno@maxscale1:~$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:75:57:a8 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.84/24 brd 192.168.1.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet 192.168.1.86/24 scope global secondary enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe75:57a8/64 scope link
valid_lft forever preferred_lft forever
Si probamos a conectarnos al balanceador de carga desde el nodo maxscale1, deberíamos poder acceder a las bases de datos del clúster de MariaDB con Galera.
sudo mariadb --protocol=TCP \
--host=192.168.1.86 \
--port=3306 \
--user=usuario_cliente \
--skip-ssl \
--password
Mete la contraseña del usuario cliente que has creado anteriormente: my_secret_password
SHOW DATABASES;
Deberíamos ver las bases de datos que tienes en el clúster de MariaDB con Galera.
Conclusión
En esta entrada hemos visto cómo instalar y configurar un balanceador de carga para MariaDB con Galera usando MaxScale y keepalived.