Table des matières

Cluster with drbd8 and OCFS2

Article Original Posté par AtulAthavale on Tue 29 Jan 2008 at 13:04 http://www.debian-administration.org/articles/578

OS Installation

Installer 2 serveurs en Debian Etch.

Network Configuration

Node Hostname IP-Address Node1 node1 192.168.0.128 Node2 node2 192.168.0.129

Mise à jour du serveur

Sur Debian Etch, le montage d'un cluster Ocfs2 / DrBD 8 nécessite une mise à jour du kernel.

* Ajout d'une source APT

# vi /etc/apt/sources.list

Ajouter la ligne :

deb http://www.backports.org/debian etch-backports main contrib non-free

* Installer la clé permettant d'utiliser la ressource backports

# apt-get install debian-backports-keyring

* Mettre à jour le cache apt :

# apt-get update

* Installer le kernel nécessaire :

# apt-get install linux-image-2.6.25-2-686 linux-headers-2.6.25-2-686

* Mettre les paramètres systèmes suivant dans le fichier /etc/rc2.d/S99rc.local :

A modifier suivant votre configuration.

# cat /etc/rc2.d/S99rc.local
#! /bin/sh
### BEGIN INIT INFO
# Provides:          rc.local
# Required-Start:    $local_fs $remote_fs
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start() {
        if [ -x /etc/rc.local ]; then
                [ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.local)"
                /etc/rc.local
                ES=$?
                [ "$VERBOSE" != no ] && log_end_msg $ES
                return $ES
        fi
        /sbin/hdparm -a 4096 /dev/drbd0
        /bin/echo "256">/sys/block/sda/queue/nr_requests
        /sbin/ifconfig eth4 txqueuelen 1000
        echo 256960 > /proc/sys/net/core/rmem_default
        echo 256960 > /proc/sys/net/core/rmem_max
        echo 256960 > /proc/sys/net/core/wmem_default
        echo 256960 > /proc/sys/net/core/wmem_max
        echo 0 > /proc/sys/net/ipv4/tcp_timestamps
        echo 1 > /proc/sys/net/ipv4/tcp_sack
        echo 1 > /proc/sys/net/ipv4/tcp_window_scaling
        echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
        echo 30 > /proc/sys/net/ipv4/tcp_keepalive_intvl
        echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
        echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
}

case "$1" in
    start)
        do_start
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

* Redémarrer vos serveurs.

OCFS2

Installation

# apt-get install ocfs2-tools ocfs2console

Configuration

* Editer /etc/ocfs2/cluster.conf

# vi /etc/ocfs2/cluster.conf
node: 
        ip_port = 7777
        ip_address = 192.168.0.128
        number = 0
        name = node1
        cluster = ocfs2

node:
        ip_port = 7777
        ip_address = 192.168.0.129
        number = 1
        name = node2
        cluster = ocfs2

cluster:
        node_count = 2
        name = ocfs2

* Reconfigure ocfs2

# dpkg-reconfigure ocfs2-tools
# /etc/init.d/o2cb restart

DrBD 8

http://en.wikipedia.org/wiki/Drbd

Installation

# apt-get install drbd8-utils drbd8-module-source drbd8-source  build-essential
# m-a a-i drbd8
# depmod -ae
# modprobe drbd

Configuration

* Editer /etc/drbd.conf

# vi /etc/drbd.conf
global {
    usage-count yes;
}

common {
  syncer { rate 300M; }
}

