DRBD sous Etch avec xen

DRBD sous Etch avec xen - Installation - Linux et OS Alternatifs

Marsh Posté le 14-04-2008 à 16:28:26    

J'ai deux serveurs virtuels sous Debian Etch (en DomU avec xen), j'ai installé un système raid réseau avec Drbd et heartbeat.  
Drbd fonctionnement correctement manuellement. J'utilise la version 0.7 de Drbd.
 
1er probleme:
 
En cas de reboot, le problème est que le périphérique "/dev/drbd0" n'existe pas. Evidemment, le service Drbd ne se lance pas et Heartbeat ne peux pas travailler. Je suis obliger d'utiliser la commande "mknod -m 0660 /dev/drbd0 b 147 0" pour créer le périphérique à chaque démarrage de la machine.
Le module drbd est pourtant chargé au démarrage: lsmod => "drbd                  128724  0"
j'ai pas mal fait de recherche sur internet et je n'est pas trouvé de cas similaire...
 
2nd problème
 
Il me semble aussi que la bascule entre les deux machine ne fonctionne pas: il y a une machine maitre et une esclave avec le système Drbd, Heartbeat doit se charger de passer l'esclave en maitre dans le cas ou le maitre est "down". Si je désactive le maitre, l'esclave ne devient pas maitre...  
 
 
3eme problème
 
Je partage le disque avec samba sur les deux machines virtuelles. J'ai suivi un tutoriel ubuntu:
http://doc.ubuntu-fr.org/tutoriel/ [...] _heartbeat
l'objectif est d'avoir un disque réseau "haute disponibilité" qui puisse être monté par un autre machine du réseau.
Le service heartbeat ne lance pas le service samba et donc il n'y a pas de partage.  
 
Voici mes fichiers de configuration:
 
/etc/drbd.conf
 

Citation :

resource drbd0 {
 
  # protocole utilisé (voir plus bas)
  protocol C;
 
  # vitesse de transfert des données
  syncer {
     rate 100M;
     group 1;
}
  on mx3 {
 
     # peripherique drbd
    device     /dev/drbd0;
 
     #volume à synchroniser
    disk       /dev/sda3;
 
     # adresse ip du noeud et port
    address    10.0.201.27:7788;
 
     # emplacement des méta-données
    meta-disk  internal;
  }
 
  # même procédure
  on pop3 {
    device    /dev/drbd0;
    disk      /dev/sda3;
    address   10.0.201.26:7788;
    meta-disk internal;
 }
}


 
/etc/ha.d/ha.cf
 

Citation :

bcast         eth0
 
debugfile     /var/log/ha-debug
logfile       /var/log/ha-log
logfacility   local0
 
keepalive     2
deadtime      10
warntime      6
initdead      60
 
udpport       694
node          mx3
node          pop3
 
auto_failback off


/etc/ha.d/haresources
 

Citation :

mx3 IPaddr::10.0.201.27 drbddisk::drbd0 Filesystem::/dev/drbd0::/mnt/archive::ext3 samba


 
/etc/ha.d/authkeys
 

Citation :

auth 2
1 md5 "cluster archive"
2 crc


 
J'ai aussi un message d'erreur d' heartbeat qui cependant n'empêche pas le service de tourner:  
 

Citation :

Starting High-Availability services:
2008/04/14_14:18:28 CRITICAL: Resource IPaddr::10.0.201.27 is active, and should not be!
2008/04/14_14:18:28 CRITICAL: Non-idle resources can affect data integrity!
2008/04/14_14:18:28 info: If you don't know what this means, then get help!
2008/04/14_14:18:28 info: Read the docs and/or source to /usr/lib/heartbeat/ResourceManager for more details.
CRITICAL: Resource IPaddr::10.0.201.27 is active, and should not be!
CRITICAL: Non-idle resources can affect data integrity!
info: If you don't know what this means, then get help!
info: Read the docs and/or the source to /usr/lib/heartbeat/ResourceManager for more details.
2008/04/14_14:18:28 CRITICAL: Non-idle resources will affect resource takeback!
2008/04/14_14:18:28 CRITICAL: Non-idle resources may affect data integrity!
Done.


 
Je vous remercie de votre aide.

