Installation et Configuration de Red Hat Cluster Suite

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
Red Hat Cluster Suite

Software version 5/6
Operating System RHEL 5/6
Website Red Hat Website
Last Update 14/05/2012
Others

1 Introduction

Red Hat propose un cluster qui s’appuie sur des solutions Open Source. Nous allons voir ici comment en mettre un en place.

Voici dans un premier temps le type d'infrastructure que vous devez avoir en place pour pouvoir installer et configurer un cluster :

Cluster archi rhel.png

Red Hat cluster suite fonctionne avec un nombre maximum de 16 nodes dans un cluster.

Voici la liste des services que nous allons aborder avec leur description :

Service Description
ccsd Service de configuration du cluster
aisexec Framework bas niveau pour le managment du cluster (OpenAIS) pour Red Hat 5
corosync Framework bas niveau pour le managment du cluster (Corosync) pour Red Hat 6
cman Cluster manager
fenced C'est le fencing qui va permettre de redémarrer une machine à distance
DLM Système de lock
clvmd LVM version cluster
rgmanager Ressources Groups Manager
GFS2 filesystem cluster
ricci Service de gestion à distance du cluster
lucci Frontend web se connectant à ricci pour la prise en main à distance du cluster

Sur Red Hat 5 et Red Hat 6, vous l'aurez compris, ce n'est pas le même Framework qui est utilisé, mais c'est transparent pour nous.

2 Prérequis

  • Il faut des interfaces dédiées pour le cluster.
  • Il faut que les switchs soient capable de faire du multicasting sur les interfaces privées.
  • Faites du bonding sur vos cartes réseaux.
  • Mettez autant de redondance que possible.

2.1 ACPI

Il faut tout d'abord arrêter l'ACPI pour éviter tout problèmes :

Command
chkconfig acpid off
service acpid stop

ou dans grub, ajoutez le paramètre acpi à off :

Configuration File /boot/grub/grub.conf
title Red Hat Enterprise Linux (2.6.32-220.el6.x86_64)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/myvg-rootvol rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=fr LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=myvg/rootvol rd_NO_DM acpi=off	initrd /initramfs-2.6.32-220.el6.x86_64.img

Au choix, faites ce qui vous parait le plus simple.

2.2 Hostname

Il est obligatoire que le hostname soit correctement configuré sur tous les noeuds :

Command hostname
> hostname
node1.deimos.fr

Si ce n'est pas le cas, modifiez la ligne du fichier suivant :

Configuration File /etc/sysconfig/network
HOSTNAME=node1.deimos.fr

De même, vérifiez que tous les noeuds sont joignables par leurs DNS, ou bien renseignez les en le fichier hosts :

Configuration File /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 
# Private interfaces
10.102.2.72     node1
10.102.2.73     node2
10.102.2.74     node3
 
# Public interfaces
192.168.0.1     server1
192.168.0.2     server2
192.168.0.3     server3

Les interfaces privées seront utilisées (node1, node2 et node3) pour la partie heartbeat et donc dédiée cluster. Les interfaces publiques doivent être utilisées pour le reste (connexions directe, VIP...). Donc lorsque vous configurez votre cluster, utilisez les interfaces privées pour sa création.

2.3 Bonding

IMPORTANT : Le bonding des interfaces privées (heartbeat cluster) ne peut être configuré qu'en mode 1 ! Seul ce mode est accepté.

Si vous êtes sur RHEL 6, dans le fichier /etc/modprobe.d/bonding.conf, on créer la ligne suivante :

Configuration File /etc/modprobe.d/bonding.conf
alias bond0 bonding

Si vous êtes sur RHEL <6, ce sera dans le fichier /etc/modprobes.conf qu'il faudra insérer ce même contenu.

Dans /etc/sysconfig/network-script/, créer le fichier ifcfg-bond0 pour y inscrire la configuration du bonding :

Configuration File /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
IPADDR=192.168.0.104
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
ONBOOT=yes
BOOTPROTO=static
BONDING_OPTS="mode 1"

Puis nous allons passer sur nos interfaces réseaux pour leurs dire qu'elles vont être utilisées pour faire du bonding :

Configuration File /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
MASTER=bond0
ONBOOT=yes
SLAVE=yes
BOOTPROTO=static

Faites pareil pour l'interface 1 :

Configuration File /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
MASTER=bond0
ONBOOT=yes
SLAVE=yes
BOOTPROTO=static

2.4 Multipathing

Généralement, vous allez utiliser une baie de disques pour que les données puissent être accessibles depuis n'importe quelle machine. Pour celà, il va falloir utiliser du multipathing. Suivez cette documentation pour le mettre en place.

2.5 Firewall

Dans le cas ou vous utilisez un firewall pour la partie interconnection de vos noeuds, voici la liste des ports :

Service name Port/Protocol
cman 5404/udp, 5405/udp
ricci 11111/tcp
gnbd 14567/tcp
modclusterd 16851/tcp
dlm 21064/tcp
ccsd 50006/tcp, 50007/udp, 50008/tcp, 50009/tcp

Note : il est fortement déconseillé d'avoir un firewall software sur cette partie là et fortement conseillé d'avoir un switch dédié !

3 Installation

3.1 Cluster

Sur tous vos noeuds, installez cman et toutes vos dépendances s'installeront d'un coup :

Command yum
yum install cman ricci openais cman ccs rgmanager lvm2-cluster gfs2-utils

N'installez que ce dont vous avez besoin évidemment, vous n'avez peut être pas besoin de gfs par exemple.

Ensuite, mettez un mot de passe à ricci pour pouvoir nous y connecter plus tard :

Command
passwd ricci

Puis nous allons mettre en persistant les services nécessaires au bon fonctionnement du cluster :

Command
chkconfig cman on
chkconfig ricci on
chkconfig clvmd on
chkconfig gfs2 on
chkconfig rgmanager on
service cman start
service ricci start
service clvmd start
service gfs2 start
service rgmanager start

3.2 Luci

Côté client, utilisez de préférence une machine dédiée, il faudra installer luci :

Command
yum install luci
chkconfig luci on

L'idée est d'installer cette interface sur une machine déportée pour l'administration de notre cluster.

3.3 Clvmd

Clvmd est le service permettant d'avoir du LVM en cluster et donc d'avoir des noms de volumes identiques sur tous vos noeuds.

Un quorum doit absolument être présent si l'on veut du Clvm. Pour activer cluster LVM, voici la commande à exécuter sur tous les noeuds :

Command lvmconf
lvmconf --enable-cluster

Sinon, éditez le fichier de configuration lvm pour modifier cette ligne :

Configuration File /etc/lvm/lvm.conf
...
#locking_type = 1
locking_type = 3
...

Vous aurez peut être à regarder le paramètre "prefered_names" si vous utilisez du multipathing. Attention aux WWN, si vous les utilisez, vous devez paramétrer correctement ceci :

Configuration File /etc/lvm/lvm.conf
...
    # If several entries in the scanned directories correspond to the
    # same block device and the tools need to display a name for device,
    # all the pathnames are matched against each item in the following
    # list of regular expressions in turn and the first match is used.
    # preferred_names = [ ]
 
    # Try to avoid using undescriptive /dev/dm-N names, if present.
    preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ]
...

Puis redémarrez et mettez le service en persitance :

Command clvmd
chkconfig clvmd on
service clvmd restart

Ensuite vous pouvez créer des volumes LVM comme d'habitude. Si vous n'êtes pas très habitué à LVM, regardez cette documentation.

Vous pouvez vérifier le status de cette manière :

Command service
> service clvmd status
clvmd (pid  16802) is running...
Clustered Volume Groups: (none)
Active clustered Logical Volumes: (none)

Nous allons rapidement créer un volume sur un node et vous pourrez vérifier qu'il s'affiche partout. Dans cet exemple, le multipath n'est pas utilisé. Nous allons donc créer une partition et lui mettre un tag de type LVM. Sur tous les nodes, rafraichissez la table des partitions sur le disque ou la nouvelle partition vient d'être créer :

Command partprobe
partprobe /dev/sdb

Une fois fait, vérifiez sur tous vos noeuds :

Command fdisk
> fdisk -cul /dev/sdb
Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sdb1            2048     8386181     4192067   8e  Linux LVM

Maintenant, nous allons créer le volume :

Command
> pvcreate /dev/sdb1
  Writing physical volume data to disk "/dev/sdb1"
  Physical volume "/dev/sdb1" successfully created
> vgcreate shared_vg /dev/sdb1 
  Clustered volume group "shared_vg" successfully created
> lvcreate -n shared_lv1 -L 256M shared_vg
> mkfs.ext4 /dev/shared_vg/shared_lv1

Notre volume est maintenant disponible sur tous les nodes. Attention : ceci ne veut pas dire que vous allez pouvoir écrire simultanément dessus. Pour faire ce genre d'opérations, il va falloir utiliser GFS2.

3.4 GFS2

Dans le cas ou vous avez besoin d'avoir un filesystem partagé à travers tous les noeuds, il vous faudra installer et utiliser GFS2.

4 Configuration

4.1 Quorum

Le Quorum est un élément important dans la conception d'un cluster de Haute Diponibilité. Il est obligatoire sur un cluster à noeud et facultatif au delà. Il doit être un élément commun aux noeuds (une partition d'une baie de disques par exemple) et celui ci est utilisé pour y déposer des locks afin de garantir le bon état générale du cluster.

Pour éviter les situation de split brain, il faut que le poid soit au moins la moitié des noeuds + 1.

(expected_votes / 2) + 1

Par défaut 1 noeud a un poid de 1. L'"Expected votes" est le nombre de poid nécessaire pour que le cluster fonctionne normalement.
On va jouer avec ce genre de choses quand il y a des dépendances d'applications vis à vis d'autres applications ne se trouvant pas sur les mêmes machines. Pour éviter d'avoir des problèmes, on augmentera le poid des noeuds des machines.

4.1.1 Expected votes

Pour regarder le nombre de votes obligatoire pour que le cluster fonctionne correctement :

Command cman_tool
> cman_tool status | grep Expected
Expected votes: 2

Pour changer la valeur expected votes pour une opération de maintenance par exemple :

Command cman_tool
cman_tool -e 2

Pour voir le poid sur chaque noeuds :

Command ccs_tool
ccs_tool lsnode

Pour modifier le poid sur un noeud donné :

Command cman_tool
cman_tool votes -v <votes>

4.1.2 Qdisk

Le Quorum disk (qdisk) est nécessaire uniquement sur un cluster à 2 noeuds. Au delà, ce n'est pas nécessaire et surtout n'est pas recommandé !
Qdisk est utilisé par cman et ccsd et doit être une partition/LUN, et en aucuns cas un volume logique.

4.1.2.1 Configuration

Pour une bonne configuration, je vous invite à regarder ces liens :

Il vous faut configurer correctement le heartbeat, les heuristics et configurer le quorum avec les bonnes options.

4.1.2.2 Créer le qdisk

Pour créer le quorum, vous devez avoir une partition unique et visible sur tous les noeuds :

