Intégration d’une ressource DRBD sur un cluster Pacemaker/CoroSync sous GNU/Linux Debian

Partitionnement

Remarque : les actions suivantes sont à réaliser sur les deux noeuds.

Voici le disque dédié à DRBD, sans partition :

# fdisk -l /dev/cciss/c0d1
Disk /dev/cciss/c0d1: 39.4 GB, 39406141440 bytes
255 heads, 32 sectors/track, 9432 cylinders
Units = cylinders of 8160 * 512 = 4177920 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x64476aa0

Disk /dev/cciss/c0d1 doesn't contain a valid partition table

Lancer l’outil de partitionnement de ce même disque :

# cfdisk /dev/cciss/c0d1

Une fois le partitionnement terminé, voici ce que nous obtenons :

# fdisk -l /dev/cciss/c0d1
Disk /dev/cciss/c0d1: 39.4 GB, 39406141440 bytes
255 heads, 32 sectors/track, 9432 cylinders
Units = cylinders of 8160 * 512 = 4177920 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x64476aa0


Device Boot      Start         End      Blocks   Id  System
/dev/cciss/c0d1p1               1        9432    38482544   83  Linux

DRBD ou le RAID 1 over TCP/IP

Remarque : les actions suivantes sont à réaliser sur les deux noeuds. Installer DRBD :

# aptitude install drbd8-utils

Lancer le module approprié :

# modprobe drbd

Vérifier la présence du module :

# lsmod | grep drbd
drbd                  172668  0
lru_cache               4018  1 drbd
cn                      3631  1 drbd

Sauvegarder la configuration d’origine :

# cp /etc/drbd.conf /etc/drbd.conf.original

Configurer DRBD :

# > /etc/drbd.conf
# vim /etc/drbd.conf
global { usage-count no; }
common { syncer { rate 100M; } }
resource r0 {
        protocol C;
        startup {
                wfc-timeout  15;
                degr-wfc-timeout 60;
        }
        net {
                cram-hmac-alg sha1;
                shared-secret "***********";
        }
        on vm-debian1 {
                device /dev/drbd0;
                disk /dev/cciss/c0d1;
                address 10.20.30.1:7788;
                meta-disk internal;
        }
        on vm-debian2 {
                device /dev/drbd0;
                disk /dev/cciss/c0d1;
                address 10.20.30.2:7788;
                meta-disk internal;
        }
}

Initialiser le RAID avec la ressource r0 :

# drbdadm create-md r0
md_offset 39406137344
al_offset 39406104576
bm_offset 39404900352

Found some data

 ==> This might destroy existing data! <==

Do you want to proceed?
[need to type 'yes' to confirm] yes

Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.

Démarrer le service DRBD :

# /etc/init.d/drbd start

Remarque  : les actions suivantes sont à réaliser uniquement sur le premier noeud.

Forcer la réplication des données de la ressource r0 depuis le premier noeud :

# drbdadm -- --overwrite-data-of-peer primary all

Vérifier le status de la ressource r0 :

# cat /proc/drbd

Créer le système de fichiers sur le volume DRBD :

# mkfs.ext3 /dev/drbd0

Intégration de la ressource DRBD sous Pacemaker

Créer le point de montage :

# mkdir /cluster

Exemple de configuration de Pacemaker :

# crm configure show
node vm-debian1
node vm-debian2
primitive ClusterDisk ocf:linbit:drbd \
        params drbd_resource="r0" \
        op monitor interval="15s"
primitive ClusterFS ocf:heartbeat:Filesystem \
        params device="/dev/drbd0" directory="/cluster" fstype="ext3"
primitive ClusterIP ocf:heartbeat:IPaddr2 \
        params ip="10.20.30.10" cidr_netmask="23" \
        op monitor interval="15"
primitive Nagios lsb:nagios \
        op monitor interval="15s" timeout="20s" \
        meta target-role="Stopped"
ms MasterSlaveDisk ClusterDisk \
        meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" target-role="Started"
colocation Nagios-with-ClusterFS inf: Nagios ClusterFS
colocation mount-ClusterFS-on-Master inf: ClusterFS MasterSlaveDisk:Master
colocation mount-ClusterIP-with-ClusterFS inf: ClusterIP ClusterFS
order Nagios-after-ClusterFS inf: ClusterFS Nagios
order mount-ClusterFS-after-ClusterDisk inf: MasterSlaveDisk:promote ClusterFS:start
order mount-ClusterIP-after-ClusterFS inf: ClusterFS ClusterIP
property $id="cib-bootstrap-options" \
        dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
        cluster-infrastructure="openais" \
        expected-quorum-votes="2" \
        stonith-enabled="false" \
        no-quorum-policy="ignore" \
        last-lrm-refresh="1334323679"
rsc_defaults $id="rsc-options" \
        resource-stickiness="100"

Exemple d’un problème de synchronisation

Sur le noeud 1 :

# drbdadm status
<drbd-status version="8.3.7" api="88">
<resources config_file="/etc/drbd.conf">
<resource minor="0" name="r0" cs="StandAlone" ro1="Primary" ro2="Unknown" ds1="UpToDate" ds2="DUnknown" />
</resources>
</drbd-status>

Sur le noeud 2 :

# drbdadm status
<drbd-status version="8.3.7" api="88">
<resources config_file="/etc/drbd.conf">
<resource minor="0" name="r0" cs="StandAlone" ro1="Secondary" ro2="Unknown" ds1="Outdated" ds2="DUnknown" />
</resources>
</drbd-status>

Ce à quoi cela correspond :

You suffer from schizophrenic DRBD, better known as “split brain”.

Basically it means that both nodes became primary on your test resource and started writing to it. The result is an inconsistent resource, which is then called “split brain”. Please read the documentation carefully, you will have to discard the data on one of your nodes and let drbd sync that node from scratch.

Déconnecter le noeud avec les “mauvaises” données :

# drbdadm -- --discard-my-data connect all

Lancer la synchronisation depuis le noeud avec les “bonnes” données :

# drbdadm connect all

Leave a Reply