Wir installieren einen hochverfügbaren NFS-Server basierenden auf Debian 12. Der NFS-Server wird als Active-Passive installiert. Beim Ausfall des Primären Knotens wird der Sekundäre Knoten automatisch einspringen.

Basisinstallation

Ich setze voraus das 2 Systeme mit Netzwerk miteinander verbunden sind und grundsätzlich installiert sind. Dazu zählt die Installation des Betriebssystems. Die beiden Knoten müssen 2 Harddisks haben, eine für das OS und eine für die NFS Freigaben. Die 2. Harddisk darf nicht gemountet werden.

Setup

Alle nachfolgenden Commandos führst du auf beiden Knoten aus (IPs und co. entsprechend anpassen)

nano /etc/network/interfaces

iface eth0 inet static
        address 172.20.96.66/67
        netmask 255.255.255.0
        network 172.20.96.0
        broadcast 172.20.96.255
        gateway 172.20.96.253

Ersetze das „eth0“ mit dem Interface-Namen den dein System hat, sowie die Netzwerkdaten mit denen aus deinem Netzwerk.

Ergänze in der Hosts-Datei die nachfolgende Zeile

nano /etc/hosts

172.20.96.66/67      nfs0001.local.loc      nfs0001

Hostnamen ändern

echo nfs0001.local.loc > /etc/hostname
/bin/hostname -F /etc/hostname

Nun den Network-Stack neustarten

/etc/init.d/networking restart

Aktualisiere die Pakete

apt-get update
apt-get upgrade -y

NFS-Server Setup

Führe folgende Commandos auf beiden Servern aus:

apt-get install ntp ntpdate
apt-get install nfs-kernel-server
update-rc.d -f nfs-kernel-server remove
update-rc.d -f nfs-common remove

Diese Installieren den NFS Server und entfernen ihn aus dem Autostart.

Exports erstellen

nano /etc/exports
/data/freigabe/ 0.0.0.0/0.0.0.0(rw,no_root_squash,no_all_squash,sync)

In der /etc/exports werden die Freigaben erstellt. /data ist das später gemountete Drive. /freigabe/ ist ein freiwählbarer Name für den Share. 0.0.0.0/0.0.0.0 oder auch einfach * bedeutet, dass alle Clients zugreifen können. Soll das nicht so sein, kannst du einfach die IP des Clients oder ein bestimmtes Netzwerk dort eintragen.

apt-get install drbd-utils

Installation von DRBD.

nano /etc/drbd.d/global_common.conf

Ergänze die conf um folgenden Inhalt:

Disk{
resync-rate         3123M; # bytes/second, default
c-plan-ahead        20; # 1/10 seconds, default
c-delay-target      10; # 1/10 seconds, default
c-fill-target       1M; # bytes, default
c-max-rate          3123M; # bytes/second, default
c-min-rate          250k; # bytes/second, default
}
net {
protocol C;
max-buffers             80k;
sndbuf-size            10M ;
rcvbuf-size            10M;
}

Die Knoten Disk und net sind bereits vorhanden. Ergänze die einzelnen Settings darunter. Diese sind optimiert auf 10G Netzwerk – sollte aber auch mit 1G Netzwerk funktionieren.

Erstelle eine neue Datei mit nano /etc/drbd.d/freigabe.res. „freigabe“ steht hier für einen beliebigen Namen.

Darin definierst du die Server, Drives, Netzwerk usw.

resource freigabe {
 on nfs0001.local.loc {          # ** EDIT ** the hostname of server 1 (uname -n)
   device     /dev/drbd0;        #
   disk       /dev/sdb;         # ** EDIT ** data partition on server 1
   address    172.20.96.66:7788; # ** EDIT ** IP address on server 1
   meta-disk  internal;      # ** EDIT ** 128MB partition for DRBD on server 1
  }
 on nfs0002.vop.loc {            # ** EDIT ** the hostname of server 2 (uname -n)
   device    /dev/drbd0;         #
   disk      /dev/sdb;          # ** EDIT ** data partition on server 2
   address   172.20.96.67:7788;  # ** EDIT ** IP address on server 2
   meta-disk internal;       # ** EDIT ** 128MB partition for DRBD on server 2
  }
}

Nun führen wir noch folgendes aus : modprobe drbd

Service drbd restart
 
drbdadm create-md cc02vcd
drbdadm up all
mkdir /data

Alle o.g. Schritte sind auf beiden Knoten durchzuführen.

Einstellungen für NFS-Server Knoten 1

drbdadm up freigabe
drbdadm primary --force freigabe

Nun wurde das Cluster initialisiert. Es findet ein Initialer Sync statt. Über den Nachfolgenden Befehl kannst du überprüfen ob der NFS-Server Cluster fertig initialisiert ist. Dazu muss UpToDate/UpToDate in der Ausgabe stehen

