Laboratoire infra Linux HA #8 – MySQL en haute dispo avec DRBD, Corosync et Pacemaker

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.

lab07-db-01 & lab07-db-02
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.

/etc/drbd.d/global_common.conf
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.

lab07-db-01 & lab07-db-02
root@lab07-db-01:~# vi /etc/drbd.d/r0.res
/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.

lab07-db-01 & lab07-db-02
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

lab07-db-01 & lab07-db-02
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.

lab07-db-01
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.

lab07-db-01 & lab07-db-02
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.

lab07-db-01
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.

lab07-db-01
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.

/etc/corosync/corosync.conf – le totem
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à.

/etc/corosync/corosync.conf – journalisation
# [...]
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.

/etc/corosync/corosync.conf – le quorum
# [...]
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.

/etc/corosync/corosync.conf – les 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.

lab07-db-01
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.

lab07-db-01 & lab07-db-02
###################
# 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.

lab07-db-01
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
/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.

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
/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.

lab07-db-01 & lab07-db-02
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.

lab07-db-01 & lab07-db-02
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.

lab07-db-01
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.

lab07-db-01
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.

lab07-db-01
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.

lab07-db-01
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 ?

lab07-db-01
root@lab07-db-01:~# crm configure edit
« /tmp/tmpo8ux2s0q.pcmk » 38L, 1352B 1,1 Tout
# 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.

lab07-nfs-01
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.

crmiam.conf
# 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 ?

ShellSession
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 cassette

Fin de la bande

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *