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)
- 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
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"
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
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
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>
<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>
<html>
<b>HTTPD ACTIF SUR SERVEUR PACEMAKER 2</b>
</html>
Ajout d'une ressource nommée httpd au cluster :
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" \
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