Automatizzare l'avvio di Galera Cluster su 2 nodi dopo un reboot
Nel post Galera Cluster per MySQL abbiamo visto come installare configurare ed avviare un cluster Galera con MySQL su 2 nodi, e ci siamo anche soffermati sull’importanza della procedura di avvio dei nodi. Il problema è legato al fatto che all’avvio ciascun nodo cerca un primario al quale connettersi. In caso di riavvio del singolo server non ci sarebbero problemi ad attivare lo start automatico di mysqld tramite systemctl, ma in caso di riavvio completo dell’infrastruttura su uno dei server è necessario procedere con il bootstrap del cluster.
Automatizzare il reboot
L’idea è quella di attivare un job nel cron che viene eseguito al reboot del server, e controllare se uno dei nodi del cluster sia già attivo. Nel caso in cui uno dei nodi sia già attivo, l’avvio verrà eseguito tramite systemctl start mysqld
, se invece non ci sono nodi attivi allora l’avvio sarà eseguito tramite /usr/bin/mysqld_bootstrap --wsrep-new-cluster
.
Questo lo script da schedulare al reboot sul nodo 1.
#!/bin/bash
# Galera node 1 - This node
GNODE1="172.31.81.55"
# Galera node 2 - Other node
GNODE2="172.31.80.162"
# MySQL port
GPORT=3336
if [ `(echo > /dev/tcp/$GNODE2/$GPORT) >/dev/null 2>&1 && echo 1 || echo 0` -eq 1 ]; then
echo "Node 2 is up, do not bootstrap the cluster"
sed -ie '/safe_to/c\safe_to_bootstarp: 0' /opt/mysql/data/grastate.dat
systemctl start mysqld
else
echo "Node 2 is down, bootstrap the cluster"
sed -ie '/safe_to/c\safe_to_bootstarp: 1' /opt/mysql/data/grastate.dat
/usr/bin/mysqld_bootstrap --wsrep-new-cluster
fi
Questo invece lo script da schedulare al reboot sul nodo 2.
#!/bin/bash
# Galera node 1 - Other node
GNODE1="172.31.81.55"
# Galera node 2 - This node
GNODE2="172.31.80.162"
# MySQL port
GPORT=3336
sleep 10
if [ `(echo > /dev/tcp/$GNODE1/$GPORT) >/dev/null 2>&1 && echo 1 || echo 0` -eq 1 ]; then
echo "Node 1 is up, do not bootstrap the cluster"
sed -ie '/safe_to/c\safe_to_bootstarp: 0' /opt/mysql/data/grastate.dat
systemctl start mysqld
else
echo "Node 1 is down, bootstrap the cluster"
sed -ie '/safe_to/c\safe_to_bootstarp: 1' /opt/mysql/data/grastate.dat
/usr/bin/mysqld_bootstrap --wsrep-new-cluster
fi
Indirizzi IP, porta e path dei file sono quelli usati nel setup del sistema, da notare l’inversione degli indirizzi sui 2 nodi.
Lo script è attivato come job nel crontab in questo modo @reboot sleep 5 && /usr/sbin/mysqld_bootstrap.sh
, lo script deve essere eseguibile.
Concludo dicendo che forse (… sicuramente) la soluzione non è ideale, però sembra funzionare e fino ad ora non mi ha dato problemi.