Installer DRBD sur Debian
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:
- l'utilisation de LVM, comme décrit par Mettre en place et utiliser le gestionnaire de volumes logiques LVM sur Debian.
- un VPN IPSec point à point entre les membres de la grappe, comme décrit par Créer un tunnel VPN IPSec point à point (en mode transport) sur Debian.
- le logiciel de grappe haute-disponibilité Heartbeat, comme décrit par Installer Heartbeat sur Debian.
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
- Merci à GuiguiAbloc (fr) pour Cluster Haute-Disponibilité chez OVH, avec IpFailover, Heartbeat et DRBD via IPSEC (fr).
- Merci aux auteurs de DRBD (fr) dans la documentation Ubuntu francophone (fr).
- Merci aux développeurs de DRBD (en).