resource r0 {
  protocol C;
  handlers {
    pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
    pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
    local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
    outdate-peer "/usr/sbin/drbd-peer-outdater";
  }

  startup {
  }

  disk {
    on-io-error   detach;
  }

  net {
    timeout 600;
    connect-int 60;
    ping-int 30;
    ping-timeout 50;
    allow-two-primaries;
    after-sb-0pri disconnect;
    after-sb-1pri disconnect;
    after-sb-2pri disconnect;
    rr-conflict disconnect;
    sndbuf-size 2M;
    max-buffers 16000;
    max-epoch-size 16000;
    unplug-watermark 16000;
  }

  syncer {
    rate 300M;
    al-extents 1801;
  }

  on node1 {
    device     /dev/drbd0;
    disk       /dev/sda3;
    address    192.168.0.128:7788;
    flexible-meta-disk  internal;
  }

  on node2 {
    device    /dev/drbd0;
    disk      /dev/sda3;
    address   192.168.0.129:7788;
    meta-disk internal;
  }
}

* Format la partition

# mkfs.ocfs2 /dev/sda3

* Ajouter le group haclient

# vi /etc/group
haclient:x:107:

* Positionner les droits sur les binaires DrBD

# 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

* Créer le meta-device

# drbdadm create-md r0

* Démarrer DrBD

# /etc/init.d/drbd restart

* Passer les 2 membres en Primaire/Primaire

# drbdsetup /dev/drbd0 primary -o

Init script

* Editer /etc/init.d/mountdrbd.sh

# vi /etc/init.d/mountdrbd.sh
drbdadm primary r0
/sbin/modprobe ocfs2_stackglue
mount.ocfs2 /dev/drbd0 /data

* Mettre les droits d'exécution

# chmod +x /etc/init.d/mountdrbd.sh

* Installer le script dans la démarrage automatique :

# update-rc.d mountdrbd.sh start 72 2 3 4 5 . stop 10 0 6 .
Adding system startup for /etc/init.d/mountdrbd.sh ...
  /etc/rc0.d/K10mountdrbd.sh -> ../init.d/mountdrbd.sh
  /etc/rc6.d/K10mountdrbd.sh -> ../init.d/mountdrbd.sh
  /etc/rc2.d/S72mountdrbd.sh -> ../init.d/mountdrbd.sh
  /etc/rc3.d/S72mountdrbd.sh -> ../init.d/mountdrbd.sh
  /etc/rc4.d/S72mountdrbd.sh -> ../init.d/mountdrbd.sh
  /etc/rc5.d/S72mountdrbd.sh -> ../init.d/mountdrbd.sh

Le choix du niveau de démarrage dépend de celui du package drbd

* Lancer le script

# /etc/init.d/mountdrbd.sh

Voilà votre cluster est prêt à fonctionner.

# cat /proc/drbd
version: 8.0.12 (api:86/proto:86)
GIT-hash: 5c9f89594553e32adb87d9638dce591782f947e3 build by phil@mescal, 2008-04-24 13:29:44
 0: cs:Connected st:Primary/Primary ds:UpToDate/UpToDate C r---
    ns:3843 nr:6084218 dw:6088061 dr:8026 al:1 bm:372 lo:0 pe:0 ua:0 ap:0
        resync: used:0/61 hits:379652 misses:372 starving:0 dirty:0 changed:372
        act_log: used:0/257 hits:7657 misses:1 starving:0 dirty:0 changed:1

En cas de panne

Si les membres de votre cluster ne se connectent plus entre eux, que le port d'écoute disparait dès que le service est lancé sur le second membre, voici ce que vous devez faire :

* Sur le membre primaire :

# /etc/init.d/drbd stop
Stopping all DRBD resources.
# drbdadm create-md r0

Valid meta-data already in place, recreate new?
[need to type 'yes' to confirm] yes

Creating meta data...
initialising activity log
initialising bitmap (208844 KB)
100%
New drbd meta data block sucessfully created.
# /etc/init.d/drbd start
Starting DRBD resources:    [ d0 s0 n0 ].
# drbdsetup /dev/drbd0 primary -o

* Sur le membre secondaire :

# /etc/init.d/drbd stop
Stopping all DRBD resources.
# /etc/init.d/drbd start
Starting DRBD resources:    [ d0 s0 n0 ].
# drbdadm primary all

vous pouvez remonter la partition sur les 2 membres. Les 2 membres vont se resynchroniser.