Introduction
Un premier travail permettant de se familiariser avec différents outils.
Matériel de test : 2 serveurs
Objectif : à partir des 2 serveurs, créer une petite architecture haute disponibilité avec un serveur principal et un serveur en attente et prenant le relais du serveur principal en cas d'indisponibilité de celui-ci
Mots clés pour cette manipulation : Linux HA, heartbeat, DRBD, ...
D'autres outils pourront être testés.
Décrire la manipulation afin de la rendre reproductible facilement.
Faire des tests poussés de l'architecture : prise de relais, performances, etc.
Liens utiles :
http://www.drbd.org/
http://doc.ubuntu-fr.org/drbd
http://doc.ubuntu-fr.org/heartbeat
http://www.irods.org/
Table des matières
Architecture mise en place
Architecture matérielle
Deux serveurs sont mis en place, ceux-ci sont identiques :
- |
vm-server1 |
vm-server2 |
Type |
Primaire |
Secondaire |
Processeur |
quadri-XEON |
RAM |
512 Mo |
Partitionnement |
hd1 : / |
74 Go |
hd2 : swap |
512 Mo |
hd2 : /home |
1 Go |
hd2 : /dev/sdb3 (drdb) |
232 Go |
Réseau |
Vitesse |
1 GB |
IP |
130.79.129.145 |
130.79.129.146 |
MAC |
00:30:48:2a:4d:00 |
00:30:48:29:83:fc |
Architecture logicielle
Les deux serveurs ont pour système d'exploitation
Ubuntu Server 8.04, les paquets installés
sont ceux fournis par l'installation de base plus le serveur
sshd
.
Installation : Heartbeat et DRBD
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Attention, toutes les commandes suivantes sont à effectuer en tant que
root.
Installation de Heartbeat
Installation de
Heartbeat
:
apt-get install heartbeat
Ceci nous crée également un groupe
haclient
et un utilisateur
hacluster
.
Installation de DRBD
Avant d'installer les outils liés à
DRBD
, il faut d'abord charger le module noyau associé.
modprobe drbd
Nous nous assurons également que celui-ci sera automatiquement chargé au prochain démarrage.
echo "drbd" >> /etc/modules
Nous pouvons alors installer les outils
DRBD
:
apt-get install drbd8-utils
Afin que les outils (
drbdsetup
et
drbdmeta
) fonctionnent correctement avec
Heartbeat
, il faut
modifier les attributs de ceux-ci de telle sorte qu'ils appartiennent au groupe
haclient
, interdire
l'exécution aux utilisateurs autres que le propriétaire ou n'appartenant pas au groupe et permettre
l'exécution avec les droits
root (le propriétaire) :
chgrp haclient /sbin/drbdsetup
chmod o-x /sbin/drbdsetup
chmod u+s /sbin/drbdsetup
chgrp haclient /sbin/drbdmeta
chmod o-x /sbin/drbdmeta
chmod u+s /sbin/drbdmeta
Démarrage automatique
Afin de s'assurer du démarrage correct (et surtout dans le bon ordre) de
heartbeat et
drbd, on doit s'assurer que le réseau soit déjà démarré et que
heartbeat succède à
drbd :
update-rc.d -f heartbeat remove
update-rc.d -f drbd remove
update-rc.d heartbeat start 71 2 3 4 5 . stop 71 0 1 6 .
update-rc.d drbd start 70 2 3 4 5 . stop 70 0 1 6 .
Configuration
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Attention, toutes les commandes suivantes sont à effectuer en tant que
root.
Configurations préliminaires
- Afin de s'assurer que le réseau démarre bien avec le service Network Service, le fichier
/etc/network/interfaces
doit être renseigné à propos des interfaces que nous utiliserons par la suite. Par exemple, pour avoir le loopback et que l'interface eth0 obtienne son ip via le service dhcp :
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet dhcp
-
Pour se simplifier la vie (et éviter d'éventuelles erreurs de frappe par la suite), on peut ajouter, sur chaque machine, le nom et l'ip de l'autre dans /etc/hosts
. Par exemple, sur le serveur principal :
echo -e "130.79.129.146\tvm-server2" >> /etc/hosts
- Il est (plus que) recommandé que les horloges des serveurs soient synchronisées entre elles. Selon la dérive relative des horloges, leur synchronisation avec un serveur de temps doit se faire plus ou moins souvent. Nous allons donc rajouter une tâche périodique :
crontab -e
Nous pouvons alors ajouter notre tâche à proprement parler, ici à 21h43 tous les jours du mois, tous les mois de l'année et tous les jours de la semaine nous exécuterons la commande
ntpdate
:
# m h dom mon dow command
43 21 * * * ntpdate ntp.u-strasbg.fr ntp.ubuntu.com
* Pour pouvoir utiliser le client graphique (Linux HA Management Client), il est nécessaire d'ajouter au moins un utilisateur du système (de préférence sur chaque machine au cas où...) au groupe haclient
. Pour le mieux, cet utilisateur ne doit pas être root
afin de ne pas rajouter un potentiel trou de sécurité.
addgroup vincent haclient
Heartbeat
Le fichier /etc/ha.d/haresources
vm-server1 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 130.79.129.147 irodsservice
Le fichier /etc/ha.d/authkeys
Nous générons notre fichier
authkeys
de façon à ce que
Heartbeat
utilise
un chiffrement
sha1 avec une clé humainement introuvable. Sur le serveur principal :
echo "auth 1" > /etc/ha.d/authkeys
echo -n "1 sha1 " >> /etc/ha.d/authkeys
dd if=/dev/urandom bs=512 count=1 | openssl sha1 >> /etc/ha.d/authkeys
chmod 600 /etc/ha.d/authkeys
Copions ce fichier vers le serveur secondaire :
scp /etc/ha.d/authkeys vm-server2:/etc/ha.d/authkeys
Le fichier /etc/ha.d/ha.cf
autojoin none
ucast eth0 130.79.129.145
ucast eth0 130.79.129.146
warntime 5
deadtime 15
initdead 60
keepalive 2
node vm-server1 vm-server2
DRBD
Le fichier /etc/drbd.conf
global {
# Interdire l'envoi de statistiques au serveur http://usage.drbd.org
usage-count no;
}
common {
protocol C;
syncer {
# Recommandation des développeurs de DRBD, règler à 1/3 de la bande
# passante. Ici 1GB/3 => 1000MB/3 => 125M/3 => 41M.
rate 41M;
}
handlers {
outdate-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";
pri-lost "echo pri-lost. Have a look at the log files. | mail -s 'DRBD Alert' root";
}
}
resource r0 {
startup {
wfc-timeout 60;
degr-wfc-timeout 30;
}
disk {
on-io-error detach;
fencing resource-only;
}
net {
after-sb-0pri discard-older-primary;
after-sb-1pri call-pri-lost-after-sb;
after-sb-2pri call-pri-lost-after-sb;
}
on vm-server1 {
device /dev/drbd0;
disk /dev/sdb3;
address 130.79.129.145:7788;
flexible-meta-disk internal;
}
on vm-server2 {
device /dev/drbd0;
disk /dev/sdb3;
address 130.79.129.146:7788;
flexible-meta-disk internal;
}
}
Copions ce fichier vers le serveur secondaire :
scp /etc/drbd.conf vm-server2:/etc/drbd.conf
Initialisation de DRBD
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Attention, ceci est à effectuer sur les deux machines.
Avant d'initialiser notre partition
DRBD
, il faut effacer les éventuelles données qu'elle contient (tout du moins le début) :
%GREEN% shred -zvf -n 0 -s 1G /dev/sdb3 %ENDCOLOR%
Il est alors possible de générer les méta-données :
drbdadm create-md r0
On peut alors activer
DRBD
:
drbdadm up r0
A ce stade, nos deux serveurs sont considérés comme secondaires.
Avant de passer à la configuration
d'un primaire et donc à la synchronisation initiale, nous passons le paramètre rate
de la section
de configuration syncer
à 125M (pour une liaison 1GB) afin d'utiliser l'intégralité de la bande
passante. Ne pas oublier de remettre la bonne valeur dès la synchronisation terminée.
Pour prendre en compte le changement dans la configuration, il faut lancer la commande suivante :
drbdadm adjust r0
Configuration du Serveur Principal
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Attention, cette étape n'est à effectuer que sur le serveur primaire :
drbdadm -- --overwrite-data-of-peer primary r0
La synchronisation des deux serveurs se passe en arrière plan. Il est possible d'en suivre le déroulement via
watch -n1 cat /proc/drbd
sur l'un des deux serveurs.
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Une fois la synchronisation terminée, ne pas oublier de rétablir le paramètre
rate
à l'état normal.
A partir de maintenant, toute modification sur la partition
/dev/drbd0
sur le serveur principal sera répercutée
sur le serveur secondaire.
Nous pouvons maintenant formater notre partition
/dev/drbd0
. Afin d'utiliser tout l'espace disponible, il faut
préciser que l'on ne veut pas réserver d'espace disque pour
root
. Par défaut, ce sont 5% qui lui sont réservés
et donc sur une partition de 100 Go, après de savants calculs, on peut voir que 5 Go seraient réservés et plus
ou moins perdus pour nous. Donc :
mkfs.ext3 -m0 /dev/drbd0
Installation / Configuration de iRODS
Outils nécessaires
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Attention, toutes les commandes suivantes sont à effectuer en tant que
root.
Pour installer et faire fonctionner
iRODS, nous avons besoin de quelques
outils supplémentaires. L'installation se faisant sur le serveur primaire,
nous installons sur celui-ci les paquets nécessaires à la compilation de
PostgreSQL par exemple :
apt-get install build-essential
Par contre, nous avons besoin sur les deux machines de
Perl, nous l'installons
donc sur les deux machines :
apt-get install perl
Préliminaires
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Attention, toutes les commandes suivantes sont à effectuer en tant que
root.
Il faut créer sur chaque machine le répertoire
/data
et permettre à tout utilisateur d'écrire dans ce répertoire, d'où le
sticky bit.
mkdir /data
chmod +t /data
%GREEN% ajouter les droits nécessaires à l'installation d'iRODS suivant le répertoire d'installation (home, etc)
%ENDCOLOR%
Le cluster n'étant pas encore disponible, nous allons effectuer l'installation
sur le serveur primaire. Il faut donc monter notre partition
/dev/drbd0
sur cette machine.
mount -t ext3 /dev/drbd0 /data
Installation
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Attention, toutes les commandes suivantes sont à effectuer en tant qu'utilisateur normal.
Après avoir obtenu la version souhaitée de iRODS, on la place (
cp
,
scp
,
wget
,...) dans le répertoire
/data
. On la décompresse puis on
supprime l'archive :
cd /data
tar xzf irods2.0.1.tgz
rm irods2.0.1.tgz
Nous avons maintenant un répertoire iRODS. Plaçons-nous dans celui-ci et
démarrons l'installation :
cd iRODS
./irodssetup
Le script d'installation est plutôt explicite et les paramètres par défaut conviendront généralement. Un point à ne pas manquer (de toute façon, il n'a pas de valeur par défaut) est le choix du répertoire de postgres que nous plaçons dans
/data/postgres
, donc également sur la partition en réplication.
![HELP HELP](/twiki/pub/TWiki/TWikiDocGraphics/help.gif)
avec notre configuration et la version courante d'iRODS (01/2009), le script ne crée pas l'utilisateur pour
postgres et la base de données iCAT ne peut être créée. Il suffit de créer cet utilisateur à la main,
vmdb
dans notre cas :
/data/postgres/pgsql/bin/createuser vmdb
A la question, l'utilisateur doit-il être un super utlisateur, répondre
oui. Ici, super utilisateur signifie, en plus des droits "normaux", le droit de créer des bases (nécessaire pour iRODS) et le droit de gérer les utilisateurs de la base (peu important, en cas de compromission du système les problèmes ne viendront pas de là...).
L'installation peut être reprise en réexécutant le script
./irodssetup
.
Une fois iRODS installé et configuré, on peut en tester le bon fonctionnement, d'abord en le démarrant puis en lui demandant de se tester :
./irodsctl start
./irodsctl test
Cependant, iRODS est pour le moment lié à la machine sur laquelle il a été installé, et plus particulièrement à son
hostname. Afin qu'il puisse s'exécuter aussi bien sur le serveur primaire que secondaire, il faut modifier sa configuration pour qu'elle se réfère à
localhost plutôt qu'à
vm-server1 dans notre cas.
- dans le fichier
/data/iRODS/config/irods.config
:
$DATABASE_HOST = 'localhost';
- dans le fichier
/data/iRODS/server/config/server.config
:
icatHost localhost
- dans le fichier
/data/postgres/pgsql/etc/odbc.ini
:
Servername=localhost
Script de démarrage
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Les deux fichiers suivants sont à placer (en tant que root) sur chacune des machines.
Le fichier
/etc/init.d/irodsservice
:
#!/bin/bash
# /etc/init.d/irodsservice: start and stop the irods
set -e
DEFAULT=/etc/default/irodsservice
SU=/bin/su
IRODSCTL='irodsctl'
IRODSERR='/var/log/irodsservice.err'
not_start() {
echo "## WARNING ##"
echo "The irods service won't be started/stopped unless it is configured"
if [ "$1" != "stop" ] ; then
echo ""
echo "Please configure it and then edit /etc/default/irodsservice."
fi
echo ""
exit 0
}
if [ -f $DEFAULT ] ; then
. $DEFAULT
if [ "$start" -ne "1" ] ; then
not_start
fi
else
not_start
fi
if [ $User ] ; then
uid=`(grep $User /etc/passwd | cut -f 3 -d :)`
fi
case "$1" in
start)
$SU $User $irods/irodsctl start
;;
stop)
$SU $User $irods/irodsctl stop
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
Le fichier
/etc/default/irodsservice
:
# Login de l'utilisateur (non _root_) pour démarrer iRODS
User=vincent
# Répertoire contenant iRODS
irods=/data/iRODS
# Doit-on démarrer iRODS (1 pour oui)
start=1
Il faut également rendre le script exécutable (en tant que
root) :
chmod +x /etc/init.d/irodsservice
Démarrage de iRODS
Pour vérifier que cela fonctionne correctement, nous pouvons démarrer
iRODS sur le serveur principal. Il suffit d'exécuter la commande suivante :
/etc/init.d/irodsservice start