Installation NFS (Network File System)

Ich war ganz euphorisch, als ich mit meinen FreeBSD Servern in die Cloud wechselte. Da man hier die Möglichkeit hat, Disks unter diversen Servern zu sharen, habe ich so von einem einfachen und effizienten Loadbalancing geträumt. Also einfach die Webserver Daten auf einer einzigen Disk lagern, welche an mehreren Webservern angeschlossen ist.

Als ich schon fast alles fertig installiert hatte, habe ich mal versucht vom einen Server aus Daten auf die gesharte Platte zu schreiben und vom zweiten Server aus die Daten zu lesen… Nur leider ist dies nicht möglich. Die Änderungen erschienen bei Server 2 nicht.

Das Problem ist hier, dass FreeBSD bis heute (FreeBSD 9.0) kein Clustered-Filesystem für Shared Disks unterstützt (so wie z.B.  GFS von RedHat oder OCFS von Oracle). Damit war mein Traum für ein einfaches Loadbalancing unter FreeBSD fürs erste ausgeträumt.

Bei meiner Suche nach einer Lösung bin ich auf einen interessanten Blog von Erik Scholtz gestossen, der genau dieses Thema behandelt. Vielleicht werde ich auf diese Lösung später einmal zurückgreifen. Bis dahin werde ich versuchen mit Apache Optimierungen zu besseren Resulaten zu kommen 😉

Jedoch möchte ich meine Backup- und Monitoring-Disks trotzdem für alle Server zentral zur Verfügung stellen. Das mache ich mit NFS. NFS bietet sich für Webserver nicht wirklich an, da es zu langsam ist. Für Backups oder andere Daten, bei denen die Lese- und Schreibgeschwindigkeit nicht essenziell ist, reicht es aber allemal.

Installation

Hier der Link zum offiziellen FreeBSD Manual

NFS Server

Der Daemon wird auf dem Server installiert, der die Harddisks sharen möchte. Hier einfach folgendes ins rc.conf eintragen:

vi /etc/rc.conf
#-----------------------------------------------#
#       NFS Fileserver                          #       
#-----------------------------------------------#
rpcbind_enable="YES"
nfs_server_enable="YES"
nfs_server_flags="-u -t -n 4"
mountd_flags="-r"

Erklärung zu den Flags:

-n     Specifies how many servers to create.
-t      Serve TCP NFS clients.
-u     Serve UDP NFS clients.

     Unless otherwise specified, four servers for UDP transport are started.

     For example, „nfsd -u -t -n 6“ serves UDP and TCP transports using six
     daemons.

     A server should run enough daemons to handle the maximum level of concur-
     rency from its clients, typically four to six.

Mit nfsstat kann man sonst weitere Daten über NFSD herausfinden um die optimale Anzahl der Server herauszufinden.

Nun das File /etc/exports erstellen und die gewünschten Zeilen eintragen:

vi /etc/exports
/backup -maproot=root -alldirs 10.0.0.2 10.0.0.3 10.0.0.4
/monitoring -maproot=root -alldirs 10.0.0.2 10.0.0.3 10.0.0.4

oder direkt mit hosts eingabe, was natürlich flexibler ist:

/backup -maproot=root -alldirs corky tesla patsy
/monitoring -maproot=root -alldirs corky tesla patsy

Falls mountd bereits läuft, reloaden, damit die neue Konfig geladen wird:

/etc/rc.d/mountd onereload

Jetzt noch ins hosts.allow rein (Wenn das fehlt, gibt es den Error: rpcbind: connect from 10.0.0.1 getport/addr(mountd): request from unauthorized host):

 vi /etc/hosts.allow 
# Rpcbind is used for all RPC services; protect your NFS!
# (IP addresses rather than hostnames *MUST* be used here)
#rpcbind : 192.0.2.32/255.255.255.224 : allow
#rpcbind : 192.0.2.96/255.255.255.224 : allow
rpcbind : 10.0.0.1 : allow
rpcbind : 10.0.0.3 : allow
rpcbind : 10.0.0.4 : allow
rpcbind : ALL : deny

NFS Server starten:

Man könnte jetzt auch gleich den Server komplett rebooten, aber so gehts auch zum testen:

rpcbind;nfsd -u -t -n 4;mountd -r

Wenn alles läuft,

# ps auxf | grep nfs
root   1532   0.0  0.1  10080   1708  ??  Is    6:00PM  0:00.03 nfsd: master (nfsd)
root   1533   0.0  0.1  10080   1356  ??  S     6:00PM  0:00.00 nfsd: server (nfsd)

Server gleich noch rebooten.

sync;sync;reboot

Normaler Restart des NFS Servers:

/etc/rc.d/nfsd restart

NFS Client

Als erstes wieder den Client Konfigurieren:

vi /etc/rc.conf

Und diese Zeilen einfügen

#-----------------------------------------------#
#       NFS Fileserver                          #
#-----------------------------------------------#
nfs_client_enable="YES"
nfs_client_flags="-n 4"

Erklärung der Flags:

-n      Specify how many processes are permitted to be started.

     Without an option, nfsiod displays the current settings.  A client should
     allow enough number of processes to handle its maximum level of concur-
     rency, typically four to six.

Nun den Client starten:

nfsiod -n 4

Jetzt kann man schon nachsehen, was man mounten kann:

# showmount -e violet
Exports list on violet:
/monitoring                        corky tesla patsy 
/backup                            corky tesla patsy 

Nun mounten:

mount violet:/backup /backup
mount violet:/monitoring /monitoring

und tadaaaaaaaaaa… 🙂

# df
Filesystem         1024-blocks    Used     Avail Capacity  Mounted on
/dev/vtbd0p2           1547804  625740    798240    44%    /
devfs                        1       1         0   100%    /dev
/dev/vtbd0p3           1031708    8388    940784     1%    /tmp
/dev/vtbd0p4           6184220   92904   5596580     2%    /var
/dev/vtbd1p1          10318968 6203104   3290348    65%    /usr
/dev/vtbd2s1e         10143212       8   9331748     0%    /data
/dev/vtbd2s1d         50778204       8  46715940     0%    /www
violet:/backup       151326652 5702772 133517748     4%    /backup
violet:/monitoring     1015164    1296    932656     0%    /monitoring

so, jetzt noch im /etc/fstab  eintragen, damit die Verzeichnisse beim reboot wieder da sind:

vi /etc/fstab 

einfügen:

#
violet:/backup  /backup         nfs     rw      0       0
violet:/monitoring      /monitoring     nfs     rw      0       0

So, zum Abschluss noch alle Server neu booten, damit es später keine unerwarteten Überraschungen mehr geben kann:

 sync;sync;reboot

Die vollständige Anleitung kann im FreeBSD Handbuch nachgelesen werden.

Normaler Restart des NFS Clients:

/etc/rc.d/nfsclient restart

Problemlösung

Stale NFS file handle

Manchmal kann es zu dieser Fehlermeldung kommen. Bei mir war es, nach dem ich neu gemounted habe. Der Fehler kann aber anscheinend auch sonst plötzlich mal auftreten.

root@corky(/)> ll backup/
total 0
ls: backup/: Stale NFS file handle

Also nochmals umounten und neu mounten. Dann sollte Fehler weg sein.

root@corky(/)> umount -f /backup
root@corky(/)> mount violet:/backup /backup

RPC: Port mapper failure

Wenn man zum NFS Server keine Verbindung erhält, sondern nur diesen Fehler

root@violet(/)> showmount -e corky
RPC: Port mapper failure

Liegt es wahrscheinlich daran, dass auf dem Server im /etc/hosts.allow noch nicht die korrekten Einträge drin stehen. Wenn die korrekt sind und es trotzdem nicht geht, Firewall und Denyhosts Settings checken!

vi /etc/hosts.allow 
rpcbind : 10.0.0.1 : allow
rpcbind : 10.0.0.2 : allow
rpcbind : 10.0.0.3 : allow
rpcbind : 10.0.0.4 : allow
rpcbind : ALL : deny

Apr 14 02:23:01 tesla kernel: newnfs server <server>:/global: not responding

Könnte sein, das während der Backups NFS überlastet war und es daher zu Timeouts kam. Es gibt hier verschiedene Lösungsansätze. Die einen sagen, wenn sie von TCP auf UDP gewechselt haben, sei das Problem verschwunden. Andere sagen, man müsse ein Timeout erhöhen (Ich habe jedoch keine Timeout Settings in den Flags gefunden. Das einzige wäre noch nfs_access_cache -> das ist per Default auf 60 Sekunden gesetzt).

Wahrscheinlich lässt sich das Problem beheben, indem man die Servers beim NFS Server erhöht. Also den -n Flag erhöhen:

nfs_server_flags="-u -t -n 4"

auf -n 6, -n 8 etc. Danach NFS Server neu starten:

/etc/rc.d/nfsd restart

Eventuell gibt

nfsstat

noch Hinweise dazu, was man optimieren könnte.

.

Flattr this!

  • *

    Du kannst diese HTML tags verwenden: <a> <abbr> <acronym> <b> <blockquote> <cite> <code> <del> <em> <i> <q> <s> <strike> <strong>

  • Kommentar-Feed für diesen Beitrag
nach oben