Laboratoire infra Linux HA #8 – MySQL en haute dispo avec DRBD, Corosync et Pacemaker
Cet article est huitième et dernier opus de la suite d’articles sur la mise en œuvre d’une infrastructure Linux visant à servir le blog « lab07.lab » en haute dispo. Dans le précédent article on a vu de manière assez sommaire comment maintenir les problèmes de réplication MySQL et comment réparer DRBD.
On va enfin pouvoir enfoncer le clou et enfin servir notre base de données MySQL
en haute disponibilitĂ©. J’avais prĂ©vu initialement de garder Heartbeat
parce que je sais dĂ©jĂ faire mais j’ai pensĂ© que c’Ă©tait l’occasion de me confronter Ă la mise en Ĺ“uvre de Corosync
et Pacemaker
. Là ce sera une première pour moi, pas une simple revisite du lab déjà monté précédemment.
Adaptation des serveur DB
En vue du dĂ©placement du dossier des base de donnĂ©es vers DRBD, j’ai ajoutĂ© un second disque Ă mes VM lab07-db-01
et lab07-db-02
.
On créer une nouvelle partition sans la formater. Tu sais comment faire normalement (fdisk
tout ça… non je n’assume pas d’avoir oubliĂ© de le capturer)
DRBD again
Pour DRBD je suis pas hyper inquiet, on applique la recette dĂ©jĂ utilisĂ©e dans l’article 4.
root@lab07-db-01:~# apt install drbd-utils corosync pacemaker pacemaker-cli-utils crmsh resource-agents
root@lab07-db-01:~# vi /etc/drbd.d/global_common.conf
Version simplifiée du fichier de configuration sans les commentaires.
common {
handlers {
outdate-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";
}
startup {
become-primary-on lab07-db-01;
}
}
Création de notre fichier de ressources.
root@lab07-db-01:~# vi /etc/drbd.d/r0.res
resource r0 {
on lab07-db-01 {
device /dev/drbd0;
disk /dev/sdb1;
meta-disk internal;
address 192.168.50.25:7788;
}
on lab07-db-02 {
device /dev/drbd0;
disk /dev/sdb1;
meta-disk internal;
address 192.168.50.26:7788;
}
}
On redĂ©marre le service pour qu’il intègre la config, on crĂ©Ă© les mĂ©tadonnĂ©es de la ressource et on applique les corrections nĂ©cessaires.
root@lab07-db-01:~# systemctl restart drbd
root@lab07-db-01:~# drbdadm create-md r0
root@lab07-db-01:~# dpkg-statoverride --add --update root haclient 4750 /lib/drbd/drbdsetup-84
root@lab07-db-01:~# dpkg-statoverride --add --update root haclient 4750 /usr/sbin/drbdmeta
A la base, j’avais voulu n’installer que drbd-utils
pour bien segmenter les opérations mais le groupe haclient
n’existait alors pas et les deux commandes ci-dessus retournaient un code 10.
On va passer notre lab07-db-01 en primaire et l’autre en secondaire
root@lab07-db-01:~# drbdadm primary r0 --force
root@lab07-db-02:~# drbdadm secondary r0
Puis formater la partition et vérifier la cohérence des données.
root@lab07-db-01:~# mkfs.ext4 /dev/drbd0
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 1310415 4k blocks and 327680 inodes
Filesystem UUID: 22430d1e-dc1f-40e7-b838-67de63e6858b
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@lab07-db-01:~# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 19D914EA50F713FCCE48607
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:5244340 nr:0 dw:68348 dr:5242780 al:14 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
Les données semblent consistantes entre les deux serveurs donc on va essayer comme ça, sans écraser les données du serveur secondaire.
On va tout de même créer notre point de montage DRBD
sur les deux DB.
root@lab07-db-01:~# mkdir /opt/drbd
LĂ on n’a plus le choix, c’est l’heure de basculer dans l’inconnu et de mixer au mieux les ressources trouvĂ©es sur Internet et le man pour Corosync
.
Configuration de Corosync
Bon il y a trop de divergences dans mes lectures en ligne notamment sur la première à lancer corosync-keygen
. On fait ça ou pas ? Direction la man page et en effet, c’est la première commande de la partie Quickstart et il est prĂ©cisĂ© que cela gĂ©nère une clĂ© privĂ©e et qu’il faut la rĂ©pliquer sur tous les pairs.
root@lab07-db-01:~# corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 2048 bits for key from /dev/urandom.
Writing corosync key to /etc/corosync/authkey.
root@lab07-db-01:~# rsync /etc/corosync/authkey lab07-db-02:/etc/corosync/authkey
On va pouvoir commencer Ă regarder le fichier de configuration du machin et ce qui est bien c’est qu’ils ne sont pas avars de commentaires avec en première ligne, le rappel de la man page du fichier de conf ; c’est sympa.
root@lab07-db-01:~# less /etc/corosync/corosync.conf
Je t’Ă©pargne les commentaires du fichier initial et te partages ici mes choix commentĂ©s. Les temporisations ont Ă©tĂ© appliquĂ©es pour Ă©viter des bascules intempestives nuisibles Ă la rĂ©plication des donnĂ©es par DRBD
.
Le totem c’est comme le tĂ©moin d’une course de relais que les serveurs se passent pour savoir qui peut parler et quand.
totem {
# De toute façon c'est la seule version possible
version: 2
# Nom du cluster
cluster_name: lab07-db
# UDP unicast
transport: udpu
# Temps d'attente avant de considérer qu'un nœud est hors-ligne (en ms)
token: 3000
# Nombre de tentatives avant de déclarer une perte
token_retransmits_before_loss_const: 10
# Temps d'attente maximum pour qu'un nœud rejoigne le cluster (en secondes)
join: 60
# Temps maximum pour atteindre un consensus (en ms)
consensus: 6000
interface {
# Premier anneau de communication
ringnumber: 0
# Notre réseau local
bindnetaddr: 192.168.50.0
# Port multicast/unicast utilisé
mcastport: 5405
# Nombre de sauts sur le réseau
ttl: 1
}
}
# [...]
Dans un premier temps, je ne vais pas toucher à la journalisation par défaut du coup je te laisse les commentaires pour ce bout là .
# [...]
logging {
# Log the source file and line where messages are being
# generated. When in doubt, leave off. Potentially useful for
# debugging.
fileline: off
# Log to standard error. When in doubt, set to yes. Useful when
# running in the foreground (when invoking "corosync -f")
to_stderr: yes
# Log to a log file. When set to "no", the "logfile" option
# must not be set.
to_logfile: yes
logfile: /var/log/corosync/corosync.log
# Log to the system log daemon. When in doubt, set to yes.
to_syslog: yes
# Log debug messages (very verbose). When in doubt, leave off.
debug: off
# Log messages with time stamps. When in doubt, set to hires (or on)
#timestamp: hires
logger_subsys {
subsys: QUORUM
debug: off
}
}
# [...]
Encore une fois, on va tenter d’optimiser la configuration de Corosync
Ă notre usage de DRBD
.
Le quorum correspond Ă une assemblĂ©e dans laquelle les membres doivent ĂŞtre d’accord pour prendre leurs dĂ©cisions. Ici c’est celles qui visent Ă faire fonctionner notre cluster et du coup le(s) service(s) derrière.
# [...]
quorum {
# Utilisation de votequorum pour gérer le quorum
provider: corosync_votequorum
# Activer le support pour un cluster à deux nœuds
two_node: 1
# Assurer que les deux nœuds sont présents avant le démarrage
wait_for_all: 1
# Un seul nœud peut rester actif si l'autre échoue
last_man_standing: 1
# Fenêtre de décision pour le dernier nœud debout (5 secondes)
last_man_standing_window: 5000
# Utilisation d'un nœud de quorum ou d'un disque partagé pour éviter le split-brain :
# Disque partagé ou nœud témoin pour briser l'égalité
tie_breaker: disk
# Disque ou ressource DRBD servant de référence pour briser les égalités
tie_breaker_device: /dev/drbd0
}
# [...]
J’ai Ă©tĂ© surpris que Corosync n’aime pas les commentaires en fin de ligne dans son fichier de conf mais bon je me suis pas laissĂ© dĂ©monter et les messages d’erreur Ă©taient suffisamment explicites pour corriger rapidement. Il y a peut-ĂŞtre une syntaxe pour ça, j’ai cherchĂ© vite fait mais la prĂ©visu des cinq premiers rĂ©sultats n’apporte pas cette rĂ©ponse.
Il ne reste plus qu’Ă dĂ©finir nos tĂŞtes de nĹ“uds.
# [...]
nodelist {
node {
# Adresse IP du premier nœud sur le réseau principal
ring0_addr: 192.168.50.25
# Identifiant unique du premier nœud
nodeid: 1
name: db-01
}
node {
# Adresse IP du second nœud sur le réseau principal
ring0_addr: 192.168.50.26
# Identifiant unique du second nœud
nodeid: 2
name: db-02
}
}
Ok, tu compulse tout ça dans un nouveau fichier de conf corosync.conf et tu en envoies une copie sur lab07-db-02
.
root@lab07-db-01:~# mv /etc/corosync/corosync.conf /etc/corosync/corosync.conf.old
root@lab07-db-01:~# vi /etc/corosync/corosync.conf
root@lab07-db-01:~# rsync /etc/corosync/corosync.conf lab07-db-02:/etc/corosync/
On va redĂ©marrer Cocorync (et Pacemaker s’il refuse la connexion) sur les deux serveurs pour que les modifications soient bien prises en compte et que les bĂ©bĂŞtes discutent ensemble et on vĂ©rifie qu’ils sont copains.
###################
# Quand ça va pas #
###################
root@lab07-db-01:~# crm status
error: Could not connect to launcher: Connection refused
crm_mon: Connection to cluster failed: Connection refused
ERROR: status: crm_mon (rc=102):
root@lab07-db-02:~# crm status
Status of pacemakerd: 'Pacemaker is running' (last updated 2024-10-02 02:46:43 +02:00)
Cluster Summary:
* Stack: corosync
* Current DC: db-02 (version 2.1.5-a3f44794f94) - MIXED-VERSION partition with quorum
* Last updated: Wed Oct 2 02:46:43 2024
* Last change: Wed Oct 2 02:33:17 2024 by hacluster via crmd on db-02
* 2 nodes configured
* 0 resource instances configured
Node List:
* Node db-01: pending
* Online: [ db-02 ]
Full List of Resources:
* No resources
######################
# Quand tout va bien #
######################
root@lab07-db-01:~# systemctl restart pacemaker corosync
root@lab07-db-02:~# systemctl restart pacemaker corosync
root@lab07-db-02:~# crm status
Status of pacemakerd: 'Pacemaker is running' (last updated 2024-10-02 02:47:01 +02:00)
Cluster Summary:
* Stack: corosync
* Current DC: db-02 (version 2.1.5-a3f44794f94) - partition with quorum
* Last updated: Wed Oct 2 02:47:02 2024
* Last change: Wed Oct 2 02:33:17 2024 by hacluster via crmd on db-02
* 2 nodes configured
* 0 resource instances configured
Node List:
* Online: [ db-01 db-02 ]
Full List of Resources:
* No resources
Si tes nodes apparaissent offline patiente un peu (pas plus de 3 minutes) ça doit encore être en cours de démarrage.
Jusqu’ici tout va bien, du coup on va reconfigurer MySQL
sur les deux serveurs pour servir depuis la ressource DRBD
avant de configurer Pacemaker
pour la gestion des ressources du cluster.
Adaptation de la config MySQL
On va déjà arrêter la réplication MySQL
, modifier les dossiers de stockage et, ne plus gĂ©nĂ©rer de log binaires. Sur lab07-db-01 d’abord.
mysql> stop slave;
Query OK, 0 rows affected, 2 warnings (0,01 sec)
mysql> reset slave all;
Query OK, 0 rows affected, 1 warning (0,05 sec)
mysql> ^DBye
root@lab07-db-01:~# vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /opt/drbd/data
log-error = /opt/drbd/log/$(hostname -f)_error.log
bind-address = 0.0.0.0
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
#expire_logs_days = 5
#max_binlog_size = 100M
#binlog-format = row
disable_log_bin
Puis sur lab07-db-02.
mysql> stop slave;
Query OK, 0 rows affected, 2 warnings (0,01 sec)
mysql> reset slave all;
Query OK, 0 rows affected, 1 warning (0,05 sec)
mysql> ^DBye
root@lab07-db-02:~# vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /opt/drbd/data
log-error = /opt/drbd/log/$(hostname -f)_error.log
disable_log_bin
bind-address = 0.0.0.0
#server-id = 2
On dĂ©sactive et arrĂŞte MySQL. Je te montre sur l’un mais faudra l’faire sur l’autre aussi.
root@lab07-db-02:~# systemctl disable mysql
Synchronizing state of mysql.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable mysql
Removed "/etc/systemd/system/multi-user.target.wants/mysql.service".
root@lab07-db-02:~# systemctl stop mysql
Avec l’aimable autorisation de son auteur, je vais piquer la conf du wiki.gbe0.com duquel une grande partie de cet article s’inspire. Bah oui si tu as lu le quatrième article de cette sĂ©rie, t’auras peut-ĂŞtre compris que je dĂ©couvre Corosync en mĂŞme temps que je rĂ©dige cet article.
root@lab07-db-02:~# systemctl edit mysql
### Anything between here and the comment below will become the new contents of the file
[Unit]
# Require that the specified file exists before starting MariaDB
ConditionPathExists=/opt/drbd/drbd_mounted
### Lines below this comment will be discarded
root@lab07-db-02:~# systemctl daemon-reload
On va monter le volume DRBD
sur notre serveur DRBD
primaire, y copier nos bases de données et y créer un dossier pour les journaux MySQL
avec les bons droits sans toucher au dossier lost+found qui n’a rien demandĂ© Ă personne.
root@lab07-db-01:~# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 19D914EA50F713FCCE48607
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:5244340 nr:0 dw:68348 dr:5242780 al:14 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
# lab07-db-01 est bien primaire, go go go !
root@lab07-db-01:~# mount /dev/drbd0 /opt/drbd
root@lab07-db-01:~# mkdir /opt/drbd/data
root@lab07-db-01:~# mkdir /opt/drbd/log
root@lab07-db-01:~# cp -r /var/lib/mysql/* /opt/drbd/data/
root@lab07-db-01:~# chown -R mysql:mysql /opt/drbd/!(lost+found)
root@lab07-db-01:~# touch /opt/drbd/drbd_mounted
Ceci fait, on démonte le volume DRBD
.
root@lab07-db-01:~# umount /opt/drbd
DRBD est fonctionnel mais ne fout rien, Corosync semble fonctionnel mais ne fout rien non plus. C’est l’heure de mettre en place l’orchestration de tout ce foutoir et d’espĂ©rer que tout soit bien configurĂ© pour que Pacemaker fasse son taf.
Configuration de Pacemaker
J’ai commencĂ© par purement copier/coller la configuration de Gbe0 en adaptant la VIP et en renommant MariaDB
en MySQL
. LĂ on ne lance les commandes que sur l’un des deux serveurs, ça se rĂ©plique tout seul. On lance le shell crm
(crmsh
pour les intimes) en mode de configuration et on lui colle nos lignes de conf. On sortira du shell comme de tout autre shell ou presque par ctrl+d.
root@lab07-db-01:~# crm configure
crm(live/lab07-db-01)configure# # Disable STONITH; not for production!
property stonith-enabled=false
crm(live/lab07-db-01)configure#
crm(live/lab07-db-01)configure# # Set options required to make a two node cluster work
crm(live/lab07-db-01)configure# property no-quorum-policy=ignore
crm(live/lab07-db-01)configure# property stop-all-resources=false
crm(live/lab07-db-01)configure#
crm(live/lab07-db-01)configure# # Configure resource stickiness
crm(live/lab07-db-01)configure# rsc_defaults resource-stickiness=100
crm(live/lab07-db-01)configure#
crm(live/lab07-db-01)configure# ## DRBD resource to control primary/secondary status
crm(live/lab07-db-01)configure# primitive r_drbd_disk ocf:linbit:drbd \
params drbd_resource="mysql" \
op start interval="0" timeout="240" \
op stop interval="0" timeout="120s" \
op monitor interval="17s" role="Master" timeout="120s" \
op monitor interval="16s" role="Slave" timeout="119s"
# [la conf entière plus bas dans les arrêts de jeu...]
crm(live/lab07-db-01)configure# bye
root@lab07-db-01:~#
Mais si tu connais déjà Pacemaker
, tu as déjà probablement vu ma boulette. Bah oui, il ne trouve pas ma ressource DRBD
nommĂ©e mysql et pour cause, elle s’appelle r0.
Ok on va pas se laisser dĂ©monter – on peut aussi prĂ©fixer nos paramètres directement par crm configure
sans ouvrir le shell interactif – on va rejouer la ligne de conf.
root@lab07-db-01:~# crm configure primitive r_drbd_disk ocf:linbit:drbd \
params drbd_resource="r0" \
op start interval="0" timeout="240" \
op stop interval="0" timeout="120s" \
op monitor interval="17s" role="Master" timeout="120s" \
op monitor interval="16s" role="Slave" timeout="119s"
ERROR: Cannot create primitive with ID 'r_drbd_disk': Found existing primitive with same ID.
Ah merde ! Comment je modifie alors si je peux pas Ă©craser ?
root@lab07-db-01:~# crm configure edit
# Mes nœuds tels que définis dans DRBD (définis automatiquement par Pacemaker)
node 1: db-01
node 2: db-02
# Type d'objet de base nommé r_drbd_disk (ressource de disque DRBD) avec une interface Open
# Cluster Framework DRBD fourni par Linbit
primitive r_drbd_disk ocf:linbit:drbd \
# avec le paramètre de ressource DRBD nommée r0 (c'est ça que j'ai changé à l'édition).
params drbd_resource=r0 \
# Opération de démarrage de la ressource DRBD qui n'a lieu qu'une fois et dont
#le délais d'attente ne peut dépasser 4 minutes
op start interval=0 timeout=240 \
# pareil mais pour l'arrĂŞt de la ressource
op stop interval=0 timeout=120s \
# Opération de surveillance du Master et du Slave DRBD
op monitor interval=17s role=Master timeout=120s \
op monitor interval=16s role=Slave timeout=119s
# Objet de base de définition d'une ressource d'un système de fichier nommée r_drbd_fs
primitive r_drbd_fs Filesystem \
# qui va monter la ressource DRBD /dev/drbd0 au point de montage /opt/drbd en ext4
params device="/dev/drbd0" directory="/opt/drbd" fstype=ext4
# Définition d'une ressource IPv4 nommée r_ip_ipv4
primitive r_ip_ipv4 IPaddr2 \
#Â c'est assez explicite
params ip=192.168.50.31 cidr_netmask=24 \
# pareil
op monitor interval=10s \
# métadonnée de migration de la VIP après 2 échecs et remise à zéro du compteur
#d'échecs après 60s
meta migration-threshold=2 failure-timeout=60s
# DĂ©finition de la ressource r_mysql du service Systemd MySQL
primitive r_mysql systemd:mysql \
# Opération de surveillance du service toutes les 10 secondes
op monitor interval=10s \
# Métadonnée pour s'assurrer que la ressource est démarrée au lancement du cluster
meta target-role=Started
# Agrégation de nos ressources r_mysql et r_ip_ipv4 dans un groupe g_mysql
group g_mysql r_mysql r_ip_ipv4
# Création d'une ressource Master-Slave de la ressource r_drbd_disk nommée ms_drbd
ms ms_drbd r_drbd_disk \
# Métadonnée pour définir : 1 master au max et 1 seul par nœud, 2 clones et 1 seul clone
# par nœud et Pacemaker envoi des notif en cas de modification
meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true \
# Migration après un seul échec et tout est pardonné après une minute
meta migration-threshold=1 failure-timeout=60s
# La colocation c_drbd_fs contraint la ressources du système de fichier DRBD r_drbd_fs Ă
#fonctionner sur le Master DRBD
colocation c_drbd_fs inf: r_drbd_fs ms_drbd:Master
# Pareil pour le groupe MySQL
colocation c_mysql inf: g_mysql ms_drbd:Master
# Contrainte d'ordre *obligatoire* de promotion d'un Master DRBD avant le montage du FS
order o_drbd_mount Mandatory: ms_drbd:promote r_drbd_fs:start
# Pareil, il faut que le FS soit monté pour lancé le groupe g_mysql (le service et la VIP)
order o_mysql_start Mandatory: r_drbd_fs g_mysql
# Contrainte de placement nommée prefer-master avec un poids de 200 (plus le score est élevé, plus
# la contrainte est forte) d'attribution de la ressource ms_drbd au nœud db-01 ("#uname eq db-01"
#n'est pas un commentaire a posteriori)
location prefer-master ms_drbd \
rule 200: #uname eq db-01
# Propriétés globales appelées cib-bootstrap-options
property cib-bootstrap-options: \
# Pas de surveillances matérielle
have-watchdog=false \
# Version de Pacemaker
dc-version=2.1.5-a3f44794f94 \
# A la technique c'est Michel, le light jockey c'est Momo
# l'infra de communication du cluster c'est Corosync
cluster-infrastructure=corosync \
# Evident
cluster-name=debian \
# STONITH (Shoot The Other Node In The Head), un mécanisme de protection qui
# redémarre ou met hors ligne un nœud en échec est désactivé
stonith-enabled=false \
# Le cluster continue de fonctionner mĂŞme sans quorum
no-quorum-policy=ignore \
# Ne pas arrĂŞter les ressources en cas de perte du quorum
stop-all-resources=false \
# Si on perd une ressource une fois, on migre sur l'autre nœud. Prenez un chewing gum Emile.
migration-threshold=1
# Options pour toutes les ressources de notre cluster
rsc_defaults rsc-options: \
# Niveau d'attachement d'une ressource à un nœud (plus c'est haut, plus ça colle).
resource-stickiness=30
Chez moi c’est du Vim mais peut ĂŞtre que ça dĂ©pend de ton Ă©diteur par dĂ©faut. Pour le coup ça te permet de voir ma configuration. Par dĂ©faut le fichier n’est ni commentĂ© ni espacĂ© c’est juste pour nous expliciter le bourbier Ă toi comme Ă moi.
Adaptation de la configuration de WordPress
C’est bien mignon de mettre notre DB en haute dispo, mais si on oublie de modifier la configuration de WordPress il attaquera toujours l’IP de lab07-db-01
et ce serait dommage.
root@lab07-nfs-01:~# sed -i 's/lab07-db-01/lab07-db.vip/g' /opt/drbd/lab07.lab/wp-config.php
Là ça y est, chaque Ă©tage de notre infrastructure est servi Ă haute dispo. On peut imaginer rĂ©partir nos serveurs sur deux sites gĂ©ographiques avec un peu (lol, j’en sais rien) de configuration rĂ©seau et une revue de la sĂ©curitĂ© des machines et des services. Ces deux points restent totalement out of scope mais sont cruciaux.
TODO: METTRE ICI LE SCHEMA FINAL DE L’INFRA
ArrĂŞts de jeu
Pour rĂ©fĂ©rence, voici la configuration avec laquelle j’ai nourri Pacemaker
via crm configure
.
# Disable STONITH; not for production!
property stonith-enabled=false
# Set options required to make a two node cluster work
property no-quorum-policy=ignore
property stop-all-resources=false
# Configure resource stickiness
rsc_defaults resource-stickiness=100
## DRBD resource to control primary/secondary status
primitive r_drbd_disk ocf:linbit:drbd \
params drbd_resource="r0" \
op start interval="0" timeout="240" \
op stop interval="0" timeout="120s" \
op monitor interval="17s" role="Master" timeout="120s" \
op monitor interval="16s" role="Slave" timeout="119s"
## File system located on DRBD disk to be mounted to /opt/drbd
primitive r_drbd_fs ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/opt/drbd" fstype="ext4"
## The mariadb service
primitive r_mysql systemd:mysql \
op monitor interval="10s" \
meta target-role=Started
## The virtual IP address that MariaDB clients connect to
primitive r_ip_ipv4 ocf:heartbeat:IPaddr2 \
params ip="192.168.50.31" cidr_netmask="24" \
op monitor interval="10s" \
meta migration-threshold="2" failure-timeout="60s"
# Create a master/slave relationship for the DRBD disk
# This is to ensure that the disk is only running on a single node
ms ms_drbd r_drbd_disk \
meta master-max="1" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true"
#### clone ms_drbd r_drbd_disk meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true promotable=true
# Create a group named g_mysql containing the MySQL service and virtual IP address
group g_mysql r_mysql r_ip_ipv4
# Set up the colocation options to make sure all services are bound to the master
colocation c_drbd_fs inf: r_drbd_fs ms_drbd:Master
colocation c_mysql inf: g_mysql ms_drbd:Master
location prefer-master ms_drbd rule 100: uname eq lab07-db-01
# Set the ordering to ensure the DRBD file system is mounted before MariaDB is started and the virtual IP bound
order o_drbd_mount inf: ms_drbd:promote r_drbd_fs:start
order o_mysql_start inf: r_drbd_fs g_mysql
La fritte sur l’macdo
On peut Ă©couter aux portes ?
root@lab07-db-01:~# tcpdump -i enp0s3 'host 192.168.50.25 and udp'
Fin de la série
Cette sĂ©rie d’article a Ă©tĂ© très sympa Ă Ă©crire parce que ça m’a permis de formaliser un peu mes (maigres) connaissances et Ă chercher Ă d’avantage comprendre les recettes que j’ai appliquĂ©.
Cet article a Ă©tĂ© particulièrement amusant du fait que j’Ă©tais totalement dans l’inconnu et le fait de voir les ressources migrer d’un serveur Ă l’autre Ă©tait vraiment satisfaisant. La sortie de la commande crm status
est vraiment propre.
Fin de la bande