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
exports Config
Wenn man den selben Share mit unterschiedlichen Berechtigungen an verschiedene Server exportieren möchte, sind hier ein paar Config Beispiele:
File: /etc/exports
alle 4 Server Haben vollen Zugang auf das /backup Verzeichnis:
/backup -maproot=root -alldirs corky tesla patsy violet-new
Zwei Server haben nur Read Only Berechtigung auf /www:
/www -ro patsy violet-new
Unterschiedliche Berechtigungen: Patsy hat auf /www nur Read, Violet-New hat Vollzugriff:
# Für patsy mit Leseberechtigung
/www -ro patsy
# Für violet-new mit Schreibberechtigung
/www -maproot=root violet-new
Alternative Config Methode für das Gleiche:
# Für patsy mit Leseberechtigung
/www -ro -mapall=nobody patsy
# Für violet-new mit Schreibberechtigung
/www -maproot=root violet-new
Nach dem Ändern jeweils die configs und mount neu laden (auf Server):
sudo service nfsd restart
sudo service mountd reload
Danach sieht man die neuen Mounts auf den Clients wieder mit diesem Befehl:
showmount -e violet
Exports list on violet:
/backup corky tesla patsy violet-new
/www patsy violet-new
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.
ls: cannot access ‚/backup‘: Stale file handle
Problem trat auf, nachdem ich die Backup Disk ausgewechselt hatte. Lösung, einfach mountpoints neu erstellen bei den nfs clients:
umount -f /backup
mount -a
.