Vous êtes ici : Accueil / Debian GNU/Linux / Serveurs / Autres / Installer DRBD sur Debian

Installer DRBD sur Debian

Par Pierre-Yves Landuré Dernière modification 27/02/2017 12:18

DRBD est une architecture de stockage distribuée pour GNU/Linux, permettant la réplication de périphériques de bloc (disques, partitions, volumes logiques etc…) entre des serveurs (source: Wikipedia). Ce guide facilite son installation sur Debian.

Ce guide est testé sur:

  • Debian 7.0 Wheezy

Prérequis

Ce guide recommande:

Créez une partition dédiée au RAID distribué sur chaque membre du RAID. Toutes les partitions créées doivent être de taille identique.

Paramètres

Renseignez le nom de ressource du RAID distribué:

RESOURCE="r0"

Renseignez le point de montage du RAID distribué:

MOUNT_POINT="/shared"

Renseignez le nom de l'interface réseau utilisée par le RAID distribué:

NET_DEV="eth0"

Renseignez le nom des hôtes membre du RAID distribué, ainsi que le nom des partitions utilisées sur chaque hôtes (les partitions doivent avoir la même taille pour chaque hôte). Le format est:

  • un hôte par ligne.
  • nom d'hôte et partition sur la même ligne séparé par deux points (:).
  • l'hôte renseigné sur la première ligne est considéré comme primaire.
MEMBERS="host1.domain.com:/dev/vhd1/shared
host2.domain.com/dev/vhd1/shared
"

Installation

Déterminez le nom du fichier de configuration de la ressource:

CONFIG_FILE="/etc/drbd.d/${RESOURCE}.res"

Détectez la partition liée à la ressource, si possible:

RESOURCE_DEV=""
if [ -e "${CONFIG_FILE}" ]; then
  RESOURCE_DEV="$(command grep --max-count='1' 'device' "${CONFIG_FILE}" \
      | command sed -e 's/^.*device[ \t]*\([^; \t]*\)[; \t]*$/\1/')"
fi

Générez un nom de partition pour la ressource, si nécessaire:

if [ -z "${RESOURCE_DEV}" ]; then
if [ -d '/etc/drbd.d' ]; then
    RESOURCE_DEV="/dev/drbd$(command grep -r "device" '/etc/drbd.d' \
        | command sed -e 's/^.*device[ \t]*\([^; \t]*\)[; \t]*$/\1/' \
        | command sort | command uniq | command wc -l)"
else
RESOURCE_DEV="/dev/drbd0"
fi
fi

Préparation de l'environnement

Installez les logiciels nécessaires

command apt-get install drbd8-utils drbdlinks

Assurez-vous de l'existence du point de montage:

command mkdir --parents "${MOUNT_POINT}"

Configuration

Activez les défauts de gestion des échecs (redémarrage lorsque le RAID distribué perd toute intégrité):

command sed -i \
    -e 's/# pri-on-incon-degr/pri-on-incon-degr/' \
-e 's/# pri-lost-after-sb/pri-lost-after-sb/' \
-e 's/# local-io-error/local-io-error/' \
-e 's/# split-brain/split-brain/' \
-e 's/# out-of-sync/out-of-sync/' \
  '/etc/drbd.d/global_common.conf'

Générez la configuration de la resource:

PRIMARY_HOST=""
RESOURCE_CONFIG=""
LOCAL_DEV=""
for HOST_DEV in ${MEMBERS}; do
  DRBD_HOST="$(echo "${HOST_DEV}" | command cut --delimiter=':' --fields=1)"
  DRBD_DEV="$(echo "${HOST_DEV}" | command cut --delimiter=':' --fields=2)"

if [ "${DRBD_HOST}" = "$(command hostname --fqdn)" ]; then
DRBD_HOST="$(command hostname)"
LOCAL_DEV="${DRBD_DEV}"
HOST_IP="$(command ifconfig "${NET_DEV}" \
| command grep 'inet ' \
| command sed -e 's/^.*inet [^:]*:\([^ ]*\) .*$/\1/')"
else
HOST_IP="$(command getent ahostsv4 "${DRBD_HOST}" \
| command cut --delimiter=" " --fields=1 \
| command tail -n 1)"
fi

if [ -z "${PRIMARY_HOST}" ]; then
PRIMARY_HOST="${DRBD_HOST}"
fi

RESOURCE_CONFIG="${RESOURCE_CONFIG}
on ${DRBD_HOST} {
address ${HOST_IP}:7788;
disk ${DRBD_DEV};
}
"
done

