Installation et configuration d'un cluster Heartbeat V2

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Heartbeat est l'un des cluster software les plus utilisés car il est très souple, puissant et stable. Nous allons donc voir comment précéder à une installation, configuration et surveillance des services pour Heartbeat 2. Heartbeat 2 va permettre par rapport à la version 1 de gérer plus de 2 noeuds.

Contrairement à la version 1 de Heartbeat, cette solution ne peut être montée en 30 min. Il faudra passer quelques heures dessus...

2 Installation

2.1 Via les depots officiels

Allez hop, comme dab, c'est relativement simple :

apt-get install heartbeat-2

2.2 Via des packages externes

Pour ceux qui ne veulent pas utiliser les packages Debian car pas assez complet, allez sur ce site http://download.opensuse.org/repositories/server:/ha-clustering/ et téléchargez les packages pour votre distribution (j'ai par exmemple prit ceux de Debian 64bits). Créer vous un dossier dans lequel vous aurez mis tous les packages et placez vous dedans, puis :

dpkg -i *
apt-get -f install

Ceci installera tous les packages ainsi que les dépendances.

Si vous souhaitez utiliser l'interface graphique, vous aurez également besoin d'installer ces packages :

apt-get install python-central python python-glade2 python-xml python-gtk2 python-gtkmvc 

Effectuez ceci sur les 2 noeuds. Ici ils s'appellent :

  • deb-node1
  • deb-node2

2.3 hosts

Pour faciliter la configuration et les transactions ha, configurez correctement votre fichier /etc/hosts sur tous les noeuds :

192.168.0.155   deb-node1
192.168.0.150   deb-node2

Un serveur DNS peut également faire l'affaire !

2.4 NTP

Veillez à ce que tous les serveurs aient la même heure. Il est donc conseillé de les synchroniser sur le même serveur NTP (ex : ntpdate 0.pool.ntp.org)

2.5 sysctl.conf

Nous allons modifier la gestion des fichiers "core". Heartbeat recommande de modifier la configuration par défaut en ajoutant la ligne suivante dans /etc/sysctl.conf :

kernel/core_uses_pid=1

Il faut ensuite appliquer cette configuration:

/etc/init.d/procps.sh restart

3 Configuration

Dans un premier temps, nous allons récupérer les fichiers de conf d'exemple :

cd /usr/share/doc/heartbeat-2
gzip -d ha.cf.gz haresources.gz
cp authkeys ha.cf haresources /etc/ha.d/

Ensuite nous allons commencer à editer les fichiers de configuration. Allez dans /etc/ha.d/

3.1 ha.cf

Un exemple de fichier de configuration du ha.cf peut être trouvé dans /usr/share/doc/heartbeat/ha.cf.gz.

Voici le contenu du fichier /etc/ha.d/ha.cf une fois modifié :

logfacility     local0 # Pour l'integration au syslog
auto_failback   off # Les services ne rebasculent pas automatiquement quand un noeud revient up
rtprio          5 # Assigne la priorité au service heartbeat
deadping        20 # Problème de noeud si il ne réponds pas au bout de 20 sec
 
autojoin        other # Autorise la connexions d'autres noeuds au cluster
node            deb-node1 # Mon premier noeud
node            deb-node2 # Mon second noeud
 
crm             on # On autorise les connexions via GUI
apiauth	mgmtd	uid=root
respawn	root	/usr/lib/heartbeat/mgmtd -v
 
respawn hacluster /usr/lib/heartbeat/ipfail # Lance une commande au boot du noeud
apiauth ipfail gid=haclient uid=root # On autorise root du group haclient

3.2 authkeys

Ce fichier sert à l'échange d'information entre les différents noeuds. Je peux choisir le sha1 comme algorithme de cryptage, suivit de ma passphrase :

