Tags:
create new tag
, view all tags

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! 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! 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

  • TIP 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! 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! 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! 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! 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! 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! 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 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! 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
Topic revision: r25 - 2009-06-25 - VincentMeslard
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback