Pour mettre cela en oeuvre, nous allons partir d'une Debian Lenny installée avec les éléments de base, puis nous allons utiliser DRBD un module du noyau qui effectue la réplication, puis Hearbeat qui permet le basculement d'un serveur à l'autre en cas de panne.
Il y a néanmoins plusieurs pré-requis à prendre à compte:
- Les 2 serveurs doivent être relié au travers d'une liaison 1Gb
- Si possible être relié en direct sans passer par un switch
- Si possible au travers d'un carte réseau dédiées
- Les partitions utilisées pour l'espace disque sur les 2 serveurs doivent être identiques, même si les serveurs sont des modèles ou des marques différentes.
Une petite précision pour les serveurs OVH, cette procédure ne peut pas s'appliquer à vos serveurs car le noyau Linux n'est pas celui fourni par Debian, du coup, les paquets ne s'installent pas correctement au niveau des modules du noyau. Dans un très prochain billet, une procédure d'installation sera publiée.
Démarrons la mise en place d'un cluster Maître/Esclave. Pour cela, définition la répartition des adresses IP:
- 192.168.198.128 : Serveur maître
- 192.168.198.130 : Serveur esclave
- 192.168.198.125 : Adresse publique
Le nom des serveurs doit être connu et bien définit, pour cela il faut les vérifier avec la commande
# uname -n
Pour modifier à votre convenance, modifiez le fichier /etc/hostname, puis redémarrez le serveur.
Installation de Heartbeat
# apt-get install heartbeat chkconfig Heartbeat not configured: /etc/ha.d/ha.cf not found. Heartbeat failure [rc=1]. Failed.
L'erreur est normale.
Configuration de Heartbeat sur le serveur Maître : /etc/ha.d/ha.cf
ucast eth0 192.168.198.130 debugfile /var/log/ha.debug logfile /var/log/ha.log logfacility local0 # délai entre deux battements de pouls keepalive 2 # temps nécessaire avant de considérer un noeud comme étant mort deadtime 10 # délai avant d'envoyer un avertissement pour les pouls en retard warntime 6 # deadtime spécifique pour les configurations où le réseau met un certain temps à démarrer initdead 60 # port à utiliser pour la prise de pouls udpport 694 # uname -n pour connaitre le nom des 2 serveurs node debian-master node debian-slave # met la valeur on, lorsque le node maître revient dans le cluster, tout est transféré sur ce dernier auto_failback off
Configuration de Heartbeat sur le serveur Esclave : /etc/ha.d/ha.cf
ucast eth0 192.168.198.128 debugfile /var/log/ha.debug logfile /var/log/ha.log logfacility local0 # délai entre deux battements de pouls keepalive 2 # temps nécessaire avant de considérer un noeud comme étant mort deadtime 10 # délai avant d'envoyer un avertissement pour les pouls en retard warntime 6 # deadtime spécifique pour les configurations où le réseau met un certain temps à démarrer initdead 60 # port à utiliser pour la prise de pouls udpport 694 # uname -n pour connaitre le nom des 2 serveurs node debian_master node debian_slave # met la valeur on, lorsque le node maître revient dans le cluster, tout est transféré sur ce dernier auto_failback off
Dans notre cas, il est préférable d'utiliser auto_failback off pour éviter que le Maitre ne reprenne le contrôle sur l'Esclave alors que la stabilité n'est pas avérée. Par exemple, si le Maître redémarre de manière intempestive (problème électrique, de processeur ou de barrettes mémoires), il se récupérera le titre de maître et si les défaillances persistes, la fonction cluster sera cassée au bout de quelques transferts rapprochés. Une fois les serveur Maître stabilisé, ce sera à nous de restituer, à la main, les rôles correctement.
Définition des adresses publiques, sur les 2 serveurs, dans le fichier /etc/ha.d/haresources
debian-master IPaddr::192.168.198.125
Dans ce fichier de configuration, les commandes à exécuter sont regroupées dans l'ordre d'exécution. Ces commandes sont séparées par un espace.
Si nous ne sommes pas dans un environnement sécurisé, à minima, nous pouvons mettre en place une authentification pas échange de clés. Dans le fichier /etc/ha.d/authkeys:
auth 2 1 md5 "Mot de passe - cluster debian" 2 crc
Le mot de passe doit bien évidemment être changé. Puis on protège les accès à ce fichier:
# chmod 600 /etc/ha.d/authkeys
Maintenant, on démarre le deamon:
# /etc/init.d/heartbeat start
Nous allons effectuer quelques tests pour vérifier que cela fonctionne bien:
- Se connecter en SSH sur l'adresse IP publique
- Exécuter uname -n afin de vérifier que le nom du serveur est bien Debian-master
- Couper le serveur maître (arrêt du serveur, coupure électrique ou coupure de l'interface réseau)
- La fenêtre SSH ne doit plus répondre
- Se reconnecter en SSH sur l'adresse IP publique
- Exécuter uname -n afin de vérifier que le nom du serveur est bien Debian-slave <- ceci indique que lorsqu'une coupure du serveur maître survient le serveur esclave prend bien le relais
- Relancer le serveur maître (ou réactiver l'interface réseau)
- Sur le serveur Esclave, exécuter etc/init.d/heartbeat restar afin de rendre la main au serveur Maître
- La fenêtre SSH ne doit plus répondre
- Se reconnecter en SSH sur l'adresse IP publique
- Exécuter uname -n afin de vérifier que le nom du serveur est bien Debian-master <- ceci indique que l'on rend bien la main au serveur Maître
Mise en place de réplication avec DRBD
Nous devons commencer par créer les partitions de réplication sur les 2 serveurs, pour vérifier les partitions disponibles:
# fdisk -l
La taille des partitions doit être identique.
Création des partitions (exemple avec la partition sdb disponible):
# cfdisk /dev/sdb
(taille de votre choix, type Linux, no bootable)
Formatage des partitions:
# mkfs.ext3 /dev/sdb1
Installation de DRBD
# apt-get install drbd8-modules-2.6-686 drbd8-utils
(le module est à adapter en fonction de la version du kernet utilisé)
Convertion des partitions pour convenir à DRBD
# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync 1+0 enregistrements lus 1+0 enregistrements écrits 1048576 bytes (1,0 MB) copied, 0,0433103 s, 24,2 MB/s
Modification des propriétaires pour les fichiers de configuration:
# chgrp haclient /sbin/drbdsetup # chmod o-x /sbin/drbdsetup # chmod u+s /sbin/drbdsetup # chgrp haclient /sbin/drbdmeta # chmod o-x /sbin/drbdmeta # chmod u+s /sbin/drbdmeta
Création des metadata
# drbdadm create-md r0 Writing meta data... initialising activity log NOT initialized bitmap New drbd meta data block sucessfully created.
Association de la ressource avec les devices
# drbdadm attach r0
Mise en place des paramètres de synchronisation
# drbdadm syncer r0
Connection entre les serveurs
# drbdadm connect r0
Afficher l'état du cluster
# cat /proc/drbd version: 8.0.14 (api:86/proto:86) GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by phil@fat-tyre, 2008-11-12 16:40:33 1: 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/61 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0
A partir de maintenant nous ne travaillons que sur le serveur principal (debian-master).
Initialisation de la synchronisation (à réaliser uniquement sur le serveur principal)
# drbdadm -- --overwrite-data-of-peer primary r0
La synchronisation entre les serveurs commence, pour vérifier, il suffit de regarder l'état du cluster
# cat /proc/drbd version: 8.3.0 (api:88/proto:86-89) GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by phil@fat-tyre, 2008-11-12 16:40:33 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r--- ns:65536 nr:0 dw:0 dr:65536 al:0 bm:3 lo:65 pe:0 ua:64 ap:0 ep:1 wo:b oos:621896016 [>....................] sync'ed: 0.1% (607320/607384)M finish: 7:54:00 speed: 21,844 (21,844) K/sec
Notez à la dernière ligne, elle indique le temps restant à l'achèvement de la synchronisation.
A partir de ce moment, les données sont déposées simultanément sur les 2 serveurs.
Formatage de la nouvelle partition, inutile d'attendre la fin de la synchronisation:
# mkfs.ext3 /dev/drbd1
Montage automatique de la partition DRBD avec Heartbeat
Nous allons créer un point de montage pour la partition DRBD dans le dossier /cluster sur les 2 serveurs.
# mkdir /cluster
Configuration de Heartbeat sur les 2 serveurs, dans le fichier /etc/ha.d/haresources nous devons avoir ceci:
debian-master IPaddr::192.168.198.125 drbddisk::r0 Filesystem::/dev/drbd0::/cluster::ext3
Vous avez maintenant un cluster Haute Disponibilité sous la main, placez dans le dossier /cluster tous les éléments qui doivent être partagés entre les 2 serveurs.
15 réactions
1 De Lujeni - 24/11/2009, 13:34
Rebonjour ,
j'avance petit a petit dans le tuto. Cela a l'air de marcher .
Les deux serveurs se ping ainsi que l'adresse publique . Cependant j'aurais deux questions :
Un message bizarre :
# /etc/init.d/heartbeat restart
Stopping High-Availability services:
Done.
Waiting to allow resource takeover to complete:
Done.
Stating High-Availability services:
2009/11/24_13:11:07 INFO: Resource is stopped
Done.
Cela veux dire que la resource n'a pas pu demarre?
Est-il possible d'avoir un peu plus d'informations sur la manière de se connecter en SSH .
J'ai esaye #ssh root:[email protected]
mais il me refuse .
je suis sous Vmware .
Merci beaucoup pour l'aide .
Julien
2 De Pierre PINTARIC - 24/11/2009, 23:27
Au sujet de la première partie de ta question, cela signifie qu'avant d'arrêter Heartbeat, tous les services associés doivent être stoppés. Ce qui est le cas dans tes logs.
Au sujet de la deuxième partie de ta question, essaye de te connecter avec
, un mot de passe te sera demandé#ssh [email protected]
Le fait que tu sois sous VMWare n'a pas d'autre incidence que de te donner des temps d'accès très lent au niveau des disques...
3 De temanizied - 30/11/2009, 23:36
je veut savoir si vous pouvez nous donner comment créer un cluster de calcul et merci
4 De Pierre PINTARIC - 01/12/2009, 00:15
Un cluster de calcul est clairement différent d'un cluster de fichiers. Vous devriez chercher dans la direction du calcul partagé.
Je n'ai pas encore mis ceci en œuvre, mais j'avoue que cela fait parti de mes plans secrets...
5 De papillondunord - 03/12/2009, 06:48
Un blog est un journal personnel en effet mais surtout un lieu dechange et de partage d idees (tout comme je fais actuellement sur le sujet) Bref, Merci pour les tuyaux, cest tres enrichissant.
6 De Lujeni - 12/04/2010, 16:47
Bonjour ,
serait il possible d'avoir une vision de votre fichier de configuration Drbd.
Merci d'avance
7 De Pierre PINTARIC - 20/04/2010, 00:20
Voici la config de DRBD pour l'un de mes serveurs en production:
#
# drbd.conf
#
global {
usage-count yes;
}
common {
syncer {
rate 40M;
verify-alg sha1;
}
}
resource r0 {
protocol C;
syncer {
verify-alg sha1;
}
handlers {
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
outdate-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";
}
startup {
degr-wfc-timeout 120; # 2 minutes.
}
disk {
on-io-error detach;
}
net {
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
}
on servername1.pintaric.net {
device /dev/drbd0;
disk /dev/sda3;
address XXX.XXX.XXX.XXX:7788;
meta-disk internal;
}
on servername2.pintaric.net {
device /dev/drbd0;
disk /dev/sda3;
address YYY.YYY.YYY.YYY:7788;
meta-disk internal;
}
}
Bien entendu les noms de serveurs et leurs adresses ont été masqués.
En espérant que cela ait pu vous aider.
8 De Lujeni - 26/05/2010, 16:32
Est il possible d'avoir plus de details sur la dernière etape. En effet il suffit juste de créer le repertoire sur les deux serveurs et modifier le fichier de conf?
9 De Pierre PINTARIC - 01/06/2010, 10:12
En effet, une fois DRBD en place, cela se comporte comme une partition classique, il faut la partitionner, la formater et la monter. La procédure est indiquée dans la procédure...
10 De kdc - 29/11/2010, 11:59
Bonjour M.Pintaric,
J'ai suivi toutes les étapes de votre tuto pour faire mon installation. Tout s'est bien déroulé sur mon serveur primaire mais avec le secondaire j'ai eu quelques soucis. Ces soucis sont:
l'impossibilité de formater le le disque drbd0 pendant la synchro. La commande me ramenait le message d'erreur suivant :
#mkfs.ext3 /dev/drbd0
mke2fs 1.41.3 (12-Oct-2008)
mkfs.ext3: Mauvais type de medium lors de la tentative de détermination de la taille du système de fichiers
slave-cluster:/etc#
Et puis chose bizarre, après le redémarrage des deux serveurs je n'arrive plus à joindre l'adresse flottante prise en charge par heartbeat tout comme la copie d'un fichier quelconque dans le repertoire cluster sur le master ne se recopie pas sur le slave.
Merci de m'aider à dépasser le cadre des erreurs.
Cordialement
11 De Pierre PINTARIC - 02/12/2010, 11:15
12 De Habibo - 27/06/2011, 15:51
Bonjour, lors de la création ds métadata j'obtiens un message d'erreur qui est :
pcxp01:/var/log# drbdadm create-md r0
/etc/drbd.conf:407: in resource r0, on amd { ... } ... on alf { ... }:
There are multiple host sections for the peer.
Maybe misspelled local host name 'pcxp01'?
/etc/drbd.conf:407: in resource r0, there is no host section for this host.
Missing 'on pcxp01 {...}' ?
/etc/drbd.conf:445: in resource r1, on amd { ... } ... on alf { ... }:
There are multiple host sections for the peer.
Maybe misspelled local host name 'pcxp01'?
/etc/drbd.conf:445: in resource r1, there is no host section for this host.
Missing 'on pcxp01 {...}' ?
/etc/drbd.conf:465: in resource r2, on amd { ... } ... on alf { ... }:
There are multiple host sections for the peer.
Maybe misspelled local host name 'pcxp01'?
/etc/drbd.conf:465: in resource r2, there is no host section for this host.
Missing 'on pcxp01 {...}' ?
/etc/drbd.conf:484: in resource r3, on amd { ... } ... on alf { ... }:
There are multiple host sections for the peer.
Maybe misspelled local host name 'pcxp01'?
/etc/drbd.conf:484: in resource r3, there is no host section for this host.
Missing 'on pcxp01 {...}' ?
Je n'arrive pas à le comprendre, pourriez-vous m'aider?
13 De Pierre PINTARIC - 01/07/2011, 22:31
ça sent les soucis de config, à priori, il y a plusieurs hôte qui ont le même nom. Difficile de répondre sans le fichier de configuration sous les yeux...
14 De David - 11/01/2012, 10:45
Bonjour,
Merci pour le tuto c'est vraiment sympa!!!
Mais je reviens vers vous car j'ai un soucis :
Il m'est impossible de me connecter sur l'ip publique?
Et voici le message que me renvoie heartbeat lorsque je le start :
-------------------------------------------------------------------------------
root@debianmaster:~# /etc/init.d/heartbeat start
Starting High-Availability services: IPaddr[21855]: INFO: Resource is stopped
Done.
root@debianmaster:~#
-------------------------------------------------------------------------------
Pour ce qui est de l'ip public, lorsque je lance un ifconfig je ne vois pas l'ip virtuelle/public en eth0/0 :
root@debianmaster:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:47:0f:3a
inet adr:192.168.1.15 Bcast:192.168.1.255 Masque:255.255.255.0
adr inet6: fe80::20c:29ff:fe47:f3a/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1368529 errors:0 dropped:0 overruns:0 frame:0
TX packets:262075 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
RX bytes:182667318 (174.2 MiB) TX bytes:44497702 (42.4 MiB)
Donc pour reprendre voici l'archi :
192.168.1.15 debianmaster
192.168.1.14 debianslave
192.168.1.25 ip public
Je ne sais pas si j'ai été clair, mais je galère un peu et je suis sûr que ce n'est pas grand-chose...
15 De Pierre PINTARIC - 12/03/2012, 11:06
David,
Il est nécessaire de configurer l'IP publique dans le fichier /etc/network/interfaces