LINUX:MariaDB/Galera - Solution d'automatisation de démarrage
→ retour au menu de Galera : Cluster de MariaDB
But
Pour contourner cette limitation d'automatisation de démarrage du cluster Galera, j'ai créé deux services Systemd de type Timer, l'un pour MariaDB et l'autre pour Garb. Au lieu d'utiliser Systemd, on peut utiliser le système de Cron.
MariaDB
Le programme est écrit script "bash" et en LUA. Il sera actif sur toutes les machines du cluster MariaDB: "sv1.home.dom", "sv2.home.dom", "sv3.home.dom" et "sv4.home.dom".
Principe
Le script passe par une série de vérifications pour aboutir, si c'est nécessaire, au lancement du service MariaDB.
- La procédure commence par vérifier si le service MariaDB est déjà lancé. Si c'est le cas, la situation est opérationnelle.
- Dans le cas contraire, on recherche sur parmi les autres machines du cluster MariaDB grâce à une procédure écrite en LUA, s'il y en a une où MariaDB s'exécute. Si c'est le cas, on lance le service MariaDB.
- Sinon on vérifie que le fichier d'état de Galera possède un "bootstrap" actif, si c'est le cas, on lance le service MariaDB en initialisant Galera.
- Si ce n'est pas le cas, on récupère grâce à Rsyncd, les états de Galera sur toutes les machines du cluster MariaDB car c'est sur celle qui a le n° de séquence le plus haut qui lancera le service MariaDB en initialisant Galera après activation du "bootstrap". Pour effectuer cette étape, il faut que toutes les machines du cluster MariaDB soient démarrées et accessibles. Si elles ne sont pas toutes actives, on attend.
Cette procédure tourne à intervalle régulier sur toutes les machines du cluster MariaDB.
Rsyncd
Une des étapes consiste à récupérer le fichier d'état de Galera sur toutes les machines du cluster MariaDB. Nous utilisons le service Rsyncd. Ce service sera configuré et activé sur toutes ces machines.
Installation
Le logiciel "rsync" est normalement installé d'office. Il nous faut installer la partie service:
dnf install rsync-daemon dnf install rsync
Fichier de configuration
Le fichier de configuration se nomme "/etc/rsyncd.conf". Voici son contenu pour notre utilisation:
# global max connections = 8 # limiter à IPV4 address=0.0.0.0 uid = root gid = root use chroot = true log file = /var/log/rsyncd.log lock file = /run/rsyncd.lock pid file = /run/rsyncd.pid # partage [db] path = /produc/mysql comment = Espace de la DB hosts allow = 192.168.1.71 192.168.1.72 192.168.1.73 192.168.1.74 read only = true write only = false list = true
On donne accès en lecture seule au répertoire contenant la base de données de MariaDB.
Configurer le mur de feu ou FireWall
Si vous activez le Firewall, ce qui est recommandé, il faut y ajouter la règle suivante:
-A INPUT -p tcp -m tcp --sport 873 -m iprange --src-range 192.168.1.71-192.168.1.74 -m conntrack --ctstate NEW -j ACCEPT -A OUTPUT -p tcp -m tcp --dport 873 -m iprange --dst-range 192.168.1.71-192.168.1.74 -j ACCEPT
Activer et lancer le service
Le service à lancer est "rsyncd.service". La première commande active le service pour qu'à chaque démarrage du serveur, le service se lance. La seconde lance directement le service.
systemctl enable rsyncd.service systemctl start rsyncd.service
Localisation des scripts
Comme précédemment, nous avions placé la base de données dans le répertoire "/produc/mysql". Et nous plaçons les scripts dans le répertoire "/produc/mysql.bat".
Fichier "hosts.txt"
Nous créons pour commencer le fichier "/produc/mysql.bat/hosts.txt". Il contiendra les noms des machines du cluster MariaDB.
sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom
Installation de LUA
Une partie de la procédure est écrite dans le langage de script LUA. Il faut l'installer:
dnf install lua dnf install lua-socket
Script LUA
Ce script sert à rechercher les machines du cluster où le service MariaDB s'exécute en essayant de se connecter à son port TCP 3306.
Voici le script. Son contenu est similaire à celui présenté dans l'article sur le Détail sur le script de configuration LUA. Nous avons nommé ce script "/produc/mysql.bat/mariadb.lua":
#!/bin/lua socketbase = require("socket") sockettcp = socketbase.tcp() sockettcp:settimeout(1) port = 3306 nomfichierhost="./hosts.txt" fichierhost=io.open(nomfichierhost,"r") machines = {} i=0 for ligne in fichierhost:lines() do i=i+1 machines[i] = ligne end fichierhost:close() nomfichier="./mariadb.txt" fichier=io.open(nomfichier,"w") machinelocal = socketbase.dns.gethostname() for _, machine in ipairs( machines ) do if not (machine == machinelocal) then local SocketMariadb, errMariadb = sockettcp:connect(machine, port) if SocketMariadb then fichier:write("OK "..machine.."\n") sockettcp:close() end end end fichier:close()
On y remarque le chargement du fichier "hosts.txt". Ce script sera appelé par le script écrit en "bash".
Script Bash
Voici le script principal écrit en langage Bash. Nous avons nommé ce script "/produc/mysql.bat/checkdb.bat":
#!/bin/bash CHEMIN="./" CHEMINDB="../mysql" cd $CHEMIN PS=`/usr/bin/ps ax | /usr/bin/grep mariadb | /usr/bin/grep -v grep` HOST=`/usr/bin/hostname` /usr/bin/echo "Erreur" > mariadb.log if [ "$PS" != "" ] then echo "Mariadb en activité" > mariadb.log else /usr/bin/lua mariadb.lua TAILLE=`/usr/bin/wc -c mariadb.txt | /usr/bin/awk '{printf("%s",$1)}' ` if [ "$TAILLE" != "0" ] then /usr/bin/echo "Lancement de Mariadb" > mariadb.log /usr/bin/systemctl start mariadb.service else LIGNE2=`/usr/bin/grep safe_to_bootstrap $CHEMINDB/grastate.dat | /usr/bin/awk '{printf("%s",$2)}' ` if [ "$LIGNE2" == "1" ] then /usr/bin/echo "Lancement de Galera" > mariadb.log /usr/bin/galera_new_cluster else NOMAX="-1" NOREMOTE="-1" NOLOCAL="-1" LISTES=`/usr/bin/cat hosts.txt` for LISTE in $LISTES do /usr/bin/echo "-" > $LISTE.etat /usr/bin/rsync $LISTE::db/grastate.dat $LISTE.etat 2> /dev/null if [ "$HOST" == "$LISTE" ] then NOLOCAL=`/usr/bin/grep seqno $LISTE.etat | /usr/bin/awk '{printf("%s",$2)}' ` else NOREMOTE=`/usr/bin/grep seqno $LISTE.etat | /usr/bin/awk '{printf("%s",$2)}' ` if [ "$NOREMOTE" == "" ] then NOREMOTE="100000000" fi fi if [ $NOMAX -lt $NOREMOTE ] then NOMAX=$NOREMOTE fi done if [ "$NOLOCAL" != "-1" ] then if [ $NOMAX -lt $NOLOCAL ] then /usr/bin/sed -i 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/g' $CHEMINDB/grastate.dat /usr/bin/echo "Lancement de Galera" > mariadb.log /usr/bin/galera_new_cluster else if [ "$NOMAX" == "100000000" ] then /usr/bin/echo "Une machine n'est pas accessible" > mariadb.log else /usr/bin/echo "Attente de démarrage distant de Galera" > mariadb.log fi fi else if [ "$NOMAX" == "100000000" ] then /usr/bin/echo "Une machine n'est pas accessible" > mariadb.log else /usr/bin/echo "Attente de démarrage distant de Galera" > mariadb.log fi fi fi fi fi
Remarquons que, pour s'exécuter, on doit se trouver dans le répertoire où ce script est localisé; c'est le service qui le précisera.
Il faut faire attention au chemin (variable "CHEMIN") où se trouve la base de données MariaDB; il faut adapter en conséquence la variable "CHEMINDB". Dans notre cas, elle se trouve dans le répertoire voisin "/produc/mysql". Si cette procédure devait être utilisée par le système Cron, il faudrait faudrait les spécifier en absolu et non en relatif.
→ retour au menu de Galera : Cluster de MariaDB