cat /proc/drbd

Wenn der Sync abgeschlossen ist können wir die 2. Festplatte am primären Knoten formatieren und mounten, sowie einige Config-Daten für NFS darauf schieben

mkfs.ext4 /dev/drbd0
mount -t ext4 /dev/drbd0 /data
mv /var/lib/nfs/ /data/
ln -s /data/nfs/ /var/lib/nfs
mkdir /data/cc02vcd
umount /data

NFS-Server Setup Knoten 2

Nur für Knoten 2 stellen wir ein, dass die NFS Config auf dem /data Drive zu finden ist.

rm -fr /var/lib/nfs/
ln -s /data/nfs/ /var/lib/nfs

Erstmal fertig, und jetzt?

DRBD ist jetzt grundsätzlich fertig. Jedoch ist das ganze noch etwas weg von „hochverfügbar“. Daher konfigurieren wir im nächsten Schritt noch Heartbeat. Heartbeat sorgt dafür dass der CLuster die NFS Rolle schwenken kann und wir eine Virtuelle IP Adresse haben, mit der wir den Cluster ansprechen können.

Dazu installieren wir Heartbeat zunächst auf beiden Knoten:

apt-get install heartbeat

In der sysctl.conf fügen wir eine Zeile hinzu, damit wir VIPs einsetzen können. Dazu gehen wir wie folgt vor:

nano /etc/sysctl.conf
#füge die nachfolgende Zeile in der Datei ein.
net.ipv4.ip_nonlocal_bind=1

Nun übernehmen wir die neuen Einstellungen mit:

sysctl -p

Wir erstellen mit nano /etc/ha.d/authkeys eine neue Datei. Dessen Inhalt ist:

auth 3

3 md5 somerandomstring

Den Teil „somerandomstring“ kannst du anpassen in eine persönliche Passphrase.

Wir ändern dann die Berechtigungen der Datei:

chmod 600 /etc/ha.d/authkeys

Nun müssen wir die HA-Ressourcen anlegen. Dazu werden weiterhin auf beiden Knoten die nachfolgenden Einstellungen getätigt:

Auf beiden Knoten wir die Datei /etc/heartbeat/ha.cf erstellt und folgender Inhalt eingefügt (bitte auf deine Namen und IPs anpassen):

Knoten 1 + 2 (bei ucast jeweils die IP des anderen Knoten angeben. ens192 ggf. auf den Interface Namen deines Systems ändern):

#
#       keepalive: how many seconds between heartbeats
#
keepalive 2
#
#       deadtime: seconds-to-declare-host-dead
#
deadtime 10
#
#       What UDP port to use for udp or ppp-udp communication?
#
udpport        694
bcast  ens192
mcast ens192 225.0.0.1 694 1 0
ucast ens192 172.20.96.67 #die IP des anderen Knotens
#       What interfaces to heartbeat over?
udp     ens192
#
#       Facility to use for syslog()/logger (alternative to log/debugfile)
#
logfacility     local0
#
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    nfs0001.local.loc
node    nfs0002.local.loc

Nun erstellen wir die Datei /etc/ha.d/haresources

nfs0001.local.loc  IPaddr::172.20.96.104/24/ens192 drbddisk::freigabe Filesystem::/dev/drbd0::/data::ext4 nfs-kernel-server

Auch diese Einstellungen machst du auf beiden Knoten. Jedoch enthalten beide Knoten exakt den selben Inhalt. Hier steht immer der Name des ersten Knotens drin. Hinter „IPaddr::“ gibst du deine Virtuelle IP an, die du verwenden möchtest. Ändere ggf. ens192 in dein interface und drbddisk::freigabe in den Namen deiner Freigabe.

Fast fertig

Abschließend können wir den Service heartbeat auf beiden Knoten starten

/etc/init.d/heartbeat start

Folgende Dinge kannst du jetzt prüfen.

  1. Prüfe ob der Cluster in Sync ist (cat /proc/drbd)
  2. Der primäre Knoten sollte zusätzlich zu seiner IP auch die VIP haben (ip addr)
  3. Der primäre Knoten sollte /data gemountet haben (df -h)

Ist das alles der Fall sollte auch alles soweit funktionieren.

Zum testen kannst du den Heartbeat Service auf dem primären Knoten stoppen. Die VIP und der Mount „wandern“ dann zum Secondary Knoten.

/etc/init.d/heartbeat stop

Prüfe auf deinem 2. Knoten mit „ipaddr“ ob er die VIP bekommen hat und mit „df -h“ ob er den /data Mount hat.

Ist das der Fall sind wir fertig. Du kannst deinen hochverfügbaren NFS-Server jetzt über die virtuelle IP ansprechen.

Noch mehr Tutorials? Schau mal hier -> Klick