Reply

Marsh Posté le 14-04-2008 à 16:28:26   

Reply

Marsh Posté le 14-04-2008 à 16:44:17    

J'ai résolu mon 3eme problème.

Reply

Marsh Posté le 15-04-2008 à 14:38:38    

J'ai résolu mon 2eme problème, drbd-heartbeat fonctionne convenablement.  
Cependant après redémarrage, le "device" /dev/drbd0 n'est pas créé et le service drbd ne peut donc pas démarrer. J'utilise la commande mknode pour le créer manuellement. Le module drbd est monté au démarrage (vérifié avec lsmod).  
La solution du pauvre consisterai à faire un script qui démarre avant drbd pour créer drbd0 mais cela me semble pas très "propre" comme méthode.
 
Merci de votre aide

Reply

Marsh Posté le 16-04-2008 à 13:14:30    

Sous redhat, il y a un script dans /etc/init.d qui se charge de l'initialisation de drbd et qui lancé avant heartbeat. Ce script provient des sources de drbd d'ailleurs

 

Je pense que c'est ce script qui n'est pas lancé chez toi dans ton runlevel. Aa tu un script qiu s'appelle drbd (ou quelque chose comme ça) dans /etc/init.d ?


Message édité par the_fireball le 16-04-2008 à 13:15:26

---------------
Two thousand years of misery, of torture in my name, hypocrisy made paramount, paranoia the law, my name is called religion, sadistic, sacred whore.
Reply

Marsh Posté le 16-04-2008 à 14:36:11    

Oui le service "drbd" est situé dans /etc/init.d/:
 
Il charge le module drdb (avec modprode), et démarre le service drdb. Il n'a pas l'air de créer le device /dev/drbd0...
 

Citation :

#!/bin/bash
#
# chkconfig: 345 70 8
# description: Loads and unloads the drbd module
#
# complete rewrite from scratch by Philipp Reisner in March and April 2001
# rewrite from scratch by Lars Ellenberg in June 2002
# Jan 2003: Moved all the logic into a program written in C.
#
### BEGIN INIT INFO
# Provides: drbd
# Required-Start: $network $syslog sshd
# Required-Stop:
# Default-Start:  3 5
# Default-Stop:   0 1 2 6
# Description:    Control drbd resources.
### END INIT INFO
 
DEFAULTFILE="/etc/default/drbd"
DRBDADM="/sbin/drbdadm"
PROC_DRBD="/proc/drbd"
MODPROBE="/sbin/modprobe"
RMMOD="/sbin/rmmod"
UDEV_TIMEOUT=10
ADD_MOD_PARAM=""
 
if [ -f $DEFAULTFILE ]; then
  . $DEFAULTFILE
fi
 
test -f $DRBDADM || exit 5
 
function assure_module_is_loaded
{
    [ -e "$PROC_DRBD" ] && return
 
    $MODPROBE -s drbd `$DRBDADM sh-mod-parms` $ADD_MOD_PARAM || {
        echo "Can not load the drbd module."$'\n'; exit 20
    }
    # tell klogd to reload module symbol information ...
    [ -e /var/run/klogd.pid ] && [ -x /sbin/klogd ] && /sbin/klogd -i
 
    # make sure udev has time to create the device files
    for RESOURCE in `$DRBDADM sh-resources`; do
        for DEVICE in `$DRBDADM sh-dev $RESOURCE`; do
            UDEV_TIMEOUT_LOCAL=$UDEV_TIMEOUT
            while [ ! -e $DEVICE ] && [ $UDEV_TIMEOUT_LOCAL -gt 0 ] ; do
                sleep 1
                UDEV_TIMEOUT_LOCAL=$(( $UDEV_TIMEOUT_LOCAL-1 ))
            done
        done
    done
}
 
