vendredi 18 mai 2012

Linux clusterware en mode actif/passif



Cet article décrit les étapes de mise en place d'une solution de cluster à moindre coût. Pour ce faire je vais utiliser le clusterware linux (aka pacemaker), puis déclarer une ressouce Apache pour effectuer les tests fonctionnel de mon cluster.
Mon laboratoire se compose de;
Deux serveurs RHEL 6
Une vip sur le réseau public
Un serveur Apache installé sur chaqu'un des serveurs Redhat


A un instant t un seul serveur répondra aux requêtes externes. Lorsque celui-ci tombe, le second prendra le relais automatiquement.

Avant de démarrer l'installation, il vous faut configurer le repository RHEL puis télécharger le rpm en fonction de votre version OS.

wget -O /etc/yum.repos.d/clusterlabs.repo  http://www.clusterlabs.org/rpm/epel-6/clusterlabs.repo

rpm -Uvh http://ftp.scientificlinux.org/linux/scientific/6/x86_64/os/Packages/pacemaker-1.1.6-3.el6.x86_64.rpm

yum install  pacemaker corosync


Pour illustrer l'utilisation de la solution, je vais mettre en place une configuration simple d'un cluster deux nœuds :
  • deux serveurs lynx1 et lynx2 qui fonctionneront en mode actif/passif
  • une adresse ip virtuelle pour accéder au nœud actif
  • un service associé à cette adresse ip : Apache (dans mon cas)
Ma configuration de départ est la suivante :
  • lynx1: 192.168.1.27/255.255.255.0
  • lynx2 : 192.168.1.25/255.255.255.0
  • ip virtuelle : 192.168.1.111/255.255.255.0 
Configurer l'équivalence ssh pour le compte root, comme il doit pouvoir se connecter depuis un nœud vers l'autre sans mot de passe

Générer la clé ssh sur lynx1 :

[root@lynx1 ~]# ssh-keygen -t rsa Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
5d:ba:31:cd:f2:07:a8:5c:8f:2c:4e:ca:30:35:08:43 root@lynx1
Copier la clé publique vers le serveur lynx2 :
[root@lynx1 ~]# cat /root/.ssh/id_rsa.pub | ssh lynx2 "cat >> /root/.ssh/authorized_keys"


Générer la clé publique sur le serveur lynx2 :
[root@lynx1 ~]# ssh lynx2 "ssh-keygen -t rsa"
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
63:0b:bd:63:1b:c6:3e:c8:e2:7f:5e:ac:38:04:4b:4c root@lynx2
Copier cette clé vers le serveur lynx1
[root@lynx1 ~]# ssh lynx2 "cat /root/.ssh/id_rsa.pub" >> .ssh/authorized_keys


Vérifier le bon fonctionnement : 
les connexions ssh entre les deux serveurs avec le compte root ne doivent pas demander d'authentification.

Nota bene : les fichiers autorized_keys sur les deux serveurs doivent avoir les droits 600



Les noms des serveurs ne doivent pas comporter le nom de domaine,
éditer le fichier /etc/sysconfig/network et modifier la valeur de la variable HOSTNAME si nécessaire
# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=lynx1


Pour vérifier :
[root@lynx1 ~]# hostname
lynx1
[root@lynx1 ~]# ssh lynx2 hostname
lynx2

J'adapte mon fichier /etc/hosts
192.168.1.27      lynx1
192.168.1.25      lynx2

Je défini une adresse IP pour le multicast ainsi qu'un numéro de port
ip = 226.94.1.1 et port = 4000
# export ais_port=4000
# export ais_mcast=226.94.1.1
# export ais_addr=`ip addr | grep "inet " | tail -n 1 | awk '{print $4}' | sed s/255/0/`

A présent je modifie le fichier de configuration :
# cd /etc/corosync/
# cp -pv corosync.conf.example corosync.conf
# editer le fichier corosync.conf et modifier les lignes suivantes :
       bindnetaddr: 192.168.1.0
       mcastaddr: 226.94.1.1
       mcastport: 4000
 
