Outils personnels

Réplication de systèmes de fichiers avec DRBD

De wikiGite

Révision datée du 22 janvier 2011 à 18:10 par Frank (discussion | contributions) (Page créée avec « Tests réalisés sur CentOS 5.5 BlueOnyx On réplique /home (/dev/mapper/VolGroup00-home). La difficulté réside dans le fait que /home est utilisé par plusieurs services ... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

Tests réalisés sur CentOS 5.5 BlueOnyx

On réplique /home (/dev/mapper/VolGroup00-home). La difficulté réside dans le fait que /home est utilisé par plusieurs services (admserv, http, mysql...) ce qui posera des problèmes au boot.

Note : on va utiliser Postgresql. Mysql est déjà placé dans /home, il faut que Postgres le soit aussi, pour être répliqué.

Voir ici : Déplacement des répertoires PostGreSQL dans /home

Installation

yum install drbd82 kmod-drbd82

DRBD demande soit un volume vierge, dans ce cas il crée ses meta data dedans et monte le volume pour la réplication (meta-disk internal), soit un volume à part, environ 32M pour 1T de partition répliquée (une partition, un volume LVM, un disque externe, un ramdisk même, ce qu'on veut) et dans ce cas on lui donne le chemin (meta-disk /chemin/vers/le/disque/metadata)

Avec LVM : reduire /home d'environ 100M, ajouter une nouveau LV pour les meta data : Gestion LVM.

"meta-disk internal" signifie qu'il utilisera une partie de la partition pour ses meta-data. Il ne doit donc pas y avoir de système de fichier sur la partition (il sera créé après).

Pour répliquer un volume existant, créer une partition à côté pour y mettre les meta-data. Référencer par exemple par "meta-disk /dev/VolGroup00/drbd[0]" pour un volume logique LVM (le [0] indique un index de metadata pour une première partition. On peut réutiliser le même volume en mettant un index [1] pour une seconde partition répliquée, et ainsi de suite).

Paramétrage

/etc/drbd.conf

global { usage-count no; }
resource home {
  protocol C;
  startup {
     wfc-timeout 0; # drbd init script will wait infinitely on resources.
     degr-wfc-timeout 120; # 2 minutes.
     become-primary-on magiline1.systea.net; # or "both" for multimaster
  }
  disk { on-io-error detach; } # or panic, ...
  net {
     cram-hmac-alg "sha1";
     shared-secret "Cent0Sru!3z"; # don't forget to choose a secret for auth !
     max-buffers 2048; #datablock buffers used before writing to disk.
     ko-count 4; # Peer is dead if this count is exceeded.
     #on-disconnect reconnect; # Peer disconnected, try to reconnect.
  }
  syncer {
    rate 10M;
    verify-alg "crc32c"; # Algorythm to tun "drbdadm verify"
  }
  on magiline1.systea.net {
    device /dev/drbd0;
    disk /dev/VolGroup00/home;
    address 192.168.1.6:7788;
    meta-disk internal;
  }
  on magiline2.systea.net {
    device /dev/drbd0;
    disk /dev/VolGroup00/home;
    address 192.168.1.7:7788;
    meta-disk internal;
  }
}

NOTE : Les noms de machines après les "on..." doivent correspondre à ce que retourne "uname -n".

Attention à bien utiliser les noms de devices indiqués par lvdisplay (pas ceux du fstab qui peuvent être des labels, ni ceux du "mount" qui peuvent être différents si LVM est utilisé).

Créer les metadata :

drbdadm create-md home (sur les 2 noeuds)

Démonter la partition si nécessaire. Si le serveur secondaire est prêt, lancer drbd

service srbd start

Il attend son alter ego, lancer drbd sur le second serveur.

Vérifier sur le "primaire" l'état de la partition :

# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-build, 2008-10-03 11:42:32
 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 oos:87031808

Il est noté "Inconsistent". On force donc le primaire à se répliquer sur le secondaire ("all" peut être remplacé explicitement par le nom de la ressource à synchroniser)

# drbdadm -- --overwrite-data-of-peer primary all
# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-build, 2008-10-03 11:42:32
 0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
    ns:31876 nr:0 dw:0 dr:32000 al:0 bm:1 lo:0 pe:7 ua:4 ap:0 oos:87000128

[>....................] sync'ed: 0.1% (84961/84992)M finish: 2:15:56 speed: 10,560 (10,560) K/sec

Paramétrage du système

Dans /etc/fstab, remplacer les références à l'ancien volume (ex: /dev/VolGroup00/home) par /dev/drbd0. IMPORTANT : mettre "0 0" à la fin de la ligne, sinon au reboot le système essaie de vérifier /dev/drbd0 (fsck) mais comme drbd n'est pas encore lancé à ce moment, le boot s'arrête en erreur :

/dev/drbd0 :
    The superblock could not be read...

Comme DRBD n'est pas prêt à la lecture de /etc/fstab, le volume drbd ne monter pas au boot. Il y aura des erreurs aux démarrage des services http, mysql... pendant le boot : tant pis (ou alors, il faut désactiver ces services au démarrage, par chkconfig, ce qui est plus propre).

Donc : mettre "noauto" sur la ligne du fstab concernant cette partition, désactiver le démarrage auto des services (par chkconfig) et ajouter le montage de la partition et le démarrage des services à rc.local. Exemple :

chkconfig admserv off
chkconfig httpd off
chkconfig mysqld off
chkconfig postgresql off

et sur le secondaire on peut ajouter

chkconfig monit off # si monit rest installé
chkconfig sendmail off
chkconfig saslauthd off

et dans le rc.local du primaire ajouter :

mount /home
quotaon -a
service admserv start
service httpd start
service mysqld start
service postgresql start

Une fois la synchronisation terminée, il faut décider si il fonctionne en primaire/primaire ou primaire/secondaire.

Dans le premier cas, sur les deux noeuds :

drbdadm primary all

ou dans le second cas, respectivement

drbdadm primary all

sur le premier noeud et

drbdadm primary all

sur le second.

On peut voir l'état de la connexion par

drbdadm cstate all

ou

cat /proc/drbd

Maintenant, on peut monter la partition sur le primaire et travailler dessus. NOTE BO : attention aux quotas sur /home, si la partition LVM a été réduite. Il faut monter d'abord la partition en RO (mount -o ro /home) et recalculer les quotas :

quotacheck -avug

Puis on remonte en RW, et relancer les quotas

quotaon -a

REBOOT

Attention au choix de la partition répliquée. Le volume /dev/drbd0 n'est pas montable au boot (le module drbd n'est pas chargé, et le script d'init n'arrive que tard dans la séquence de boot). Si ce volume est nécessaire au boot, le serveur ne peut donc pas redémarrer !

Voir aussi les considérations sur le paramétrage de /etc/fstab plus haut.

Si la partition de metadatas de drbd est à part, le message "drbd0: Barriers not supported on meta data device - disabling" peut apparaitre au boot : c'est un message informatif qui peut être ignoré.

SWITCH

Pour switcher le serveur secondaire en primaire, si le primaire est arrêté ou HS, appliquer la précédure ci-dessous.

Par contre si le primaire est encore en ligne, qu'on ne peut pas (ou veut pas) l'éteindre pour une raison ou une autre, il faut s'assurer que DRBD sur des deux serveurs est "déconnecté" si on veut passer le secondaire en primaire. Sur les deux serveurs, lancer :

drbdadm down all # "down" means "detach+disconnect"

Pour switcher, rur le secondaire prévoir un script à lancer pour le faire passer en primaire :

drbdadm disconnect all # pour être sûr
drbdadm primary all
mount /home # ou mount /dev/drbd0
# Pour BlueOnyx spécifiquement :
quotaon -a
service admserv start
service httpd start
service mysqld start
service postgresql start # si nécessaire

SWITCH OVER ou : le retour

Quand un slave est passé primaire, on ne peut pas simplement relancé l'autre serveur (après dépannage éventuel) et leur redonner leurs rôles. Si on essaie de repasser le slave en secondaire, on a en général :

"Split-Brain detected, dropping connection !"

qui signifie qu'il se considère primaire et refuse la connexion de l'autre serveur. Pour le re-déclarer secondaire, après lancement de drbd (et expiration du délai d'attente) il faut :

drbdadm secondary all
drbdadm -- --discard-my-data up all # "up" means "connect+attach"

A ce moment, la connexion est rétablie. Le primaire refait parfois une synchronisation complète (quoique beaucoup plus rapide que la synchro d'origine, il ne fait à priori qu'une vérification) vers le secondaire s'il détecte des différences de blocks.

On peut forcer la vérification par

drbdadm verify all

le "cat /proc/drbd" doit indiquer "cs:VerifyS" au lieu de "cs:Connected" en temps normal.

Si des blocks diffèrent, ils ne sont pas automatiquement synchronisés après un verify. Pour ça, il faut forcer la synchro par :

drbdadm disconnect all
drbdadm connect all

TODO

A faire : tester le primaire/primaire pour moins de temps de bascule (les services peuvent-ils être lancés sur le secondaire ?)