Recent Changes - Search:
HomePage



Materiel


Photo


Système et réseau

 Sous Debian Gnu Linux...

 ... et Ubuntu


Gestion de projet

 ...informatique


Cours


Divers


Private




 edit SideBar



Index

Clustering.Index History

Hide minor edits - Show changes to output

February 12, 2009, at 02:01 PM by 80.13.23.147 -
Added line 4:
* http://wiki.centos.org/HowTos/Ha-Drbd
February 12, 2009, at 08:59 AM by 80.13.23.147 -
Changed lines 21-25 from:
* ''[[DRBD]]'' pour le mirroring
* ''[[HeartBeat]]'' pour la continuité de service
* ''[[Mon]]'' pour le monitoring
* ''[[Synchronisation]]'' des fichiers de configuration système
to:
* [[DRBD]] pour le mirroring
* [[HeartBeat]] pour la continuité de service
* [[Mon]] pour le monitoring
* [[Synchronisation]] des fichiers de configuration système
February 12, 2009, at 08:58 AM by 80.13.23.147 -
Deleted lines 26-33:

!! Sommaire

* [[Généralités]]
* [[DRBD]]
* [[HeartBeat]]
* [[Mon]]
* [[Synchronisation]] des fichiers de configuration système
February 12, 2009, at 08:58 AM by 80.13.23.147 -
Added lines 7-27:
!! Généralités
!!! Configuration matérielle
* 2 serveurs (identiques de préférence)
* 2 disques (ou 2 partitions) dédiés au mirroring

!!! Continuité de service
Les services suivants devront être maintenus (en basculant d'un serveur à l'autre) :
* samba
* mysql
* http
* ftp
* postfix / sendmail

!!! Services mis en oeuvre
* ''[[DRBD]]'' pour le mirroring
* ''[[HeartBeat]]'' pour la continuité de service
* ''[[Mon]]'' pour le monitoring
* ''[[Synchronisation]]'' des fichiers de configuration système

%rfloat% <<|[[Index]]|>>
February 11, 2009, at 11:18 PM by 90.17.18.150 -
Deleted lines 13-453:

!! Mirroring avec ''DRBD'' (RAID 1 Over IP)

!!! Configurer DRBD
Le fichier de configuration à modifier est le suivant : ''/etc/drbd.conf''
[@
global {
usage-count no;
}

common {

protocol C;

handlers {
out-of-sync "echo Désynchronisation des serveurs, vérifier les logs | mail -s '[DRBD alert] out-of-sync' user@domain.fr";
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f"; # This handler is called if the node is primary, degraded and if the local copy of the data is inconsistent.
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f"; # The node is currently primary, but lost the after split brain auto recovery procedure. As as consequence, it should be abandoned.
local-io-error "echo o > /proc/sysrq-trigger ; halt -f"; # DRBD got an IO error from the local IO subsystem.
outdate-peer "/usr/sbin/drbd-peer-outdater"; # This handler is called in case the node needs to outdate the peer’s disk.
}

syncer {
rate 10M; # Débit de la synchronisation
al-extents 257;
}
}

resource r0 {

startup {
wfc-timeout 120;
degr-wfc-timeout 60;
}

disk {
on-io-error detach;
}

on server1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.11:7791;
meta-disk internal;
}

on server2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.12:7791;
meta-disk internal;
}
}
@]

Pensez à ouvrir les ports utilisés par ''DRBD'' dans le fichier ''iptables'' :
[@
-A RH-Firewall-1-INPUT -m udp -p udp --dport 7791 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 7791 -j ACCEPT
@]

!!! Initialisation des meta-data sur la ressource r0

''Note :'' les actions à réaliser sur les serveurs sont notées de la manière suivante :
* '^12^' : action à réaliser sur les 2 serveurs
* '^1^' : action à réaliser sur le serveur 1
* '^2^' : action à réaliser sur le serveur 2

!!!! Formatage des disques '^12^'
@@# mkfs.ext3 /dev/sdb1@@

!!!! Création des meta-data '^12^'
@@# drbdadm create-md r0@@
NB : si vous rencontrez des pb pour créer la ressource tapez la commande suivante (en remplaçant ''sdb1'' par votre partition)
@@# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync@@

!!!! Consulter l'état des ressources DRBD '^12^'
@@# cat /proc/drbd@@
[@
version: 8.0.6 (api:86/proto:86)
SVN Revision: 3048 build by buildsvn@c5-x8664-build, 2007-12-08 01:01:10
0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
@]

!!!! Synchronisation sur le primaire vers le secondaire '^1^'
Pour cette opération il peut-être utile d'augmenter temporairement le débit de la synchronisation.
Pour cela dans ''/etc/drbd.conf'', remplacer la ligne @@rate 10M;@@ par @@rate 100M;@@.
Pour prendre en compte la modification de la configuration, tapez la commande suivante :
@@# drbdadm adjust r0@@