Ajouter le bloc suivant dans le fichier /etc/corosync.conf :
service {
     # Load the Pacemaker Cluster Resource Manager
     name: pacemaker
     version: 0
     use_mgmtd: yes
}

Propagation de la configuration, par copie de fichier  vers le second nœud :
scp /etc/corosync/corosync.conf lynx2:/etc/corosync/corosync.conf

Déclarer corosync en tant que service linux, puis démarrer le :
chkconfig --add corosync
# chkconfig --list | grep corosync
corosync       0:off 1:off 2:on 3:on    4:on   5:on   6:off

Vérifier l'existence du dossier /var/log/cluster sinon le créer
/etc/init.d/corosync start

Il ne  me reste plus que à configurer mon ip failover pour finaliser mon cluster.
[root@lynx1 ~]# crm resource primitive failover-ip ocf:heartbeat:IPaddr params ip=192.168.1.111 op monitor interval=5s

Je vérifie ma configuration et le fonctionnement de mon cluster
[root@lynx1 ~]# crm configure show
node lynx1
node lynx2
primitive failover-ip ocf:heartbeat:IPaddr \
    params ip="192.168.1.111" \
    op monitor interval="5s"
property $id="cib-bootstrap-options" \
    dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \
    cluster-infrastructure="openais" \
    expected-quorum-votes="3" \
    stonith-enabled="false" \
    no-quorum-policy="ignore"

[root@lynx1 ~]# crm_mon -1
============
Last updated: Sun May  8 13:23:38 2012
Stack: openais
Current DC: lynx1 - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ lynx1 lynx2 ]
 failover-ip    (ocf::heartbeat:IPaddr):    Started lynx1