function adjust_with_progress
{
    IFS_O=$IFS
    NEWLINE='
'
    IFS=$NEWLINE
    local D=0
    local S=0
    local N=0
 
    COMMANDS=`$DRBDADM -d adjust all` || exit 20
    echo -n "[ "
 
    for CMD in $COMMANDS; do
        if echo $CMD | grep -q disk; then echo -n "d$D "; D=$(( D+1 ));
        elif echo $CMD | grep -q syncer; then echo -n "s$S "; S=$(( S+1 ));
        elif echo $CMD | grep -q net; then echo -n "n$N "; N=$(( N+1 ));
        else echo echo -n ".. ";
        fi
        IFS=$IFS_O
        $CMD || {
            echo -e "\ncmd $CMD failed!"; exit 20
        }
        IFS=$NEWLINE
    done
    echo -n "]"
 
    IFS=$IFS_O
}
 
case "$1" in
    start)
        echo -n "Starting DRBD resources:    "
        assure_module_is_loaded
        adjust_with_progress
        [ -d /var/lock/subsys ] && touch /var/lock/subsys/drbd  # for RedHat
        echo "."
        $DRBDADM wait_con_int # User interruptible version of wait_connect all
        ;;
    stop)
        echo -n "Stopping all DRBD resources"
        if [ -e $PROC_DRBD ] ; then
                $DRBDADM down all
                $RMMOD drbd
        fi
        [ -f /var/lock/subsys/drbd ] && rm /var/lock/subsys/drbd
        echo "."
        ;;
    status)
        # NEEDS to be heartbeat friendly...
        # so: put some "OK" in the output.
        if [ -e $PROC_DRBD ]; then
            echo "drbd driver loaded OK; device status:"
            cat $PROC_DRBD
            exit 0
        else
            echo >&2 "drbd not loaded"
            exit 3
        fi
        ;;
    reload)
        echo -n "Reloading DRBD configuration"
        $DRBDADM adjust all
        echo "."
        ;;
    restart|force-reload)
        echo -n "Restarting all DRBD resources"
        $DRBDADM down all
        $RMMOD drbd
        assure_module_is_loaded
        $DRBDADM up all
        echo "."
        ;;
    *)
        echo "Usage: /etc/init.d/drbd {start|stop|status|reload|restart|force-reload}"
        exit 1
        ;;
esac
 
exit 0


 
Par contre on remarque une fonction qui doit attendre que le device drbd0 soit créé ("# make sure udev has time to create the device files" ). Je pense que c'est le module "drbd" une fois chargé qui créer le device /dev/drbd0: le script charge le module, attends quelque instants, et lance l'application drbd qui se base sur /dev/drbd0.
 
Etant donné que je suis sous xen, le module drbd n'est pas le même que si j'utilisais un noyaux standard: il se nomme "drbd0.7-module-2.6.18-6-xen-686".
Peut être que cette version du module ne marche pas comme le module drbd standard.
 
En attendant, pour que le service drbd démarre correctement, j'ai écris un script qui charge le module et créer le device avec mknod. Il est lancé avant  drbd.  

Reply

Marsh Posté le 16-04-2008 à 15:17:26    

normalement, une fois le module chargé, soit il crée son device, soit c'est udev qui le crée. Tu dois avoir un problème de conf quelque part.
 
tu es sur que ce script drbd est activé pour ton runlevel ? Tu as bien un lien symbolique commençant par S<nombre>drbd dans /etc/rc2.d ou /etc/rc3.d ?


---------------
Two thousand years of misery, of torture in my name, hypocrisy made paramount, paranoia the law, my name is called religion, sadistic, sacred whore.
Reply

Marsh Posté le 16-04-2008 à 15:45:41    

Oui le script /etc/init.d/drdb est bien activé dans le runlevel. C'est le script que j'ai posté plus haut. Bizarrement, il est placé dans tout les niveaux:
/etc/rc0.d/K08drbd
/etc/rc1.d/K08drbd
/etc/rc2.d/S70drbd
/etc/rc3.d/S70drbd
/etc/rc4.d/S70drbd
/etc/rc5.d/S70drbd
/etc/rc6.d/K08drbd
 
Il est lancé puisque au démarrage, le service drbd émet une erreur (/dev/drbd0 not found). Cette erreur est du justement au fait que le device /dev/drbd0 n'est pas créé. J'en déduit que le script de démarrage ne le créer pas.
 
Est ce que c'est le module qui est fautif et qui ne créer pas son device ? ou est ce que udev qui n'est pas configuré pour drdb ?
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed