Deshabilitar Master Failback en MaxScale para Galera

Introducción

El monitor de MaxScale galeramon incluye una opción para prevenir que un nodo que era Master recobre su rol original cuando se vuelva a unir a un Cluster de Galera.

Previamente probamos las funcionalidades de FailBack en la nota MaxScale con MariaDB Galera Cluster, esta vez queremos configurar la opción disable_master_failback y validar que el nodo se vuelve a unir con el rol de Esclavo.

Deshabilitar el Master FailBack

Configurar el Monitor de MaxScale

Edita el archivo de configuración de MaxScale:

pato@patomaxgalera:~$ sudo nano /etc/maxscale.cnf

Ve a la sección del monitor de MaxScale y agrega el parámetro disable_master_failback=true:

[Pato-Monitor]
type=monitor
module=galeramon
servers=Pato-Node0,Pato-Node1,Pato-Node2
user=maxpato
password=xxxxxxxx
monitor_interval=2000
disable_master_failback=true

Guarda el archivo y reinicia MaxScale para que la nueva configuración se cargue:

pato@patomaxgalera:~$ sudo systemctl restart maxscale
pato@patomaxgalera:~$

FailBack

Ahora vamos a probar el comportamiento de los roles con esta nueva configuración cuando el nodo Master falla como se describe aquí:

Con esta opción habilitada, si el estatus master es asignado a un nuevo nodo éste on será reasignado al nodo original mientras el nuevo master siga en ejecución.

Revisemos el estado del Cluster de Galera enviando el comando maxctrl list servers:

pato@patomaxscale:~$ maxctrl list servers
+----------------------------------------------------------------------------------+
¦ Server     ¦ Address     ¦ Port ¦ Connections ¦ State                   ¦ GTID   ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node0 ¦ patomariagm ¦ 3306 ¦ 0           ¦ Master, Synced, Running ¦ 1-1-10 ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node1 ¦ patomariag1 ¦ 3306 ¦ 0           ¦ Slave, Synced, Running  ¦ 1-1-10 ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node2 ¦ patomariag2 ¦ 3306 ¦ 0           ¦ Slave, Synced, Running  ¦ 1-1-10 ¦
+----------------------------------------------------------------------------------+

Detengamos el servidor designado patomariagm:

pato@patomariagm:~$ sudo systemctl stop mariadb

y valida el estado enviando el comando maxctrl list servers:

pato@patomaxscale:~$ maxctrl list servers
+----------------------------------------------------------------------------------+
¦ Server     ¦ Address     ¦ Port ¦ Connections ¦ State                   ¦ GTID   ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node0 ¦ patomariagm ¦ 3306 ¦ 0           ¦ Down                    ¦        ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node1 ¦ patomariag1 ¦ 3306 ¦ 0           ¦ Master, Synced, Running ¦ 1-1-11 ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node2 ¦ patomariag2 ¦ 3306 ¦ 0           ¦ Slave, Synced, Running  ¦ 1-1-11 ¦
+------------+-------------+------+-------------+-------------------------+--------+

nuestro servidor es marcado como Down y el siguiente servidor es promovido a Master. Podemos ver que el cambio de roles fue detectado en el registro de MaxScale:

pato@patomaxscale:~$ tail -f /var/log/maxscale/maxscale.log

2020-06-08 21:43:16   notice : Server changed state: Pato-Node0[patomariagm:3306]: master_down. [Master, Synced, Running] -> [Down]
2020-06-08 21:43:16   notice : Server changed state: Pato-Node1[patomariag1:3306]: new_master. [Slave, Synced, Running] -> [Master, Synced, Running]
2020-06-08 21:43:16   notice : Master switch detected: lost a master and gained a new one

Entonces si iniciamos el servidor patomariagm éste no recobrará su estaus de Master:

pato@patomariagm:~$ sudo systemctl start mariadb

y lo validamos mandando el comando maxctrl list servers:

pato@patomaxscale:~$ maxctrl list servers

+-----------------------------------------------------------------------------------------------------+
¦ Server     ¦ Address     ¦ Port ¦ Connections ¦ State                                      ¦ GTID   ¦
+------------+-------------+------+-------------+--------------------------------------------+--------¦
¦ Pato-Node0 ¦ patomariagm ¦ 3306 ¦ 0           ¦ Slave, Synced, Running                     ¦ 1-1-12 ¦
+------------+-------------+------+-------------+--------------------------------------------+--------¦
¦ Pato-Node1 ¦ patomariag1 ¦ 3306 ¦ 0           ¦ Master, Synced, Master Stickiness, Running ¦ 1-1-12 ¦
+------------+-------------+------+-------------+--------------------------------------------+--------¦
¦ Pato-Node2 ¦ patomariag2 ¦ 3306 ¦ 0           ¦ Slave, Synced, Running                     ¦ 1-1-12 ¦
+-----------------------------------------------------------------------------------------------------+

Podemos ver que el cambio fue detectado en el registro de MaxScale:

pato@patomaxscale:~$ tail -f /var/log/maxscale/maxscale.log

2020-06-08 21:43:52   notice : Server changed state: Pato-Node0[patomariagm:3306]: slave_up. [Down] -> [Slave, Synced, Running]

Hemos validado que el role Master no fue reasignado al nodo original.

Restaurar el Rol de Master

Con el fin de regresar el rol de Master al servidor original necesitamos detener el Master actual:

pato@patomariag1:~$ sudo systemctl stop mariadb

y validamos enviando el comando maxctrl list servers:

pato@patomaxscale:~$ maxctrl list servers

+----------------------------------------------------------------------------------+
¦ Server     ¦ Address     ¦ Port ¦ Connections ¦ State                   ¦ GTID   ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node0 ¦ patomariagm ¦ 3306 ¦ 0           ¦ Master, Synced, Running ¦ 1-1-14 ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node1 ¦ patomariag1 ¦ 3306 ¦ 0           ¦ Down                    ¦        ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node2 ¦ patomariag2 ¦ 3306 ¦ 0           ¦ Slave, Synced, Running  ¦ 1-1-14 ¦
+----------------------------------------------------------------------------------+

Podemos ver que el cambio fue detectado en el registro de MaxScale:

pato@patomaxscale:~$ tail -f /var/log/maxscale/maxscale.log

2020-06-08 21:46:14   notice : Server changed state: Pato-Node0[patomariagm:3306]: new_master. [Slave, Synced, Running] -> [Master, Synced, Running]
2020-06-08 21:46:14   notice : Server changed state: Pato-Node1[patomariag1:3306]: master_down. [Master, Synced, Master Stickiness, Running] -> [Down]
2020-06-08 21:46:14   notice : Master switch detected: lost a master and gained a new one

Y finalmente volvemos a iniciar el servidor para regresar el estado original del cluster:

pato@patomariag1:~$ sudo systemctl start mariadb

y lo validamos mandando el comando maxctrl list servers:

pato@patomaxscale:~$ maxctrl list servers

+----------------------------------------------------------------------------------+
¦ Server     ¦ Address     ¦ Port ¦ Connections ¦ State                   ¦ GTID   ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node0 ¦ patomariagm ¦ 3306 ¦ 0           ¦ Master, Synced, Running ¦ 1-1-15 ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node1 ¦ patomariag1 ¦ 3306 ¦ 0           ¦ Slave, Synced, Running  ¦ 1-1-15 ¦
+------------+-------------+------+-------------+-------------------------+--------¦
¦ Pato-Node2 ¦ patomariag2 ¦ 3306 ¦ 0           ¦ Slave, Synced, Running  ¦ 1-1-15 ¦
+----------------------------------------------------------------------------------+

Podemos ver que el cambio fue detectado en el registro de MaxScale:

2020-06-08 21:47:04   notice : Server changed state: Pato-Node1[patomariag1:3306]: slave_up. [Down] -> [Slave, Synced, Running]

Conclusión

Hemos configurado MaxScale para evitar que un nodo Master fallido recobre su rol Master cuando se recupera y se vuelve a unir al Cluste de Galera y validamos este comportamiento en nuestra instalacion de Cluster de Galera para MariaDB con virtual machines en la Google Cloud Platform.