La commande ifconfig permet de voir que l'adresse ip virtuelle est assignée au nœud actif (lynx1) :
[root@lynx1 ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:64:BE:52
       inet addr:192.168.1.27  Bcast:192.168.1.255  Mask:255.255.255.0
       inet6 addr: fe80::a00:27ff:fe64:be52/64 Scope:Link
       UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
       RX packets:15859 errors:0 dropped:0 overruns:0 frame:0
       TX packets:11517 errors:0 dropped:0 overruns:0 carrier:0
       collisions:0 txqueuelen:1000
       RX bytes:2221143 (2.1 MiB)  TX bytes:1469803 (1.4 MiB)
eth0:0    Link encap:Ethernet  HWaddr 08:00:27:64:BE:52
       inet addr:192.168.1.111  Bcast:192.168.1.255  Mask:255.255.255.0
       UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
lo     Link encap:Local Loopback
       inet addr:127.0.0.1  Mask:255.0.0.0
       inet6 addr: ::1/128 Scope:Host
       UP LOOPBACK RUNNING  MTU:16436  Metric:1
       RX packets:8 errors:0 dropped:0 overruns:0 frame:0
       TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
       collisions:0 txqueuelen:0
       RX bytes:560 (560.0 b)  TX bytes:560 (560.0 b)

Je test que la bascule vers le deuxième noeud est fonctionnelle

Mise en mode "standby" du nœud lynx1
[root@lynx1 ~]# crm node standby

Vérifier le statut du cluster, pour valider que l'ip virtuelle est passé sur le nœud lynx2
[root@lynx1 ~]# crm_mon -1
============
Last updated: Sun May  8 13:26:54 2012
Stack: openais
Current DC: lynx2 - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Node lynx1: standby
Online: [ lynx2 ]
failover-ip    (ocf::heartbeat:IPaddr):       Started lynx2

Un coup de ifconfig sur le neoud lynx2
[root@lynx1 ~]# ssh lynx2 ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:E8:67:61
       inet addr:192.168.1.25  Bcast:192.168.1.255  Mask:255.255.255.0
       inet6 addr: fe80::a00:27ff:fee8:6761/64 Scope:Link
       UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
       RX packets:9905 errors:0 dropped:0 overruns:0 frame:0
       TX packets:12519 errors:0 dropped:0 overruns:0 carrier:0
       collisions:0 txqueuelen:1000
       RX bytes:1442456 (1.3 MiB)  TX bytes:1510080 (1.4 MiB)
eth0:0    Link encap:Ethernet  HWaddr 08:00:27:E8:67:61
       inet addr:192.168.1.111  Bcast:192.168.1.255  Mask:255.255.255.0
       UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
lo     Link encap:Local Loopback
       inet addr:127.0.0.1  Mask:255.0.0.0
       inet6 addr: ::1/128 Scope:Host
       UP LOOPBACK RUNNING  MTU:16436  Metric:1
       RX packets:8 errors:0 dropped:0 overruns:0 frame:0
       TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
       collisions:0 txqueuelen:0
       RX bytes:560 (560.0 b)  TX bytes:560 (560.0 b)

Pour faire le switchover vers le premier noeuds
[root@lynx1 ~]# crm node online

Actuellement, que j'ai valider le fonctionnent de mon cluster, il ne reste plus que à y déployer une ressource Apache.

Pour vérifier sur quel serveur httpd répond aux requêtes, nous allons créer un fichier index.html :
[root@lynx1 ~]# cat /var/www/html/index.html
<html>
<b>HTTPD ACTIF SUR SERVEUR PACEMAKER 1</b>
</html>


Créer le même fichier sur le serveur lynx2 :
[root@lynx2 ~]# cat /var/www/html/index.html
<html>
<b>HTTPD ACTIF SUR SERVEUR PACEMAKER 2</b>
</html>


Ajout d'une ressource nommée httpd au cluster :
[root@lynx1 ~]# crm configure primitive website lsb:httpd op monitor interval=10s

Nota : lsb:httpd, lsb car nous nous basons sur les scripts de démarrage qui se trouvent au niveau du dossier /etc/init.d pour démarrer, arrêter et obtenir le statut d'une ressource. httpd correspond évidemment au nom du script

Le serveur Apache doit s'exécuter sur le nœud qui possède l'ip virtuelle, nous allons donc dire au cluster de faire tourner les deux ressources sur le même nœud
root@lynx1 ~]# crm configure colocation httpd-with-failover-ip mandatory: failover-ip website
Nous constatons que les deux ressources sont sur le même
[root@lynx1 ~]# crm_mon -1
============
Last updated: Sun May  8 14:03:10 2012
Stack: openais
Current DC: lynx1 - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
2 Resources configured.
============
Online: [ lynx1 lynx2 ]
 failover-ip    (ocf::heartbeat:IPaddr):    Started lynx1
 website    (lsb:httpd):    Started lynx1

Pour finir, apache ne doit pas démarrer que une fois l'adresse ip virtuelle activée.
[root@lynx1 ~]#  crm configure
crm(live)configure# order apache-after-ip mandatory: failover-ip website
crm(live)configure# show
node lynx1
node lynx2
primitive website lsb:httpd \
    op monitor interval="15s"
primitive failover-ip ocf:heartbeat:IPaddr \
    params ip="192.168.1.111" \
    op monitor interval="5s" \
    meta target-role="Started"
colocation apache-with-ip inf: website failover-ip
order apache-after-ip inf: failover-ip failover-apache 
property $id="cib-bootstrap-options" \
    dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87"\
    cluster-infrastructure="openais" \
    expected-quorum-votes="3" \
    stonith-enabled="false" \
    no-quorum-policy="ignore"
crm(live)configure# commit
crm(live)configure# exit
 

Pour plus d'informations sur pacemaker cf. http://www.clusterlabs.org/doc/en-US/Pacemaker/1.0/html/Pacemaker_Explained/






Aucun commentaire:

Enregistrer un commentaire