#
#       Authentication file.  Must be mode 600
#
#
#       Must have exactly one auth directive at the front.
#       auth    send authentication using this method-id
#
#       Then, list the method and key that go with that method-id
#
#       Available methods: crc sha1, md5.  Crc doesn't need/want a key.
#
#       You normally only have one authentication method-id listed in this file
#
#       Put more than one to make a smooth transition when changing auth
#       methods and/or keys.
#
#
#       sha1 is believed to be the "best", md5 next best.
#
#       crc adds no security, except from packet corruption.
#               Use only on physically secure networks.
#
auth 1
1 sha1 This is my key !

On oublies pas de mettre les bons droits sur ce fichier :

chmod 0600 authkeys

3.3 Réplications et tests

Maintenant que nos fichiers sont prêts, nous allons les uploader sur les autres noeuds :

scp ha.cf autkeys deb-node2:/etc/ha.d/

Maintenant, il ne reste plus qu'a redémarrer les noeuds :

/etc/init.d/heartbeat restart
ssh root@deb-node2 /etc/init.d/heartbeat restart

Maintenant nous allons vérifier si tout fonctionne :

crm_mon -i 5

Le chiffre 5 correspond au nombre de secondes que le moniteur va essayer de regarder l'état du cluster. Si il essaye de se connecter continuellement et que vous n'avez rien de concluant, regardez vos logs :

$ tail /var/log/syslog
Jun 25 13:35:40 deb-node1 cib: [2739]: info: #========= Input message message start ==========#
Jun 25 13:35:40 deb-node1 cib: [2739]: info: MSG: Dumping message with 6 fields
Jun 25 13:35:40 deb-node1 cib: [2739]: info: MSG[0] : [t=cib]
Jun 25 13:35:40 deb-node1 cib: [2739]: info: MSG[1] : [cib_op=cib_query]
Jun 25 13:35:40 deb-node1 cib: [2739]: info: MSG[2] : [cib_callid=3]
Jun 25 13:35:40 deb-node1 cib: [2739]: info: MSG[3] : [cib_callopt=256]
Jun 25 13:35:40 deb-node1 cib: [2739]: info: MSG[4] : [cib_clientid=bc414c54-4630-456c-ad8a-6ab01b7e2152]
Jun 25 13:35:40 deb-node1 cib: [2739]: info: MSG[5] : [cib_clientname=2775]

Là nous rencontrons donc un problème qui apparait si heartbeat s'est lancé et a gardé en mémoire une ancienne configuration. Arrêtez donc tous les noeuds et supprimez le contenu du dossier /var/lib/heartbeat/crm :