Pour lancer la synchonisation des données :
@@# drbdadm -- --overwrite-data-of-peer primary all@@

NB : N'oubliez pas de réinitialiser le débit de la synchronisation à celui par défaut pour éviter de surcharger le réseau.

!!!! Visualisation de la progression de la synchronisation '^1^'
@@# cat /proc/drbd@@
[@
version: 8.0.6 (api:86/proto:86)
SVN Revision: 3048 build by buildsvn@c5-x8664-build, 2007-12-08 01:01:10
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
ns:152628 nr:0 dw:0 dr:159744 al:0 bm:8 lo:16 pe:261 ua:238 ap:0
[>...................] sync'ed: 0.2% (76149/76290)M
finish: 0:18:00 speed: 72,144 (72,144) K/sec
resync: used:1/31 hits:9506 misses:10 starving:0 dirty:0 changed:10
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
@]
''NB : à noter ici le débit ridicule de la synchro malgré une liaison Gigabit et la configuration 'normale' du débit dans /etc/drbd.conf'' > '''à investiguer'''

!!!! Résultat de la synchronisation
@@# cat /proc/drbd @@ (sur le ''primary'')
[@
[...] 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- [...]
@]

@@# cat /proc/drbd @@ (sur le ''secondary'')
[@
[...] 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r--- [...]
@]

!!! Important
'''A partir de cette étape il faudra toujours passer par le périphérique DRBD''' (''/dev/drbd0'' dans notre cas) '''pour monter la partition mirroir et en modifier les données.'''
Si vous arrêtez le service DRBD sur les 2 machines et que vous montez votre partition sans tenir compte de DRBD (''mount /dev/sdb1 /mnt/rep''), les données seront corrompues et DRBD ne s'en rendra pas compte même après redémarrage du service (d'après mes tests) !

Pour monter la partition à la main :
@@# mount /dev/debd0 /mnt/mirroir

!!!! Conclusion
Avant de modifier les fichiers d'un serveur secondaire il faut d'abord le basculer en primaire puis ensuite monter la partition mirroir (''mount /dev/drbd0 /mnt/rep'').

!!! Simulation de crash du ''primary''

Sur le serveur 1 (actuellement ''primary'') :
@@# /sbin/shutdown -h now@@

Passage du serveur 2 en ''primary'' :
@@# drbdsetup /dev/drbd0 primary@@
@@# cat /proc/drbd @@
[@
[...] 0: cs:WFConnection st:Primary/Unknown ds:UpToDate/DUnknown C r--- [...]
@]