Command ccs_tool
> mkqdisk -c /dev/sda2 -l label
mkqdisk v0.6.0
Writing new quorum disk label 'qdisk' to /dev/sda2.
WARNING: About to destroy all data on /dev/sda2; proceed [N/y] ? y
Initializing status block for node 1...
Initializing status block for node 2...
Initializing status block for node 3...
Initializing status block for node 4...
Initializing status block for node 5...
Initializing status block for node 6...
Initializing status block for node 7...
Initializing status block for node 8...
Initializing status block for node 9...
Initializing status block for node 10...
Initializing status block for node 11...
Initializing status block for node 12...
Initializing status block for node 13...
Initializing status block for node 14...
Initializing status block for node 15...
Initializing status block for node 16...

  • -c : la partition correstpondant au quorum
  • -l : le label créer pendant le fdisk

Pour lister les quorum actifs :

Command ccs_tool
> mkqdisk -L
mkqdisk v0.6.0
/dev/disk/by-id/scsi-S_beaf11-part2:
/dev/disk/by-path/ip-172.17.101.254:3260-iscsi-iqn.2009-10.com.example.cluster1:iscsi-lun-1-part2:
/dev/sda2:
        Magic:                eb7a62c2
        Label:                qdisk
        Created:              Wed Feb 29 16:27:13 2012
        Host:                 node1.deimos.fr
        Kernel Sector Size:   512
        Recorded Sector Size: 512

On va démarrer le service et le mettre en persistant :

Command chkconfig
chkconfig qdiskd on
service qdiskd start

Puis il va falloir redémarrer le cluster pour que le quorum soit pris en compte.

4.1.3 cman

On peut paramétrer CMAN lorsqu'on a un cluster à 2 noeuds pour qu'il n'utilise pas le quorum :

Configuration File /etc/cluster/cluster.conf
<cman expected_votes="1" two_node="1" />

Il y aura donc une course au fencing, à celui qui fera rebooter l'autre le premier. Tout cela pouer éviter les splitbrains.

4.2 Fencing

Le fencing est obligatoire, car un noeud problématique peut faire de la corruption de données sur les partitions montés. Il est donc préférable que les autres noeuds fencent (oui le verbe ;-)), le noeud qui peut poser problèmes.
Pour celà il va y avoir un démon fenced gérer par cman. Les agents fenced sont stockés dans /sbin/fence_*.

On peut tester notre configuration de fencing :

Command fence_node
fence_node node2.deimos.fr

Il lit donc la configuration avec ccs et utilise le bon agent pour fencer le noeud en question.

Il existe 2 méthodes de fencing :

  • STONITH (Shoot The Other Node In The Head) : pour faire l'équivalent d'une coupure électrique
  • Fabric : au niveau d'un switch ou d'un équipement type baie de disques

4.2.1 Stonith

Voici un exemple avec une ILO d'HP, pour fencer une machine :

Command fence_scsi_test
/sbin/fence_ilo -a <ip> -l <login> -p <password> -v -o reboot

4.2.2 Fabric

Pour le scsi, il y a un service "scsi_reserve" qui permet de générer une clef unique et de créer des enregistrements pour chaque machines. N'importe quel noeud peut donc supprimer l'enregistrement qui a été fait pour empêcher une machine problématique de pouvoir continuer à écrire sur les périphériques scsi.

On peut voir s'il est possible de le faire ou non (ici non car j'utilise du iscsi qui ne le supporte pas) :

Command fence_scsi_test
fence_scsi_test -c
 
Testing devices in cluster volumes...
DEBUG: pv_name = /dev/sda1
 
Attempted to register with devices:
-------------------------------------
        /dev/sda1       Failure-------------------------------------
Number of devices tested: 1
Number of devices passed: 0
Number of devices failed: 1


4.2.3 Fencing sur machines virtuelles

Dans le cas ou votre fencing ne se fait pas via des RAC (Remote Access Card), et que vous utilisez par exemple du Xen ou du KVM, il faudra alors avoir recours à un fencing software en appelant directement l'hyperviseur à shooter un noeud. Nous allons donc voir ici comment procéder.

On installe cman sur la machine host si vos noeuds cluster sont sur une machine virtuelle :

Command yum
yum install cman

Et on copie le contenu d'un de mes noeuds /etc/cluster/* sur ma machine luci :

Command scp
scp node1.deimos.fr:/etc/cluster/fence_xvm.key /etc/cluster/

Dans le cas ou cette clef n'existe pas, vous avez moyen de la recréer de cette façon :

Command scp
dd if=/dev/urandom of=/etc/cluster/fence-xvm.key bs=4k count=1

Puis copiez là comme expliqué plus haut.

On a ensuite "Shared fence devices" qui apparait dans l'interface. Maintenant, on clique sur add et on choisis le virtuel :

Puis on configure la "Main Fencing Method" pour chaque noeud (dans domain).

Failover domains permet de mettre un groupe de machines à une application donnée pour qu'une application ne puisse démarrer que sur un de ses groupes de machines.

Si vous utilisez Xen et souhaitez pouvoir rebooter une VM, il va falloir ajouter ceci :

Configuration File /etc/rc.local
/sbin/fence_xvmd -L -I <cluster_interface>

  • -L : écoute sur le réseau et les noeuds, mais n'est pas membre des clusters
  • -I <cluster_interface> : mettez le nom de l'interface réseau correspondant au cluster

4.3 Failover domains

Permet de créer des groupes de noeuds sur lesquels des services seront autorisés à basculer.

4.4 Exemple de fichier de configuration

Configuration File /etc/cluster/cluster.conf
<?xml version="1.0"?>
<cluster alias="cluster1" config_version="16" name="cluster1">
        <fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
        <clusternodes>
                <clusternode name="node2.deimos.fr" nodeid="1" votes="1">
                        <fence>
                                <method name="1">
                                        <device domain="xm destroy node1.cluster2.example.com" name="xenfence1"/>
                                </method>
                        </fence>
                </clusternode>
                <clusternode name="node1.deimos.fr" nodeid="2" votes="1">
                        <fence>
                                <method name="1">
                                        <device domain="xm destroy node1.deimos.fr" name="xenfence1"/>
                                </method>
                        </fence>
                </clusternode>
        </clusternodes>
        <cman expected_votes="1" two_node="1"/>
        <fencedevices>
                <fencedevice agent="fence_xvm" name="xenfence1"/>
        </fencedevices>
        <rm>
                <failoverdomains>
                        <failoverdomain name="prefer_node1" nofailback="0" ordered="1" restricted="1">
                                <failoverdomainnode name="node2.deimos.fr" priority="2"/>
                                <failoverdomainnode name="node1.deimos.fr" priority="1"/>
                        </failoverdomain>
                </failoverdomains>
                <resources>
                        <ip address="172.16.50.16" monitor_link="1"/>
                        <apache config_file="conf/httpd.conf" name="httpd" server_root="/etc/httpd" shutdown_wait="5"/>
                        <clusterfs device="/dev/mapper/gfslv-webfs" force_unmount="0" fsid="45506" fstype="gfs2" mountpoint="/var/www/html" name="gfs_www" self_fence="0"/>
                </resources>
                <service autostart="0" domain="prefer_node1" exclusive="0" name="webby" recovery="relocate">
                        <ip ref="172.16.50.16"/>
                        <clusterfs ref="gfs_www">
                                <apache ref="httpd"/>
                        </clusterfs>
                </service>
        </rm>
</cluster>

4.5 Mettre à jour manuellement la configuration

Vous pouvez toucher manuellement à la configuration du cluster :

CLUSTER
   |__CMAN or GULM (RHEL4 only)
   |             |__LOCKSERVER (Only for GULM; 1,3,4 or 5 only)
   |
   |__FENCE_XVMD (RHEL5 option, used when hosting a virtual cluster)
   |
   |__CLUSTERNODES
   |         |_____CLUSTERNODE+
   |                     |______FENCE
   |                               |__METHOD+
   |                                      |___DEVICE+
   |
   |__FENCEDEVICES
   |        |______FENCEDEVICE+
   |
   |__RM (Resource Manager Block)
   |   |__FAILOVERDOMAINS
   |   |          |_______FAILOVERDOMAIN*
   |   |                         |________FAILOVERDOMAINNODE*
   |   |__RESOURCES
   |   |      |_____(See Resource List Below)
   |   |__SERVICE*
   |
   |__FENCE_DAEMON

Puis une fois que vous êtes satisfait, changez la valeur de la version + 1 :

Configuration File /etc/cluster/cluster.conf
<cluster alias="cluster1" config_version="16" name="cluster1">

Puis updatez cette configuration sur tous les noeuds :

  • Sous RHEL 5, mettez vous sur le noeud en question, puis :
Command ccs_tool
ccs_tool update /etc/cluster/cluster.conf

  • Sous RHEL 6 :
Command ccs
ccs -h <host> -p <password> --sync --activate

  • host : le noeud sur lequel l'action doit être faite
  • password : le mot de passe de ricci
  • --sync : synchroniser le fichier de configuration sur tous les neuds
  • --activate : activer la nouvelle configuration

4.6 cman

Voir l'état du cluster :

Command cman_tool
> cman_tool status
Version: 6.2.0
Config Version: 14
Cluster Name: cluster1
Cluster Id: 26777
Cluster Member: Yes
Cluster Generation: 12
Membership state: Cluster-Member
Nodes: 3
Expected votes: 3
Total votes: 3
Quorum: 2  
Active subsystems: 9
Flags: Dirty 
Ports Bound: 0 11 177  
Node name: node1.deimos.fr
Node ID: 2
Multicast addresses: 239.192.104.2 
Node addresses: 10.0.0.1

Voir l'état des nodes :

Command cman_tool
cman_tool nodes

Voir l'état des services :

Command cman_tool
cman_tool services

Enregistrer un noeud dans le cluster :

Command cman_tool
cman_tool join

Pour sortir un noeud du cluster (aucuns services ne doit tourner sur ce noeud) :

Command cman_tool
cman_tool leave

On peut tester le fencing (reboot) sur une machine :

Command cman_tool
cman_tool kill -n node2.deimos.fr


4.7 Gestion des services cluster

Voici l'ordre d'allumage des services, donc si vous avez un problème, vérifiez ces services :

Command service
service cman start
service qdiskd start
service clvmd start
service gfs start
service rgmanager start
service ricci start

Et inversement pour l'extinction.

Voici un petit script qui permettra d'allumer que les services utiles en cas de boot non clusters ou problèmes :

Configuration File start_cluster.sh
#!/bin/sh
for i in cman qdiskd clvmd gfs rgmanager ricci ; do
   if [ $(chkconfig --list | grep $i | grep -c on) -ge 1 ]; then
      service $i start
   fi
done

Puis exécutez le.

4.8 Empêcher un noeud d'intégrer le cluster au reboot

Il est possible d'empêhcer un noeud de réintégrer un cluster comme ceci :

Command
for i in rgmanagers gfs clvmd qdiskq cman ; do
   chkconfig --level 2345 $i off
done

4.9 Extinction du cluster

Faites attention si vous utilisez du GFS, pour éteindre complètement son cluster, il faut baisser la valeur "quorum expected" pour ne pas avoir de problèmes lorsque l'on éteint petit à petit ses noeuds. Sinon vous ne pourrez pas du tout démonter votre GFS !!!

  • Solution 1 (conseillée) :