Créez le fichier de configuration de la ressource:

echo "resource ${RESOURCE} {
  device ${RESOURCE_DEV};

  meta-disk internal;

  disk {
    on-io-error detach;
  }

  startup {
    wfc-timeout  60;
    degr-wfc-timeout 30;
    become-primary-on ${PRIMARY_HOST};
  }

# Split brain recovery policies.
net {
after-sb-0pri discard-older-primary;
after-sb-1pri call-pri-lost-after-sb;
after-sb-2pri call-pri-lost-after-sb;
}

${RESOURCE_CONFIG}
}
" > "${CONFIG_FILE}"

Finalisation

Ce qui suit est à exécuter après configuration de l'ensemble des serveurs du RAID distribué.

Initialisation

Effacez le disque local assigné au RAID distribué:

if [ -e "${LOCAL_DEV}" ]; then
  command umount "${LOCAL_DEV}"
  command dd if='/dev/zero' bs=512 count=512 of="${LOCAL_DEV}"
fi

Initialisez la ressource:

command drbdadm create-md "${RESOURCE}"

Assurez-vous que le module drbd est chargé:

command modprobe drbd

Démarrez le RAID distribué:

command drbdadm up "${RESOURCE}"

Initialisation du serveur primaire

Augmentez le débit de synchronisation entre les différents serveurs:

if [ "${PRIMARY_HOST}" = "$(command hostname)" ]; then
command drbdsetup "${RESOURCE_DEV}" syncer -r 1000M
fi

Lancez la synchronisation des serveurs secondaires à partir du serveur primaire local:

if [ "${PRIMARY_HOST}" = "$(command hostname)" ]; then
  command drbdadm -- --overwrite-data-of-peer primary "${RESOURCE}"
fi

La procédure de synchronisation des différents serveurs peut être longue, selon la taille choisie pour le RAID1. Obtenez le statut de la synchronisation via:

command cat '/proc/drbd'

Réinitialisez le débit de synchronisation entre les différents serveurs:

if [ "${PRIMARY_HOST}" = "$(command hostname)" ]; then
command drbdadm adjust "${RESOURCE}"
fi

Configuration de la partition

Formatez la partition:

if [ "${PRIMARY_HOST}" = "$(command hostname)" ]; then
command mkfs.ext4 "${RESOURCE_DEV}"
fi

Configurez le point de montage sur le serveur primaire, si heartbeat n'est pas présent:

if [ "${PRIMARY_HOST}" = "$(command hostname)" \
    -a -z "$(command grep "${RESOURCE_DEV}" '/etc/fstab')" \
    -a ! -e '/etc/ha.d/haresources' ]; then
  echo "${RESOURCE}    ${MOUNT_POINT}    ext4    defaults    0    2"
fi

Montez la partition sur le serveur primaire, si heartbeat n'est pas présent:

if [ "${PRIMARY_HOST}" = "$(command hostname)" \
    -a ! -e '/etc/ha.d/haresources' ]; then
command mount "${MOUNT_POINT}"
fi

Configuration de heartbeat

Configurez DRBD pour prendre en compte heartbeat:

if [ -e '/etc/ha.d/haresources' ]; then
command sed -i \
    -e '/after-resync-target/a\
\
\t\toutdate-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";' \
  '/etc/drbd.d/global_common.conf'
fi

Autorisez heartbeat à gérer la configuration de DRBD:

if [ -e '/etc/ha.d/haresources' ]; then
/usr/sbin/dpkg-statoverride --add --update 'root' 'haclient' 4750 '/sbin/drbdsetup'
/usr/sbin/dpkg-statoverride --add --update 'root' 'haclient' 4750 '/sbin/drbdmeta'
fi

Rechargez la configuration:

command drbdadm adjust "${RESOURCE}"

Configurez heartbeat pour gérer le changement de serveur primaire:

if [ -e '/etc/ha.d/haresources' ]; then
command sed -i \
     -e "0,/.*/s|.*$|& drbddisk::${RESOURCE} Filesystem::${RESOURCE_DEV}::${MOUNT_POINT}::ext4|" \
  '/etc/ha.d/haresources'
fi

Rechargez la configuration de heartbeat:

if [ -e '/etc/ha.d/haresources' ]; then
command service heartbeat reload
fi

Sécurisation

Bloquez l'accès au port tcp 7788 à part pour les membres de la grappe à l'aide du guide:

Remerciements