La haute disponibilité logicielle via Heartbeat

Concepts

Configuration et utilisation de Heartbeat

"The box said: "install on Windows 95, NT 4.0 or better". So I installed it on Linux". (Anonyme)


Vous allez maintenant découvrir comment configurer Heartbeat pour faire fonctionner une solution avec une seule machine active. La solution active / active ne sera PAS expliquée, pour deux raisons simples :

Ce qui suit fonctionne sur des machines Linux version Debian stable (sarge) avec un noyau en version 2.6. Je considèrerai que les manipulations de base comme la création de fichiers ou le changement des droits sont acquises.

Dans le cas contraire, vous pourrez vous reporter au guide de référence Debian :
    http://qref.sourceforge.net/Debian/quick-reference/index.fr.html.
Prévoir un temps de formation conséquent et une bonne cafetière.

Vous devrez avoir un droit d'administration pour effectuer toutes les commandes. Vous devrez dont vous connecter en root sur votre machine, ou utiliser le mécanisme de sudo.

Les logiciels utilisés pour cette partie sont :


Règles de base

Voici les quelques points à respecter pour que tout se passe bien. Sinon, n'oubliez jamais que de mauvaises choses pourront se produire.

  1. Ne pas configurer l'IP virtuelle sur votre système Linux. C'est Heartbeat qui s'en occupera lorsque le besoin s'en fera sentir.
  2. Les services qui seront lancés par Heartbeat ne doivent pas être chargés automatiquement au démarrage de Linux. C'est également Heartbeat qui se chargera de cela le moment venu.
  3. Enfin, Les fichiers de paramètres doivent être identiques sur les deux serveurs pour fonctionner.


Installation du programme

Le paquet Debian pour mettre en place la solution s'appelle 'heartbeat'. Son installation se fait comme suit :
apt-get update
apt-get install heartbeat
Pour le faire fonctionner, il faut créer 3 fichiers de configuration, dans le dossier /etc/heartbeat. Ce que nous allons faire de suite.

Configuration du programme

/etc/heartbeat/ha.cf

Ce fichier détermine la liste des machines à utiliser et la manière de dialoguer entre elles. Une liste exhaustive des paramètres pourra être trouvée ici : http://www.linux-ha.org/ha.cf.

Voici les éléments intéressants à recopier :
logfile         /var/log/ha-log
logfacility     local0
keepalive       2
deadtime        10
bcast           eth0
node            nom_serveur1 nom_serveur2
auto_failback   no
respawn         hacluster /usr/lib/heartbeat/ipfail
apiauth         ipfail gid=haclient uid=hacluster
logfile (facultatif)
Fichier où loguer les évènements relatifs à heartbeat (lancement, arrêt, etc.). Si vous utilisez ce paramètre, faites attention à limiter la taille des logs via le mécanisme logrotate de Debian.
logfacility
Indique quelle "facility" le syslog devra utiliser pour loguer les évènements. Les valeurs peuvent changer selon les systèmes, mais local0 reste une valeur sûre.
keepalive
Intervalle entre 2 battements de coeur. La valeur est en secondes par défaut. Pour la spécifier en millisecondes, on rajoutera 'ms' derrière. (Par exemple, 200ms).
deadtime
Temps nécessaire avant de considérer qu'un noeud est mort. Le temps est en secondes par défaut. On rajoutera 'ms' derrière pour l'avoir en millisecondes.
Attention avec cette valeur : si elle est trop courte, le système risque de s'auto-déclarer mort. Si elle est trop grande, l'autre machine mettra un temps conséquent avant de s'en apercevoir et de reprendre la main.
bcast
Spécifie l'interface réseau utilisée par Heartbeat pour envoyer les battements de coeur (en UDP).
node
Liste des machines utilisées pour la haute disponibilité, séparées par des espaces.
auto_failback
Comportement à adopter si la machine en panne revient sur le réseau. Si le paramètre est à 'Off', elle se met simplement en attente. Avec 'On', elle redevient la machine active, et celle qui fonctionne à l'heure actuelle repasse en passive.
respawn
Permet de lancer un programme au démarrage de heartbeat, qui sera tout le temps actif (Le premier paramètre est l'id de l'utilisateur qui lancera le programme. Le second, le programme lui-même).
On instancie ici ipfail, qui est à peu près le seul logiciel intéressant à lancer. Il permet d'accélérer la détection d'erreur, en regardant la disponibilité des liens réseaux en plus d'attendre un certain nombre de battements de coeur. Ceci permet au serveur passif de prendre la main dés qu'une connexion réseau est coupée, au lieu d'attendre la non réception de X battements de coeur.
apiauth
(Utilisé conjointement avec respawn). Indique quels groupes et utilisateurs ont le droit de dialoguer avec les programmes lancés par respawn. Ces programmes étant normalement utilisés pour des besoins internes, il semble logique d'interdire les accès extérieurs.
La syntaxe est :
nom_programme uid=uid_souhaité gid=gid_souhaité

/etc/heartbeat/haresources

Ce fichier indique les opérations à effectuer au démarrage de la haute disponibilité sur une machine. La syntaxe est la suivante :
NOM_1ER_NODE action1 action2 ... actionN
NOM_1ER_NODE
Ce nom doit être le même pour les 2 machines. C'est le nom de la machine qui sera activée par défaut au démarrage de heartbeat.
action
Vous pouvez demander un liste d'actions à effectuer au démarrage de heartbeat. Toutes les actions sont séparées par des espaces. Pour ajouter des paramètres aux actions, utiliser le signe 4-points : "::"
Voici quelques exemples d'actions possibles :
Activer une adresse IP virtuelle
Utilisation : IPaddr::adresse_ip/masque/interface
node1 IPaddr::192.xxx.xxx.xxx/24/eth0
Lancer un service
Utilisation : nom_service
node1 apache2
Attention : ce service doit être dans /etc/init.d (ou /etc/heartbeat/ressource.d), et doit reconnaître les arguments 'start' et 'stop'.
Monter un système de fichiers local
Utilisation : Filesystem::periph_source::point_de_montage::type_partition
node1 Filesystem::/dev/sda1::/data/scsi1::vfat
Monter un système de fichiers distant (par exemple NFS)
Utilisation : Filesystem::adresse_ip_source:/dossier_src::point_de_montage::type_partition
node1 Filesystem::192.x.x.x:/partage_distant::/data/montage_local::nfs
Monter un système de fichiers distant avec des options de montage
Utilisation : Filesystem::adresse_ip_source:/dossier_src::point_de_montage::type_partition::options
node1 Filesystem::192.x.x.x:/src::/dest::nfs::rsize=8192,wsize=8192


/etc/heartbeat/authkeys

Ce fichier détermine la clé et le protocole de protection utilisé. Voici un exemple du fichier :
auth 3
3 md5 mot_de_passe

On notera qu'il y a 3 méthodes d'authentification :

Quoi qu'il en soit, pensez à protéger ce fichier pour qu'il ne soit plus visible par n'importe qui (si vous ne le faites pas, le programme ne se lancera pas) :

chmod 600 /etc/heartbeat/authkeys


Démarrage du programme

Avant de continuer, assurez-vous que les fichiers de configuration des deux serveurs sont identiques, et que les services sont arrêtés :
/etc/init.d/nom_service stop
Il faut ensuite faire en sorte que les services gérés par Heartbeat ne soient plus lancés automatiquement au démarrage de Linux :
update-rc.d -f nom_service remove
Vous pouvez maintenant taper (sur les 2 serveurs) :
/etc/init.d/heartbeat start
Au bout de quelques instants, les services se sont normalement lancés sur la première machine, pendant que l'autre est en attente. Voici quelques manières simples de le contrôler.

Vérifier l'activation de l'IP virtuelle

Pour voir si l'adresse IP virtuelle est active, tapez :
ifconfig
Sur la machine passive, vous n'aurez que vos interfaces habituelles. Sur celle active, une nouvelle interface est apparue, avec ':0' à la fin (par exemple, si vous avez spécifié eth0 dans haresources, l'interface s'appelle eth0:0).

Résultat avec la machine active :
eth0      Lien encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
	...

eth0:0    Lien encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
inet adr:192.168.42.10  Bcast:192.168.42.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interruption:185 Adresse de base:0x1400

lo        Lien encap:Boucle locale
	...

Vérifier le lancement des services

Pour voir quels services sont lancés sur la machine, tapez :
ps awx
Vous trouverez votre service juste après les lignes 'heartbeat'. Ici, c'est apache2 qui est lancé.
 3391 ?        SLs    0:53 heartbeat: heartbeat: master control process
 3393 ?        SL     0:00 heartbeat: heartbeat: FIFO reader
 3394 ?        SL     0:12 heartbeat: heartbeat: write: bcast eth0
 3395 ?        SL     0:01 heartbeat: heartbeat: read: bcast eth0
 3397 ?        S      0:03 /usr/lib/heartbeat/ipfail
 3593 ?        Ss     0:00 /usr/sbin/apache2 -k start -DSSL
 3683 ?        S      0:00 /usr/sbin/apache2 -k start -DSSL
Si quelque chose ne fonctionne pas, essayez de spécifier un fichier de logs dans ha.cf, et étudiez son contenu. Cela reste encore la méthode la plus fiable pour résoudre les erreurs de manipulation.


Vous êtes arrivé à la fin de cet article. Pour en savoir plus sur le sujet, n'hésitez pas à consulter la partie Références. Vous y trouverez plusieurs tutoriels bien faits et quelques liens pour aller plus loin.