On monte la partition et on crée un fichier dessus pour tester le comportement lorsque le serveur redémarrera.
On démonte la partition (heartbeat n'étant pas encore configuré avec drbd ce n'est pas automatique).
On démarre le serveur 1 qu'on vient d'arrêter pour tester (on attend qu'il soit complètement redémarré).
DRBD resynchronise automatiquement les données du serveur 2 vers le serveur 1.

On repasse le serveur 2 en ''secondary'' :
@@# /sbin/drbdsetup /dev/drbd0 secondary@@
@@# cat /proc/drbd@@
[@
[...] 0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r--- [...]
@]

On repasse le serveur 1 en ''primary'' :
@@# /sbin/drbdsetup /dev/drbd0 primary@@
@@# cat /proc/drbd@@
[@
[...] 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- [...]
@]

Le serveur 1 est de nouveau primaire et synchronisé.

!!! Simulation d'une coupure réseau

On débranche la prise RJ45 du serveur 1.

Statut du serveur 2 :
[@
[...] 0: cs:WFConnection st:Secondary/Unknown ds:UpToDate/DUnknown C r--- [...]
@]

Statut du serveur 2 après avoir rebranché la prise :
[@
[...] 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r--- [...]
@]

!!! Simulation d'un reboot du ''primary''

Statut du serveur 1 :
@@# /sbin/shutdown -r now@@

Au redémarrage les deux serveurs sont en ''secondary''.

On repasse le serveur 1 en ''primary'' :
@@# /sbin/drbdsetup /dev/drbd0 primary@@
@@# cat /proc/drbd@@
[@
[...] 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- [...]
@]


!! Basculer les services avec ''Heartbeat''

!!! Configuration

!!!! Fichier ''/etc/ha.d/ha.cf''

[@
# interface pour le heartbeat
bcast eth0

# délai entre deux battements de pouls
keepalive 2

# Temps d'attente avant de passer sur le deuxieme
deadtime 10

# Temps avant de diffuser un avertissement pour les pouls en retard
warntime 6

# deadtime spécifique pour les configurations ou le réseau est lent
initdead 60

# port de prise de pouls
udpport 694

# Identification des noeuds du cluster
node server1
node server2

# On interdit le rebasculement automatique vers le maitre lorsque celui-ci redeviendra UP
auto_failback off

# utilisation du démon logd
use_logd yes
@]

Pensez à ouvrir les ports utilisés par ''HeartBeat'' dans le fichier ''iptables'' :
[@
-A RH-Firewall-1-INPUT -p udp -m udp --dport 694 -j ACCEPT
@]

!!!! Fichier ''/etc/ha.d/haresource''

[@
server1 IPaddr::192.168.0.50 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/mirroir::ext3::defaults httpd mysqld smb cups
@]

Informations :
* ''192.168.0.50'' est l'adresse IP attribuée du cluster, visible normalement en tapant la commande ''ifconfig'' (si heartbeat tourne)
* en utilisant cette adresse IP vous tomberez soit sur le serveur 1, soit sur le backup si le sertveur 1 est ''down''.

Lors du basculement du serveur 1 '^1^' vers le backup '^2^' :
* on demande d'abord à ''HeartBeat'' de monter automatiquement le répertoire synchonisé par ''DRBD'' (''/mnt/mirroir'')
* on demande à ''HeartBeat'' de démarrer les services suivants sur le backup '^2^' : ''http'', ''mysql'', ''samba'' et ''cups''.
* les fichiers de configuration de ces services devront bien sûr être synchronisés entre les 2 machines (cf. bas de cette page) et les données qu'ils utiliseront devront être situés de préférence dans le répertoire ''/mnt/mirroir'' pour qu'elles soient toujours à jour.
Lors du rebasculement sur '^1^' ''HeartBeat'' fera l'opération inverse et réattribuera l'IP du cluster à '^1^'.

Options pour ''HeartBeat'' :
* Pour ajouter un mail d'alerte lors du basculement, voir du côté du script Perl ''MailTo::user@domain.fr::"[server1] Heartbeat alert !"''.
* Le fichier ''/etc/haressource'' est très bien commenté vous devriez y trouver votre bonheur.

!!!! Fichiers à personnaliser après un clonage

''Si vous avez opté pour le clonage d'un serveur vers l'autre (attention à drbd)'', vous devrez personnaliser ces fichiers sur chaque serveur :
* /var/lib/heartbeat/hb_uuid (supprimer ce fichier sur l'un des 2 serveurs après clonage, il sera généré au prochain démarrage de heartbeat)
* /etc/udev/rules.d/70-persistent-net.rules (pour faire en sorte que l'interface Ethernet eth0 soit utilisable)

''NB : repris tel quel du tutoriel Ubuntu''

!!! Redémarrage de Heartbeat

Exécuter les opérations suivantes '''dans l'ordre'''.

Sur le '''serveur 2''' : @@# /etc/init.d/heartbeat stop@@
Sur le '''serveur 1''' : @@# /etc/init.d/heartbeat stop@@
Sur le '''serveur 1''' : @@# /etc/init.d/heartbeat start@@
Sur le '''serveur 2''' : @@# /etc/init.d/heartbeat start@@

!!! Tests
!!!! Basculer sur le serveur 2
Sur le serveur 2 : @@# /etc/init.d/heartbeat restart@@

!! Troubleshooting

En cas de problème pensez toujours à consulter les logs de DRBD / Heartbeat dans ''/var/log/messages'' (ou ailleurs si vous avez défini des logs spécifiques).

!!! Gestion manuelle des services
La règle est la suivante :
* on arrête toujours HeartBeat avant DRBD
* on arrête toujours le service du secondaire avant celui du primaire
* soit :
->@@# /etc/init.d/heartbeat stop@@ '^2^'
->@@# /etc/init.d/heartbeat stop@@ '^1^'
->@@# /etc/init.d/drbd stop@@ '^2^'
->@@# /etc/init.d/drbd stop@@ '^1^'
* reprendre les commandes dans le sens inverse pour redémarrer les services (en remplaçant le ''stop'' par le ''start'').

!!! Split-brain
J'ai repris tel quel l'explication faite [[sur ce tuto -> http://www.pc-fute.com/materiel/guides-clustering-linux-avec-postfix-et-debian,152.html]].
En cas de coupure réseau, les 2 machines deviennent primaires et obtiennent la même adresse ip de la machine virtuelle !
Lorsque la connection est rétablie cela entraine un "split-brain" que l'on ne peut résoudre que manuellement.
!!!! Statut de DRBD
@@ 0: cs:StandAlone st:Primary/Unknown ld:Consistent @@ '^1^'
@@ 0: cs:StandAlone st:Secondary/Unknown ld:Inconsistent @@ '^2^'
L'état des noeuds est passé en "Unknown".
!!!! Résolution
@@# drbdadm connect r0@@ sur les 2 machines démarre la synchro du primaire vers le secondaire
@@# drbdadm invalidate r0@@ sur la machine secondaire : invalide les données et force une resynchronisation.

!!! Problème de reconnaissance des machines entre-elles
Si au redémarrage d'un serveur les services DRBD ne se reconnaissent plus.
!!!! Statut de DRBD sur les serveurs :
@@ 0: cs:StandAlone st:Primary/Unknown ds:UpToDate/DUnknown r---@@ '^1^'
@@ 0: cs:StandAlone st:Secondary/Unknown ds:UpToDate/DUnknown r---@@ '^2^'
!!!! Résolution du problème
@@# drbdadm -- --discard-my-data connect r0@@ (sur le node avec les données corrompues)
@@# drbdadm connect r0@@ (sur le node avec les données correctes)
Les nodes doivent ensuite se reconnaitre et renvoyer un statut correct (''st:Primary/Secondary ds:UpToDate/UpToDate'').

!!! Synchronisation forcée
Pour forcer la synchronisation d'un des nodes taper une des commandes suivantes :
* pour invalider la ressource ''r0'' sur le serveur courant : @@# drbdadm invalidate r0@@
* pour invalider la ressource ''r0'' sur le serveur distant : @@# drbdadm invalidate-remote r0@@
NB : l'invalidation des données déclenchera automatiquement la synchronisation.

!! Le monitoring avec ''Mon''

Dans notre configuration, ''Mon'' va réaliser plusieurs choses :
* tester que certains services sont bien ''up''
* sinon essayer de les redémarrer
* si il rencontre des problèmes pour redémarrer un / des services il va nous prévenir

!! Synchonisation des fichiers de configuration du système

'''Les scripts et fichiers qui suivent ne sont donnés qu'à titre d'exemple.'''

!!! Liste de fichiers à sauvegarder / synchroniser
Certains fichiers de configuration sont identiques sur les 2 serveurs, d'autres demandent une personnalisation selon la machine, cette différence est notée ''politique'' par la suite.
La liste des fichiers que j'ai choisi de sauvegarder est la suivante.
[@
# ===============================================================================================
# Liste des fichiers à sauvegarder
# ===============================================================================================
#
# Chaque ligne prend le format suivant : ''fichier=politique''.
#
# Chaque fichier sera sauvegardé dans un répertoire ./rep-sauvegarde/''hostname''-''politique''/
# par le script de backup.
#
# En cas de modification d'un des fichiers à sauvegarder et de relance de la sauvegarde,
# l'ancienne version du fichier est backupée dans le répertoire suivant :
# ./rep-sauvegarde/''hostname''-''politique''/''YmdHMS''_backup/
#
# NB : pas de commentaire sur les lignes à traiter (fichier lu par un script shell minimaliste)
# ===============================================================================================

# SYSTEM
/etc/resolv.conf=fix
/etc/group=fix
/etc/passwd=fix
/etc/shadow=fix
/etc/gshadow=fix
/etc/syslog.conf=fix
/etc/profile=fix

# SYSTEM (à personnaliser)
/etc/hosts=var
/etc/fstab=var
/etc/hostname=var

# DRBD
/etc/drbd.conf=fix

# HEARTBEAT
/etc/ha.d/authkeys=fix
/etc/ha.d/ha.cf=fix
/etc/ha.d/haresources=fix
/etc/ha.d/ha-logd.cf=fix

# MON
/etc/mon/auth.cf=fix
/etc/mon/mon.cf=fix
/etc/mon/userfile=fix

# APACHE
/etc/apache2/httpd.conf=fix

# SAMBA
/etc/samba/smb.conf=fix
/etc/samba/smbusers=fix
/etc/samba/passdb.tdb=fix
/etc/samba/secrets.tdb=fix
/etc/samba/account_policy.tdb=fix
/etc/samba/group_mapping.ldb=fix
/etc/samba/ntdrivers.tdb=fix
/etc/samba/ntforms.tdb=fix

# SSHD
/etc/ssh/ssh_config=fix
/etc/ssh/sshd_config=fix

# MYSQL
/etc/my.cnf=fix

# NFS
/etc/exports=fix
/etc/hosts.deny=fix
/etc/hosts.allow=fix
@]

!!! Script de sauvegarde
[@
#!/bin/sh
# ===============================================================
# Script de sauvegarde des fichiers de configuration du serveur
# ===============================================================

FILECONFIG="configfiles_list.txt"
DESTDIR="./configfiles"
BACKDIR=`date +%Y%m%d%H%M%S`"_backup"

function createdir {
if [ ! -d $1 ]
then
mkdir -p $1
fi
}

createdir ${DESTDIR}

# on récupère directement la liste des fichiers à copier
for line in `egrep -v '(^[[:space:]]*#|^[[:space:]]*$)' ${FILECONFIG}`
do
file=`echo $line | awk -F"=" '{print $1}'`
traitement=`echo $line | awk -F"=" '{print $2}'`
rep=${DESTDIR}/`hostname -s`-${traitement}
createdir ${rep}
echo "Copie de ${file} vers ${rep}."
rsync -avz --backup --backup-dir=${BACKDIR} ${file} ${rep}
done
@]

!!! Script de synchronisation
'''@todo''' ''(fait à la mano pour le moment)''

des infos [[ici -> http://cvs.linux-ha.org/viewcvs/viewcvs.cgi/linux-ha/doc/rsync.html?rev=1.2]] peut-être.
February 11, 2009, at 10:58 PM by 90.17.18.150 -
Deleted lines 6-23:
!! Généralités
!!! Configuration matérielle
* 2 serveurs (identiques de préférence)
* 2 disques (ou 2 partitions) dédiés au mirroring

!!! Continuité de service
Les services suivants devront être maintenus (en basculant d'un serveur à l'autre) :
* samba
* mysql
* http
* ftp
* postfix / sendmail

!!! Services mis en oeuvre
* ''DRBD'' pour le mirroring
* ''Heartbeat'' pour la continuité de service
* ''Mon'' pour le monitoring
February 11, 2009, at 10:56 PM by 90.17.18.150 -
Added lines 1-472:
! Continuité de service : créer un cluster de machines avec Heartbeat et DRBD

!! Sources
* http://doc.ubuntu-fr.org/tutoriel/mirroring_sur_deux_serveurs#configuration_et_mise_en_place_de_drbd
* http://www.pc-fute.com/materiel/guides-clustering-linux-avec-postfix-et-debian,152.html

!! Généralités
!!! Configuration matérielle
* 2 serveurs (identiques de préférence)
* 2 disques (ou 2 partitions) dédiés au mirroring

!!! Continuité de service
Les services suivants devront être maintenus (en basculant d'un serveur à l'autre) :
* samba
* mysql
* http
* ftp
* postfix / sendmail

!!! Services mis en oeuvre
* ''DRBD'' pour le mirroring
* ''Heartbeat'' pour la continuité de service
* ''Mon'' pour le monitoring

!! Sommaire

* [[Généralités]]
* [[DRBD]]
* [[HeartBeat]]
* [[Mon]]
* [[Synchronisation]] des fichiers de configuration système

!! Mirroring avec ''DRBD'' (RAID 1 Over IP)

!!! Configurer DRBD
Le fichier de configuration à modifier est le suivant : ''/etc/drbd.conf''
[@
global {
usage-count no;
}

common {

protocol C;

handlers {
out-of-sync "echo Désynchronisation des serveurs, vérifier les logs | mail -s '[DRBD alert] out-of-sync' user@domain.fr";
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f"; # This handler is called if the node is primary, degraded and if the local copy of the data is inconsistent.
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f"; # The node is currently primary, but lost the after split brain auto recovery procedure. As as consequence, it should be abandoned.
local-io-error "echo o > /proc/sysrq-trigger ; halt -f"; # DRBD got an IO error from the local IO subsystem.
outdate-peer "/usr/sbin/drbd-peer-outdater"; # This handler is called in case the node needs to outdate the peer’s disk.
}

syncer {
rate 10M; # Débit de la synchronisation
al-extents 257;
}
}

resource r0 {

startup {
wfc-timeout 120;
degr-wfc-timeout 60;
}

disk {
on-io-error detach;
}

on server1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.11:7791;
meta-disk internal;
}

on server2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.12:7791;
meta-disk internal;
}
}
@]

Pensez à ouvrir les ports utilisés par ''DRBD'' dans le fichier ''iptables'' :
[@
-A RH-Firewall-1-INPUT -m udp -p udp --dport 7791 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 7791 -j ACCEPT
@]

!!! Initialisation des meta-data sur la ressource r0

''Note :'' les actions à réaliser sur les serveurs sont notées de la manière suivante :
* '^12^' : action à réaliser sur les 2 serveurs
* '^1^' : action à réaliser sur le serveur 1
* '^2^' : action à réaliser sur le serveur 2

!!!! Formatage des disques '^12^'
@@# mkfs.ext3 /dev/sdb1@@

!!!! Création des meta-data '^12^'
@@# drbdadm create-md r0@@
NB : si vous rencontrez des pb pour créer la ressource tapez la commande suivante (en remplaçant ''sdb1'' par votre partition)
@@# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync@@

!!!! Consulter l'état des ressources DRBD '^12^'
@@# cat /proc/drbd@@
[@
version: 8.0.6 (api:86/proto:86)
SVN Revision: 3048 build by buildsvn@c5-x8664-build, 2007-12-08 01:01:10
0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
@]

!!!! Synchronisation sur le primaire vers le secondaire '^1^'
Pour cette opération il peut-être utile d'augmenter temporairement le débit de la synchronisation.
Pour cela dans ''/etc/drbd.conf'', remplacer la ligne @@rate 10M;@@ par @@rate 100M;@@.
Pour prendre en compte la modification de la configuration, tapez la commande suivante :
@@# drbdadm adjust r0@@

Pour lancer la synchonisation des données :
@@# drbdadm -- --overwrite-data-of-peer primary all@@

NB : N'oubliez pas de réinitialiser le débit de la synchronisation à celui par défaut pour éviter de surcharger le réseau.

!!!! Visualisation de la progression de la synchronisation '^1^'
@@# cat /proc/drbd@@
[@
version: 8.0.6 (api:86/proto:86)
SVN Revision: 3048 build by buildsvn@c5-x8664-build, 2007-12-08 01:01:10
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
ns:152628 nr:0 dw:0 dr:159744 al:0 bm:8 lo:16 pe:261 ua:238 ap:0
[>...................] sync'ed: 0.2% (76149/76290)M
finish: 0:18:00 speed: 72,144 (72,144) K/sec
resync: used:1/31 hits:9506 misses:10 starving:0 dirty:0 changed:10
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
@]
''NB : à noter ici le débit ridicule de la synchro malgré une liaison Gigabit et la configuration 'normale' du débit dans /etc/drbd.conf'' > '''à investiguer'''

!!!! Résultat de la synchronisation
@@# cat /proc/drbd @@ (sur le ''primary'')
[@
[...] 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- [...]
@]

@@# cat /proc/drbd @@ (sur le ''secondary'')
[@
[...] 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r--- [...]
@]

!!! Important
'''A partir de cette étape il faudra toujours passer par le périphérique DRBD''' (''/dev/drbd0'' dans notre cas) '''pour monter la partition mirroir et en modifier les données.'''
Si vous arrêtez le service DRBD sur les 2 machines et que vous montez votre partition sans tenir compte de DRBD (''mount /dev/sdb1 /mnt/rep''), les données seront corrompues et DRBD ne s'en rendra pas compte même après redémarrage du service (d'après mes tests) !

Pour monter la partition à la main :
@@# mount /dev/debd0 /mnt/mirroir

!!!! Conclusion
Avant de modifier les fichiers d'un serveur secondaire il faut d'abord le basculer en primaire puis ensuite monter la partition mirroir (''mount /dev/drbd0 /mnt/rep'').

!!! Simulation de crash du ''primary''

Sur le serveur 1 (actuellement ''primary'') :
@@# /sbin/shutdown -h now@@

Passage du serveur 2 en ''primary'' :
@@# drbdsetup /dev/drbd0 primary@@
@@# cat /proc/drbd @@
[@
[...] 0: cs:WFConnection st:Primary/Unknown ds:UpToDate/DUnknown C r--- [...]
@]

On monte la partition et on crée un fichier dessus pour tester le comportement lorsque le serveur redémarrera.
On démonte la partition (heartbeat n'étant pas encore configuré avec drbd ce n'est pas automatique).
On démarre le serveur 1 qu'on vient d'arrêter pour tester (on attend qu'il soit complètement redémarré).
DRBD resynchronise automatiquement les données du serveur 2 vers le serveur 1.

On repasse le serveur 2 en ''secondary'' :
@@# /sbin/drbdsetup /dev/drbd0 secondary@@
@@# cat /proc/drbd@@
[@
[...] 0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r--- [...]
@]

On repasse le serveur 1 en ''primary'' :
@@# /sbin/drbdsetup /dev/drbd0 primary@@
@@# cat /proc/drbd@@
[@
[...] 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- [...]
@]

Le serveur 1 est de nouveau primaire et synchronisé.

!!! Simulation d'une coupure réseau

On débranche la prise RJ45 du serveur 1.

Statut du serveur 2 :
[@
[...] 0: cs:WFConnection st:Secondary/Unknown ds:UpToDate/DUnknown C r--- [...]
@]

Statut du serveur 2 après avoir rebranché la prise :
[@
[...] 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r--- [...]
@]

!!! Simulation d'un reboot du ''primary''

Statut du serveur 1 :
@@# /sbin/shutdown -r now@@

Au redémarrage les deux serveurs sont en ''secondary''.

On repasse le serveur 1 en ''primary'' :
@@# /sbin/drbdsetup /dev/drbd0 primary@@
@@# cat /proc/drbd@@
[@
[...] 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- [...]
@]


!! Basculer les services avec ''Heartbeat''

!!! Configuration

!!!! Fichier ''/etc/ha.d/ha.cf''

[@
# interface pour le heartbeat
bcast eth0

# délai entre deux battements de pouls
keepalive 2

# Temps d'attente avant de passer sur le deuxieme
deadtime 10

# Temps avant de diffuser un avertissement pour les pouls en retard
warntime 6

# deadtime spécifique pour les configurations ou le réseau est lent
initdead 60

# port de prise de pouls
udpport 694

# Identification des noeuds du cluster
node server1
node server2

# On interdit le rebasculement automatique vers le maitre lorsque celui-ci redeviendra UP
auto_failback off

# utilisation du démon logd
use_logd yes
@]

Pensez à ouvrir les ports utilisés par ''HeartBeat'' dans le fichier ''iptables'' :
[@
-A RH-Firewall-1-INPUT -p udp -m udp --dport 694 -j ACCEPT
@]

!!!! Fichier ''/etc/ha.d/haresource''

[@
server1 IPaddr::192.168.0.50 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/mirroir::ext3::defaults httpd mysqld smb cups
@]

Informations :
* ''192.168.0.50'' est l'adresse IP attribuée du cluster, visible normalement en tapant la commande ''ifconfig'' (si heartbeat tourne)
* en utilisant cette adresse IP vous tomberez soit sur le serveur 1, soit sur le backup si le sertveur 1 est ''down''.

Lors du basculement du serveur 1 '^1^' vers le backup '^2^' :
* on demande d'abord à ''HeartBeat'' de monter automatiquement le répertoire synchonisé par ''DRBD'' (''/mnt/mirroir'')
* on demande à ''HeartBeat'' de démarrer les services suivants sur le backup '^2^' : ''http'', ''mysql'', ''samba'' et ''cups''.
* les fichiers de configuration de ces services devront bien sûr être synchronisés entre les 2 machines (cf. bas de cette page) et les données qu'ils utiliseront devront être situés de préférence dans le répertoire ''/mnt/mirroir'' pour qu'elles soient toujours à jour.
Lors du rebasculement sur '^1^' ''HeartBeat'' fera l'opération inverse et réattribuera l'IP du cluster à '^1^'.

Options pour ''HeartBeat'' :
* Pour ajouter un mail d'alerte lors du basculement, voir du côté du script Perl ''MailTo::user@domain.fr::"[server1] Heartbeat alert !"''.
* Le fichier ''/etc/haressource'' est très bien commenté vous devriez y trouver votre bonheur.

!!!! Fichiers à personnaliser après un clonage

''Si vous avez opté pour le clonage d'un serveur vers l'autre (attention à drbd)'', vous devrez personnaliser ces fichiers sur chaque serveur :
* /var/lib/heartbeat/hb_uuid (supprimer ce fichier sur l'un des 2 serveurs après clonage, il sera généré au prochain démarrage de heartbeat)
* /etc/udev/rules.d/70-persistent-net.rules (pour faire en sorte que l'interface Ethernet eth0 soit utilisable)

''NB : repris tel quel du tutoriel Ubuntu''

!!! Redémarrage de Heartbeat

Exécuter les opérations suivantes '''dans l'ordre'''.

Sur le '''serveur 2''' : @@# /etc/init.d/heartbeat stop@@
Sur le '''serveur 1''' : @@# /etc/init.d/heartbeat stop@@
Sur le '''serveur 1''' : @@# /etc/init.d/heartbeat start@@
Sur le '''serveur 2''' : @@# /etc/init.d/heartbeat start@@

!!! Tests
!!!! Basculer sur le serveur 2
Sur le serveur 2 : @@# /etc/init.d/heartbeat restart@@

!! Troubleshooting

En cas de problème pensez toujours à consulter les logs de DRBD / Heartbeat dans ''/var/log/messages'' (ou ailleurs si vous avez défini des logs spécifiques).

!!! Gestion manuelle des services
La règle est la suivante :
* on arrête toujours HeartBeat avant DRBD
* on arrête toujours le service du secondaire avant celui du primaire
* soit :
->@@# /etc/init.d/heartbeat stop@@ '^2^'
->@@# /etc/init.d/heartbeat stop@@ '^1^'
->@@# /etc/init.d/drbd stop@@ '^2^'
->@@# /etc/init.d/drbd stop@@ '^1^'
* reprendre les commandes dans le sens inverse pour redémarrer les services (en remplaçant le ''stop'' par le ''start'').

!!! Split-brain
J'ai repris tel quel l'explication faite [[sur ce tuto -> http://www.pc-fute.com/materiel/guides-clustering-linux-avec-postfix-et-debian,152.html]].
En cas de coupure réseau, les 2 machines deviennent primaires et obtiennent la même adresse ip de la machine virtuelle !
Lorsque la connection est rétablie cela entraine un "split-brain" que l'on ne peut résoudre que manuellement.
!!!! Statut de DRBD
@@ 0: cs:StandAlone st:Primary/Unknown ld:Consistent @@ '^1^'
@@ 0: cs:StandAlone st:Secondary/Unknown ld:Inconsistent @@ '^2^'
L'état des noeuds est passé en "Unknown".
!!!! Résolution
@@# drbdadm connect r0@@ sur les 2 machines démarre la synchro du primaire vers le secondaire
@@# drbdadm invalidate r0@@ sur la machine secondaire : invalide les données et force une resynchronisation.

!!! Problème de reconnaissance des machines entre-elles
Si au redémarrage d'un serveur les services DRBD ne se reconnaissent plus.
!!!! Statut de DRBD sur les serveurs :
@@ 0: cs:StandAlone st:Primary/Unknown ds:UpToDate/DUnknown r---@@ '^1^'
@@ 0: cs:StandAlone st:Secondary/Unknown ds:UpToDate/DUnknown r---@@ '^2^'
!!!! Résolution du problème
@@# drbdadm -- --discard-my-data connect r0@@ (sur le node avec les données corrompues)
@@# drbdadm connect r0@@ (sur le node avec les données correctes)
Les nodes doivent ensuite se reconnaitre et renvoyer un statut correct (''st:Primary/Secondary ds:UpToDate/UpToDate'').

!!! Synchronisation forcée
Pour forcer la synchronisation d'un des nodes taper une des commandes suivantes :
* pour invalider la ressource ''r0'' sur le serveur courant : @@# drbdadm invalidate r0@@
* pour invalider la ressource ''r0'' sur le serveur distant : @@# drbdadm invalidate-remote r0@@
NB : l'invalidation des données déclenchera automatiquement la synchronisation.

!! Le monitoring avec ''Mon''

Dans notre configuration, ''Mon'' va réaliser plusieurs choses :
* tester que certains services sont bien ''up''
* sinon essayer de les redémarrer
* si il rencontre des problèmes pour redémarrer un / des services il va nous prévenir

!! Synchonisation des fichiers de configuration du système

'''Les scripts et fichiers qui suivent ne sont donnés qu'à titre d'exemple.'''

!!! Liste de fichiers à sauvegarder / synchroniser
Certains fichiers de configuration sont identiques sur les 2 serveurs, d'autres demandent une personnalisation selon la machine, cette différence est notée ''politique'' par la suite.
La liste des fichiers que j'ai choisi de sauvegarder est la suivante.
[@
# ===============================================================================================
# Liste des fichiers à sauvegarder
# ===============================================================================================
#
# Chaque ligne prend le format suivant : ''fichier=politique''.
#
# Chaque fichier sera sauvegardé dans un répertoire ./rep-sauvegarde/''hostname''-''politique''/
# par le script de backup.
#
# En cas de modification d'un des fichiers à sauvegarder et de relance de la sauvegarde,
# l'ancienne version du fichier est backupée dans le répertoire suivant :
# ./rep-sauvegarde/''hostname''-''politique''/''YmdHMS''_backup/
#
# NB : pas de commentaire sur les lignes à traiter (fichier lu par un script shell minimaliste)
# ===============================================================================================

# SYSTEM
/etc/resolv.conf=fix
/etc/group=fix
/etc/passwd=fix
/etc/shadow=fix
/etc/gshadow=fix
/etc/syslog.conf=fix
/etc/profile=fix

# SYSTEM (à personnaliser)
/etc/hosts=var
/etc/fstab=var
/etc/hostname=var

# DRBD
/etc/drbd.conf=fix

# HEARTBEAT
/etc/ha.d/authkeys=fix
/etc/ha.d/ha.cf=fix
/etc/ha.d/haresources=fix
/etc/ha.d/ha-logd.cf=fix

# MON
/etc/mon/auth.cf=fix
/etc/mon/mon.cf=fix
/etc/mon/userfile=fix

# APACHE
/etc/apache2/httpd.conf=fix

# SAMBA
/etc/samba/smb.conf=fix
/etc/samba/smbusers=fix
/etc/samba/passdb.tdb=fix
/etc/samba/secrets.tdb=fix
/etc/samba/account_policy.tdb=fix
/etc/samba/group_mapping.ldb=fix
/etc/samba/ntdrivers.tdb=fix
/etc/samba/ntforms.tdb=fix

# SSHD
/etc/ssh/ssh_config=fix
/etc/ssh/sshd_config=fix

# MYSQL
/etc/my.cnf=fix

# NFS
/etc/exports=fix
/etc/hosts.deny=fix
/etc/hosts.allow=fix
@]

!!! Script de sauvegarde
[@
#!/bin/sh
# ===============================================================
# Script de sauvegarde des fichiers de configuration du serveur
# ===============================================================

FILECONFIG="configfiles_list.txt"
DESTDIR="./configfiles"
BACKDIR=`date +%Y%m%d%H%M%S`"_backup"

function createdir {
if [ ! -d $1 ]
then
mkdir -p $1
fi
}

createdir ${DESTDIR}

# on récupère directement la liste des fichiers à copier
for line in `egrep -v '(^[[:space:]]*#|^[[:space:]]*$)' ${FILECONFIG}`
do
file=`echo $line | awk -F"=" '{print $1}'`
traitement=`echo $line | awk -F"=" '{print $2}'`
rep=${DESTDIR}/`hostname -s`-${traitement}
createdir ${rep}
echo "Copie de ${file} vers ${rep}."
rsync -avz --backup --backup-dir=${BACKDIR} ${file} ${rep}
done
@]

!!! Script de synchronisation
'''@todo''' ''(fait à la mano pour le moment)''

des infos [[ici -> http://cvs.linux-ha.org/viewcvs/viewcvs.cgi/linux-ha/doc/rsync.html?rev=1.2]] peut-être.
Edit - History - Print - Recent Changes - Search
Page last modified on February 12, 2009, at 02:01 PM