/etc/init.d/heartbeat stop
rm /var/lib/heartbeat/crm/*
/etc/init.d/heartbeat start

Et maintenant nous allons regarder de nouveau l'état de notre cluster :

<nowiki>$ crm_mon -i5
 
Refresh in 5s...
============
Last updated: Tue Jun 26 06:58:38 2007
Current DC: deb-node2 (18ef92e2-cff0-469b-ab77-a2ef0e45ebd7)
2 Nodes configured.
0 Resources configured.</nowiki>

4 Configuration de services cluster

Le fichier qui va nous intéresser est /var/lib/heartbeat/crm/cib.xml (alias CIB).

4.1 crm_config

<nowiki>   <configuration>
     <crm_config>
       <cluster_property_set id="cib-bootstrap-options">
         <attributes>
           <nvpair name="default_resource_stickiness" id="options-default_resource_stickiness" value="0"/>
           <nvpair id="options-transition_idle_timeout" name="transition_idle_timeout" value="61s"/>
           <nvpair id="symmetric_cluster" name="symmetric_cluster" value="true"/>
           <nvpair id="no_quorum_policy" name="no_quorum_policy" value="stop"/>
           <nvpair id="default_resource_failure_stickiness" name="default_resource_failure_stickiness" value="0"/>
           <nvpair id="stonith_enabled" name="stonith_enabled" value="false"/>
           <nvpair id="stop_orphan_resources" name="stop_orphan_resources" value="true"/>
           <nvpair id="stop_orphan_actions" name="stop_orphan_actions" value="true"/>
           <nvpair id="remove_after_stop" name="remove_after_stop" value="true"/>
           <nvpair id="is_managed_default" name="is_managed_default" value="true"/>
           <nvpair id="short_resource_names" name="short_resource_names" value="true"/>
         </attributes>
       </cluster_property_set>
     </crm_config></nowiki>
  • default_resource_stickiness : vous préférez garder votre service le noeud actuel ou le bouger sur un qui a plus de ressources disponibles ? Cette option est équivalent à "auto_failback on" à l'exeption que les ressources peuvent bouger sur d'autres noeuds que celui sur lesquel elles étaitent activées.
    • 0 : Si la valeur est à 0, des ressources y seront automatiquement assignées.
    • > 0 : La ressource préfèrera retourner elle même à son noeud d'origine, mais elle peut également bouger si ce noeud n'est pas disponible. Une valeur plus forte renforcera la ressource à rester là où elle est actuellement.
    • < 0 : La ressource préfèrera bouger ailleur que là où elle est actuellement. Une valeur plus forte entrainera le déplacement de cette ressource.
    • INFINITY : La ressource retournera toujours à sa place initiale à moins qu'elle y soit forcée (noeud éteint, stand bye...). Cette option est équivalente à "auto_failback off" à l'exeption que les ressources peuvent bouger sur d'autres noeuds que celui sur lesquel elles étaitent activées.
    • -INFINITY : Les ressources iront automatiquement sur un autre noeud.
  • options-transition_idle_timeout (60s par défaut) : Si aucunes action n'a été détectée pendant ce temps, la transition est considérée comme échouée. Si chaque opérations initialisées à un timeout plus élevé, alors il sera prit en compte.
  • symmetric_cluster (true par défaut) : Spécifie que les ressources peuvent être lancées sur n'importe quel noeud. Sinon, il faudra créer des "constraints" spécifique pour chaque ressources.
  • no_quorum_policy (stop par défaut) :
    • ignore : Prétend que nous avons un quorum
    • freeze : ne démarre aucunes ressources non présentes dans notre partition. Les ressources dans notre partition peuvent être déplacer sur un autre noeud avec la partition (fencing désactivé).
    • stop : stop toutes les ressources activées dans notre partition (fencing désactivé)
  • default_resource_failure_stickiness : forcer une ressource à migrer après un échec.
  • stonith_enabled (false par défaut) : Les noeuds en échec seront fencés.
  • stop_orphan_resources (true par défaut) : Si une ressource est trouvée n'ayant pas de définition.
    • true : arrête l'action
    • false : ignore l'action

Cela affecte plus le comportement de CRM quand la ressource est supprimée par un admin sans qu'il l'ai arrêtée au préalable.

  • stop_orphan_actions (true par défaut) : Si une action récursive est trouvée et qu'il n'y a pas de définition :
    • true : arrête l'action
    • false : ignore l'action

Cela affecte plus le comportement de CRM quand l'intervalle pour une action récurente est modifiée.

  • remove_after_stop : Cela supprime la ressource de la section "status" du CIB.
  • is_managed_default (true par défaut) : A moins que la définition de la ressource dise autrement :
    • true : la ressource sera démarrée, arrêtée, monitorée et déplacée sir besoin.
    • false : la ressource ne sera pas démarrée si arrêtée, arrêtée si démarrée et non plus si elle a des action récurentes planifiées.
  • short_resource_names (false par défaut, true recommandé) : Cette option est pour avoir une compatibilitée avec les versions antérieures à 2.0.2

4.2 nodes

<nowiki>     <nodes>
       <node id="cdd9b426-ba04-4bcd-98a8-76f1d5a8ecb0" uname="deb-node3" type="normal"/>
       <node id="18ef92e2-cff0-469b-ab77-a2ef0e45ebd7" uname="deb-node2" type="normal"/>
       <node id="08f85a1b-291f-46a7-b2d8-cab46788e23d" uname="deb-node1" type="normal"/>
     </nodes></nowiki>

Ici nous allons donc définir nos neuds.

  • id : il est automatiquement généré au lancement de heartbeat et change en fonction de plusieurs critères.
  • uname : nom des noeuds.
  • type : normal, member ou ping.

Si vous ne savez pas quoi mettre car les id n'ont pas été encore générés, mettez ceci :

      <node/>

4.3 ressources

<nowiki> 26      <resources>
 27        <group id="group_1">
 28          <primitive class="ocf" id="IPaddr_192_168_0_90" provider="heartbeat" type="IPaddr">
 29            <operations>
 30              <op id="IPaddr_192_168_0_90_mon" interval="5s" name="monitor" timeout="5s"/>
 31            </operations>
 32            <instance_attributes id="IPaddr_192_168_0_90_inst_attr">
 33              <attributes>
 34                <nvpair id="IPaddr_192_168_0_90_attr_0" name="ip" value="192.168.0.90"/>
 35              </attributes>
 36            </instance_attributes>
 37            <instance_attributes id="IPaddr_192_168_0_90">
 38              <attributes>
 39                <nvpair id="IPaddr_192_168_0_90-apache2" name="apache2" value="started"/>
 40              </attributes>
 41            </instance_attributes>
 42          </primitive>
 43          <primitive class="lsb" provider="heartbeat" type="apache2" id="apache2_2">
 44            <operations>
 45              <op id="apache2_2_mon" interval="120s" name="monitor" timeout="60s"/>
 46            </operations>
 47            <instance_attributes id="apache2_2">
 48              <attributes>
 49                <nvpair id="apache2_2-deb-node2" name="deb-node2" value="started"/>
 50                <nvpair id="apache2_2-group_1" name="group_1" value="stopped"/>
 51                <nvpair name="target_role" id="apache2_2-target_role" value="started"/>
 52              </attributes>
 53            </instance_attributes>
 54          </primitive>
 55          <instance_attributes id="group_1">
 56            <attributes>
 57              <nvpair id="group_1-deb-node2" name="deb-node2" value="started"/>
 58              <nvpair id="group_1-apache2_2" name="apache2_2" value="stopped"/>
 59            </attributes>
 60          </instance_attributes>
 61        </group>
</nowiki>
  • L26 : Ici nous avons donc créer un groupe. Je vous le conseil fortement, pour éviter de faire des conneries. Le groupe s'appelle "group_1".
  • L27 : Ensuite nous lui insérons "IPaddr_192_168_0_90" comme nom pour la définition d'une adresse IP. Le type étant "IPaddr".
  • L29 : Nous lui insérons une opération de monitoring pour qu'il check toutes les 5 sec si tout se passe bien avec un timeout de 5 sec.
  • L34 : Au niveau des attributs, nous lui mettons l'adresse IP virtuelle que nous souhaitons utiliser.
  • L39 : On va lui définir une instance qui va permettre de faire fonctionner apache2 (non configuré encore) et l'adresse IP.
  • L43 : Maintenant on créer la primitive pour Apache2
  • L45 : On va monitorer apache2 toutes les 120s avec un timeout de 60s
  • L49 : Apache2 doit démarrer sur le noeud2 par défaut
  • L50 : On lui indique que group
  • L51 : L'état d'Apache2 doit être démarré par défaut

Le plus simple, pour éviter de se prendre la tête, c'est d'utilier le GUI heartbeat. Il vous fera la configuration :-)

4.4 constraints

<nowiki> 98      <constraints>
 99        <rsc_location id="rsc_location_group_1" rsc="group_1">
100          <rule id="prefered_location_group_1" score="100">
101            <expression attribute="#uname" id="prefered_location_group_1_expr" operation="eq" value="deb-node1"/>
102          </rule>
103        </rsc_location>
104        <rsc_location id="cli-prefer-apache2_2" rsc="apache2_2">
105          <rule id="cli-prefer-rule-apache2_2" score="INFINITY">
106            <expression id="cli-prefer-expr-apache2_2" attribute="#uname" operation="eq" value="deb-node2" type="string"/>
107          </rule>
108        </rsc_location>
109      </constraints>
110    </configuration>
111  </cib>
</nowiki>

Les contrataints servent à indiquer qui doit démarrer avant qui. A vous de voir selon vos besoins.

5 Management des Services Cluster

Pour commencer, je vous invite fortement à consulter cette page.

Pour lister les services, voici la commande :

crm_resource -L

5.1 Préparation d'un service cluster

Avant de continuer, assurez-vous que les fichiers de configuration des deux serveurs sont identiques, et que les services sont arrêtés (ici apache2):

/etc/init.d/apache2 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 apache2 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.

5.2 Basculer un service sur un autre noeud

Pour basculer par exemple notre service apache2 (apache2_2) sur le deuxième noeud (deb-node2) :

crm_resource -M -r apache2_2 -H deb-node2

Si vous voulez basculer un service d'un noeud sur lui même, vous aurez l'erreur suivante :

Error performing operation: apache2_2 is already active on deb-node2

5.3 Démarrer un service

Pour démarrer un service cluster c'est assez simple. Ici nous voulons démarrer apache2 (apache2_2)

crm_resource -r apache2_2 -p target_role -v started

Si jamais vous souhaitez faire démarrer apache2 sur le deuxième noeud, vous devez d'abord le réalouer avant de le démarrer (documentation ici). Ex :

crm_resource -M -r apache2_2 -H deb-node2
crm_resource -r apache2_2 -p target_role -v started

Ceci va donc basculer apache2_2 qui tournait (donc actuellement arrêté) sur le deuxième noeud, mais ça ne va pas le démarrer pour autant. Il faudra donc lancer la deuxième ligne pour le démarrer.

5.4 Ajout d'un noeud supplémentaire

Alors voilà, il existe plusieurs solutions. Je vous donne celle qui à mon sens me semble la meilleure. Dans le fichier /etc/ha.d/ha.cf vérifiez ceci (sinon il faudra reloader la conf de votre heartbeat, ce qui entrainera une petite coupure) :

autojoin        other # Autorise la connexions d'autres noeuds au cluster

Ceci va donc autoriser des noeuds qui ne sont pas entrés dans le fichier ha.cf à se connecter.

Pour celà, un minimum de sécurité est obligatoire, c'est pour ca qu'il faut quand même copier les fichier ha.cf et authkeys sur deb-node3 (mon nouveau noeud).
Note : Editez d'abord le fichier ha.cf pour le rajouter le nouveau noeud. Ce qui pourra vous permettre au prochain démarrage d'avoir ce noeud en dur :

autojoin        other # Autorise la connexions d'autres noeuds au cluster
node            deb-node1 # Mon premier noeud
node            deb-node2 # Mon second noeud
node            deb-node3 # Mon 3eme noeud

Maintenant on envoie tout ça sur le nouveau noeud et on oublies pas de lui mettre les bons droits :

cd /etc/ha.d/
scp ha.cf authkeys deb-node3:/etc/ha.d/
ssh deb-node3 chown hacluster:haclient /var/lib/heartbeat/crm/*

Et maintenant le 3ème noeud rejoint le cluster :

$ /etc/init.d/heartbeat restart
$ crm_mon -i5
Node: deb-node2 (18ef92e2-cff0-469b-ab77-a2ef0e45ebd7): online
Node: deb-node1 (08f85a1b-291f-46a7-b2d8-cab46788e23d): online
Node: deb-node3 (cdd9b426-ba04-4bcd-98a8-76f1d5a8ecb0): online

Et voilà, c'est intégré et sans coupures :-)

En cas de création d'une nouvelle machine par "rsync" d'une machine du cluster, il faut impérativement supprimer les fichiers suivants sur la nouvelle machine :

rm /var/lib/heartbeat/hb_uuid

6 FAQ

FAQ Clusterlab (Excellent site)

7 Ressources

Documentation sur la mise en place d'Heartbeat 2
Documentation on Setting up a Web Server with Apache, LVS and Heartbeat 2
Documentation on Heartbeat2 Xen cluster with drbd8 and OCFS2
Enable high availability for composite applications
http://en.wikipedia.org/wiki/High_availability