Par exemple, sur un cluster à 3 noeuds, votre quorum est à 3 par exemple, baissez votre quorum :

Command cman_tool
cman_tool expected 2

Couper un de vos noeuds, redescendez le quorum :

Command cman_tool
cman_tool expected 1

Puis vous pouvez tout démonter, puis éteindre vos noeuds.

  • Solution 2 (a éviter) :

Vous pouvez lancer la commande suivante qui va sortir chaque noeud du cluster et donc on pourra correctement les éteindre, mais il y a un risque de splitbrain :

Command cman_tool
cman_tool leave remove

5 Utilisation

5.1 Luci

5.1.1 Initialisation

Si vous êtes sur Red Hat 5, nous allons devoir créer le premier utilisateur pour Luci :

Command luci_admin
> luci_admin init
Initializing the luci server
 
 
Creating the 'admin' user
 
Enter password: 
Confirm password: 
 
Please wait...
The admin password has been successfully set.
Generating SSL certificates... 
The luci server has been successfully initialized
 
 
You must restart the luci server for changes to take effect.
 
Run "service luci restart" to do so

Puis démarrer le service :

Command luci_admin
service luci restart

Puis logger vous http://luci:8084

  • Utilisez admin avec le mot de passe que vous venez d rentrer via la commande luci_admin si vous êtes sur RHEL 5
  • Si vous êtes sur RHEL 6, utilisez tout simplement le login et mot de passe root

5.2 Création d'un cluster

Pour créer un cluster, mettez vous sur un des futurs noeuds et exécutez la commande suivante :

Command ccs
ccs -h <node1> --createcluster <cluster>

  • node1 : le nom du node sur lequel la configuration doit être créer (utilisez le nom de l'interface privée)
  • cluster : le nom du cluster (pas + de 15 caractères)
  • -f : vous pouvez spécifier le fichier de configuration si vous ne souhaitez pas que celui du cluster se fasse écraser

5.3 Ajouter des nodes

Pour ajouter des nodes dans un cluster :

Command ccs
ccs -h node1 --addnode node1
ccs -h node1 --addnode node2
ccs -h node1 --addnode node3

Ces lignes vont ajouter les nodes 1 à 3 à la configuration cluster sur node1.

Pour vérifier la liste des nodes :

Command ccs
> ccs -h node1 --lsnodes
node1: nodeid=1
node2: nodeid=2
node3: nodeid=3

5.4 Fencing

Il nous faut ajouter obligatoirement une méthode de fencing pour pouvoir shooter un node en cas de problème, afin qu'il réintègre le plus rapidement possible le cluster et qu'il ne fasse pas de corruption de données sur les disques.

Pour lister les méthodes de fencing disponible :

Command ccs
> ccs -h node1 --lsfenceopts
fence_rps10 - RPS10 Serial Switch
fence_vixel - No description available
fence_egenera - No description available
fence_xcat - No description available
fence_na - Node Assassin
fence_apc - Fence agent for APC over telnet/ssh
fence_apc_snmp - Fence agent for APC over SNMP
fence_bladecenter - Fence agent for IBM BladeCenter
fence_bladecenter_snmp - Fence agent for IBM BladeCenter over SNMP
fence_cisco_mds - Fence agent for Cisco MDS
fence_cisco_ucs - Fence agent for Cisco UCS
fence_drac5 - Fence agent for Dell DRAC CMC/5
fence_eps - Fence agent for ePowerSwitch
fence_ibmblade - Fence agent for IBM BladeCenter over SNMP
fence_ifmib - Fence agent for IF MIB
fence_ilo - Fence agent for HP iLO
fence_ilo_mp - Fence agent for HP iLO MP
fence_intelmodular - Fence agent for Intel Modular
fence_ipmilan - Fence agent for IPMI over LAN
fence_kdump - Fence agent for use with kdump
fence_rhevm - Fence agent for RHEV-M REST API
fence_rsa - Fence agent for IBM RSA
fence_sanbox2 - Fence agent for QLogic SANBox2 FC switches
fence_scsi - fence agent for SCSI-3 persistent reservations
fence_virsh - Fence agent for virsh
fence_virt - Fence agent for virtual machines
fence_vmware - Fence agent for VMWare
fence_vmware_soap - Fence agent for VMWare over SOAP API
fence_wti - Fence agent for WTI
fence_xvm - Fence agent for virtual machines

Pour lister les options possibles sur une méthode de fencing :

Command ccs
> ccs -h node1 --lsfenceopts fence_vmware_soap
 fence_vmware_soap - Fence agent for VMWare over SOAP API
  Required Options:
  Optional Options:
    option: No description available
    action: Fencing Action
    ipaddr: IP Address or Hostname
    login: Login Name
    passwd: Login password or passphrase
    passwd_script: Script to retrieve password
    ssl: SSL connection
    port: Physical plug number or name of virtual machine
    uuid: The UUID of the virtual machine to fence.
    ipport: TCP port to use for connection with device
    verbose: Verbose mode
    debug: Write debug information to given file
    version: Display version information and exit
    help: Display help and exit
    separator: Separator for CSV created by operation list
    power_timeout: Test X seconds for status change after ON/OFF
    shell_timeout: Wait X seconds for cmd prompt after issuing command
    login_timeout: Wait X seconds for cmd prompt after login
    power_wait: Wait X seconds after issuing ON/OFF
    delay: Wait X seconds before fencing is started
    retry_on: Count of attempts to retry power on

Voici comment ajouter une méthode de fencing pour Vmware :

Command ccs
ccs -h node1 --addfencedev <vmware_fence> agent=fence_vmware_soap ipaddr=<vcenter.deimos.fr> login=<login> password=<password>

  • vmware_fence : nom que l'ont veut donner au fencing

Pour Vmware, nous n'en avons besoin que d'un. Mais si vous avez des RAC, il faudra spécifier les informations pour chacune d'elles

Si vous souhaitez en supprimer un :

Command
ccs -h node1 --rmfencedev <vmware_fence>

5.4.1 Ajouter du fencing pour les noeuds

Au dessus, nous avons déclarer les méthodes de fencing. Maintenant, il va falloir les ajouter à chacun de nos noeuds :

Command ccs
ccs -h node1 --addmethod <vmware_fence> node1
ccs -h node1 --addfenceinst port=node1 ssl=on uuid=412921c1-c259-f9a4-0ee2-37cc047eb4ed
ccs -h node1 --addmethod <vmware_fence> node2
ccs -h node1 --addfenceinst port=node2 ssl=on uuid=422921c1-c259-f9a4-0ee2-37cc047eb4ed
ccs -h node1 --addmethod <vmware_fence> node3
ccs -h node1 --addfenceinst port=node3 ssl=on uuid=432921c1-c259-f9a4-0ee2-37cc047eb4ed

Note : Voilà une commande en powershell avec powercli pour récuperer les uuid des vms :

Command Get-VM
Get-VM <vm_name> | %{(Get-View $_.Id).config.uuid}

5.5 Créer un service

--> création d'un service type

Une fois notre service créer, il ne reste plus qu'à faire le clustat :

Command clustat
> clustat 
Cluster Status for cluster1 @ Tue Feb 29 13:50:09 2012
Member Status: Quorate
 
 Member Name                                                     ID   Status
 ------ ----                                                     ---- ------
 node2.deimos.fr                                                 1 Online, rgmanager
 node1.deimos.fr                                                 2 Online, Local, rgmanager
 
 Service Name                                                     Owner (Last)                                                     State         
 ------- ----                                                     ----- ------                                                     -----         
 service:apache                                                   node2.deimos.fr                                                  started

5.5.1 NFS

Pour faire du cluster sur nfs, c'est un peu spéciale, il faut :

  • Un système de fichier
  • NFS export : monnfs
  • NFS client :
    • Name : monnfs
    • Target : les ip autorisés à se connecter
    • Options : ro/rw

En tant que dépendances, voici à qui ça doit ressembler :

  • FS
    • NFS Export
      • NFS Client

5.6 rgmanager

Les scripts cluster (ressources types) disponibles sont au format OCF (Open Cluster Framework) et les scripts sont disponible dans /usr/share/cluster/.

Lorsque vous créez un service (Resource Group), vous pouvez créer plusieurs ressources et les associer ou créer des dépendances les unes envers les autres pour définir un ordre de démarrage. Vous pouvez récupérer les information prédéfinies par rapport aux ressources types dans /usr/share/cluster/service.sh

5.7 Gestion des services/RG

Activer un service :

Command clusvcadm
clusvcadm -e <service> -m <node>

Désactiver un service

Command clusvcadm
clusvcadm -d <service>

Relocaliser un service sur un autre noeud :

Command clusvcadm
clusvcadm -r <service> -m <node>

5.8 Resources Recovery

Par défaut il essaye de redémarrer le service sur le même noeud, mais il existe aussi :

  • relocate : il va essayer de le basculer sur un autre noeud
  • disable : ne tente aucune actions en cas de problèmes

5.8.1 Check Status

Le status doit être effectuer sur chaque ressources, qui est par défaut à 30 secondes. Il ne faut surtout pas descendre en dessous de 5s. Vous pouvez modifier toutes ses valeurs par défaut dans /usr/share/cluster/*.

Les lignes à modifier ressemblent à :

Configuration File /usr/share/cluster/script.sh
        <action name="status" interval="30s" timeout="0"/>
        <action name="monitor" interval="30s" timeout="0"/>

Vous pouvez changer l'interval de check et le timeout si vous en souhaitez un.

5.8.2 Custom scripts

Vous pouvez développer vos propre scripts, et ils doivent être obligatoirement capable de répondre à start, stop, restart et status. De plus il faut impérativement que les codes de retour soient gérés.

6 Monitoring

Vous pouvez monitorer de plusieurs façons :

  • Via la commande clustat
  • Via SNMP

6.1 Clustat

Cette commande permet de montrer l'état du cluster :

Command clustat
> clustat 
Cluster Status for cluster1 @ Thu Mar  1 09:45:21 2012
Member Status: Quorate
 
 Member Name                                                     ID   Status
 ------ ----                                                     ---- ------
 node2.deimos.fr                                                 1 Online, rgmanager
 node1.deimos.fr                                                 2 Online, Local, rgmanager
 node3.deimos.fr                                                 3 Online, rgmanager
 
 Service Name                                                     Owner (Last)                                                     State         
 ------- ----                                                     ----- ------                                                     -----         
 service:websrv                                                   (none)

Et vous pouvez faire un export en xml :

Command clustat
> clustat -x
 
<?xml version="1.0"?>
<clustat version="4.1.1">
  <cluster name="cluster1" id="26777" generation="188"/>
  <quorum quorate="1" groupmember="1"/>
  <nodes>
    <node name="node2.deimos.fr" state="1" local="0" estranged="0" rgmanager="1" rgmanager_master="0" qdisk="0" nodeid="0x00000001"/>
    <node name="node1.deimos.fr" state="1" local="1" estranged="0" rgmanager="1" rgmanager_master="0" qdisk="0" nodeid="0x00000002"/>
    <node name="node3.deimos.fr" state="1" local="0" estranged="0" rgmanager="1" rgmanager_master="0" qdisk="0" nodeid="0x00000003"/>
  </nodes>
  <groups>
    <group name="service:webby" state="119" state_str="disabled" flags="0" flags_str="" owner="none" last_owner="none" restarts="0" last_transition="0" last_transition_str="Thu Jan  1 01:00:00 1970"/>
  </groups>
</clustat>

Pour les états, voici les informations :

  • Started : le service est démarré
  • Pending : le service est en cours de démarrage
  • Disabled : le service est désactivé
  • Stopped : le service est temporairement arrêter
  • Failed : le service n'a pas pu démarrer correctement

6.2 SNMP

6.2.1 Installation

Vous pouvez interroger le cluster via SNMP. Il va falloir installer ceci sur les noeuds :

Command yum
yum install cluster-snmp net-snmp

6.2.2 Configuration

Vous pouvez lire le fichier /usr/share/doc/cluster-snmp-0.12.1/README.snmpd qui contient les 2 lignes de configuration pour le SNMP :

Configuration File /usr/share/doc/cluster-snmp-0.12.1/README.snmpd
...
######################################
## cluster monitoring configuration ##
######################################
 
dlmod RedHatCluster     /usr/lib/cluster-snmp/libClusterMonitorSnmp.so
view    systemview      included        REDHAT-CLUSTER-MIB:RedHatCluster
...

Et rajoutez les dans votre fichier de configuration snmp :

Configuration File /etc/snmp/snmpd.conf
dlmod RedHatCluster     /usr/lib/cluster-snmp/libClusterMonitorSnmp.so
view    systemview      included        REDHAT-CLUSTER-MIB:RedHatCluster

Redémarrer votre service snmpd. Maintenant nous allons pouvoir interroger le cluster (requiere net-snmp-utils pour le client) :

Command snmpwalk
> snmpwalk -v1 -c public localhost REDHAT-CLUSTER-MIB:RedHatCluster
REDHAT-CLUSTER-MIB::rhcMIBVersion.0 = INTEGER: 1
REDHAT-CLUSTER-MIB::rhcClusterName.0 = STRING: "cluster1"
REDHAT-CLUSTER-MIB::rhcClusterStatusCode.0 = INTEGER: 4
REDHAT-CLUSTER-MIB::rhcClusterStatusDesc.0 = STRING: "Some services not running"
REDHAT-CLUSTER-MIB::rhcClusterVotesNeededForQuorum.0 = INTEGER: 2
REDHAT-CLUSTER-MIB::rhcClusterVotes.0 = INTEGER: 3
REDHAT-CLUSTER-MIB::rhcClusterQuorate.0 = INTEGER: 1
REDHAT-CLUSTER-MIB::rhcClusterNodesNum.0 = INTEGER: 3
REDHAT-CLUSTER-MIB::rhcClusterNodesNames.0 = STRING: "node1.deimos.fr, node2.deimos.fr, node3.deimos.fr"
REDHAT-CLUSTER-MIB::rhcClusterAvailNodesNum.0 = INTEGER: 3
REDHAT-CLUSTER-MIB::rhcClusterAvailNodesNames.0 = STRING: "node1.deimos.fr, node2.deimos.fr, node3.deimos.fr"
REDHAT-CLUSTER-MIB::rhcClusterUnavailNodesNum.0 = INTEGER: 0
REDHAT-CLUSTER-MIB::rhcClusterUnavailNodesNames.0 = ""
REDHAT-CLUSTER-MIB::rhcClusterServicesNum.0 = INTEGER: 1
REDHAT-CLUSTER-MIB::rhcClusterServicesNames.0 = STRING: "webby"
REDHAT-CLUSTER-MIB::rhcClusterRunningServicesNum.0 = INTEGER: 0
REDHAT-CLUSTER-MIB::rhcClusterRunningServicesNames.0 = ""
REDHAT-CLUSTER-MIB::rhcClusterStoppedServicesNum.0 = INTEGER: 1
REDHAT-CLUSTER-MIB::rhcClusterStoppedServicesNames.0 = STRING: "webby"
REDHAT-CLUSTER-MIB::rhcClusterFailedServicesNum.0 = INTEGER: 0
REDHAT-CLUSTER-MIB::rhcClusterFailedServicesNames.0 = ""
REDHAT-CLUSTER-MIB::rhcNodeName."node1.deimos.fr" = STRING: "node1.deimos.fr"
REDHAT-CLUSTER-MIB::rhcNodeName."node2.deimos.fr" = STRING: "node2.deimos.fr"
REDHAT-CLUSTER-MIB::rhcNodeName."node3.deimos.fr" = STRING: "node3.deimos.fr"
REDHAT-CLUSTER-MIB::rhcNodeStatusCode."node1.deimos.fr" = INTEGER: 0
REDHAT-CLUSTER-MIB::rhcNodeStatusCode."node2.deimos.fr" = INTEGER: 0
REDHAT-CLUSTER-MIB::rhcNodeStatusCode."node3.deimos.fr" = INTEGER: 0
REDHAT-CLUSTER-MIB::rhcNodeStatusDesc."node1.deimos.fr" = STRING: "Participating in cluster"
REDHAT-CLUSTER-MIB::rhcNodeStatusDesc."node2.deimos.fr" = STRING: "Participating in cluster"
REDHAT-CLUSTER-MIB::rhcNodeStatusDesc."node3.deimos.fr" = STRING: "Participating in cluster"
REDHAT-CLUSTER-MIB::rhcNodeRunningServicesNum."node1.deimos.fr" = INTEGER: 0
REDHAT-CLUSTER-MIB::rhcNodeRunningServicesNum."node2.deimos.fr" = INTEGER: 0
REDHAT-CLUSTER-MIB::rhcNodeRunningServicesNum."node3.deimos.fr" = INTEGER: 0
REDHAT-CLUSTER-MIB::rhcNodeRunningServicesNames."node1.deimos.fr" = ""
REDHAT-CLUSTER-MIB::rhcNodeRunningServicesNames."node2.deimos.fr" = ""
REDHAT-CLUSTER-MIB::rhcNodeRunningServicesNames."node3.deimos.fr" = ""
REDHAT-CLUSTER-MIB::rhcServiceName."webby" = STRING: "webby"
REDHAT-CLUSTER-MIB::rhcServiceStatusCode."webby" = INTEGER: 1
REDHAT-CLUSTER-MIB::rhcServiceStatusDesc."webby" = STRING: "stopped"
REDHAT-CLUSTER-MIB::rhcServiceStartMode."webby" = STRING: "manual"
REDHAT-CLUSTER-MIB::rhcServiceRunningOnNode."webby" = ""
End of MIB

Pour obtenir la hiérarchie SNMP cluster :

Command snmptranslate
> snmptranslate -Os -Tp REDHAT-CLUSTER-MIB:RedHatCluster
+--RedHatCluster(8)
   |
   +--rhcMIBInfo(1)
   |  |
   |  +-- -R-- Integer32 rhcMIBVersion(1)
   |
   +--rhcCluster(2)
   |  |
   |  +-- -R-- String    rhcClusterName(1)
   |  +-- -R-- Integer32 rhcClusterStatusCode(2)
   |  +-- -R-- String    rhcClusterStatusDesc(3)
   |  +-- -R-- Integer32 rhcClusterVotesNeededForQuorum(4)
   |  +-- -R-- Integer32 rhcClusterVotes(5)
   |  +-- -R-- Integer32 rhcClusterQuorate(6)
   |  +-- -R-- Integer32 rhcClusterNodesNum(7)
   |  +-- -R-- String    rhcClusterNodesNames(8)
   |  +-- -R-- Integer32 rhcClusterAvailNodesNum(9)
   |  +-- -R-- String    rhcClusterAvailNodesNames(10)
   |  +-- -R-- Integer32 rhcClusterUnavailNodesNum(11)
   |  +-- -R-- String    rhcClusterUnavailNodesNames(12)
   |  +-- -R-- Integer32 rhcClusterServicesNum(13)
   |  +-- -R-- String    rhcClusterServicesNames(14)
   |  +-- -R-- Integer32 rhcClusterRunningServicesNum(15)
   |  +-- -R-- String    rhcClusterRunningServicesNames(16)
   |  +-- -R-- Integer32 rhcClusterStoppedServicesNum(17)
...

7 FAQ

7.1 Logs

Les logs se trouvent dans /var/log/messages, et le niveau de verbosité peut être ajusté dans /etc/cluster/cluster.conf.

Vous pouvez tester ensuite votre niveau de logs cluster comme ceci :

Command cman_tool
clulog -s warning "test"

7.2 Erreurs fréquentes

Voici une liste des erreurs les plus fréquentes :

  • Les scripts customs mal écrits, qui ne retournent pas les bonnes valeurs
  • Est-ce que le service n'est pas statué trop souvent ?
  • Est-ce que les ressources démarrent dans le bon ordre ?

7.3 Starting cman... Can't determine address family of nodename

Si vous avez ce genre de message au démarrage de cman :

Command service
> service cman startStarting cluster: 
   Checking if cluster has been disabled at boot...        [  OK  ]
   Checking Network Manager...                             [  OK  ]
   Global setup...                                         [  OK  ]
   Loading kernel modules...                               [  OK  ]
   Mounting configfs...                                    [  OK  ]
   Starting cman... Can't determine address family of nodename
Unable to get the configuration
Can't determine address family of nodename
cman_tool: corosync daemon didn't start Check cluster logs for details

Vérifiez que vous avez bien les hostnames configurés et que tous les noeuds peuvent communiquer entre eux.

7.4 Error locking on node

Vous pouvez tomber sur ce genre de problèmes si votre volume physique n'est pas détecté sur tous les noeuds.

Command lvcreate
> lvcreate -n shared_lv1 -L 256M shared_vg
  Error locking on node node3: Volume group for uuid not found: EfDxVCE2XWh2Se7ohirVFpXyjXSEJqZxigQMWiiUXNjRXeWd2SzLHwZv3bFropf1  Error locking on node node1: Volume group for uuid not found: EfDxVCE2XWh2Se7ohirVFpXyjXSEJqZxigQMWiiUXNjRXeWd2SzLHwZv3bFropf1  Failed to activate new LV.

Pour corriger le problème, faites un partprobe sur les disques contenant la nouvelle partition.

7.5 Cluster is not quorate. Refusing connection

Il faut vérifier que tous les services clusters sont correctement démarrer. On peut vérifier l'état du cluster comme ceci :

Command clusvcadm
> clustat 
Cluster Status for cluster1 @ Wed Feb 29 14:16:31 2012
Member Status: Quorate

Et là il est quorate, donc pas de soucis :-)

8 Ressources

http://sources.redhat.com/cluster/doc/cluster_schema.html
https://alteeve.com/w/RHCS_v2_cluster.conf
http://magazine.redhat.com/2007/12/19/enhancing-cluster-quorum-with-qdisk/
https://access.redhat.com/knowledge/node/2881
RHEL Cluster Archi Visio