Um Daten im gesamten Netzwerk von überall aus zugänglich zu machen, ist NFS der perfekte Sportwagen. Damit deine Daten bei einer Oracle-Datenbank aber nicht jedes Mal an einer roten Ampel stehen bleiben, solltest du auf dNFS upgraden und deiner Datenbank damit eine eigene Rennstrecke komplett am Betriebssystem vorbei bauen.
Was ist NFS (Network File System)
NFS ist ein Betriebssystem Feature welches einem Server erlaubt auf Storages innerhalb des eigenen Netzwerks zuzugreifen und so zu tun als ob dieses auf der eigenen Festplatte läge. Dies ist vor allem vom Vorteil da von verschiedenen Servern aus gleichzeitig auf das selbe Storage/ die selben Dateien zugegriffen werden kann. So ist das NFS-Storage eine unabhängige Komponente im Netzwerk und von allen System im Netzwerk erreichbar. Dies ist unter anderem sehr gut für Backups da diese dann sofort auf einer externen Hardware liegen und (so wie es für Backups sein sollte) unabhängig vom Datenbank-Server sind.
Warum sollte man NFS verwenden
Hier einmal zusammengefasst warum man bei einer Oracle Datenbank NFS verwenden sollte:
- Kann gleichzeitig von einem oder mehreren Servern im Netzwerk erreicht werden – beispielsweise als Cluster Filesystem für RAC.
- Die Daten liegen auf einer Storage und sind somit vom Server unabhängig.
- Zumindest mit Oracle dNFS ist die Performance und der CPU Overhead geringer als mit lokalen Filesystemen oder SAN
- In Virtualisierung kann die VM die NFS Mounts direkt machen – somit weniger Overhead durch Virtualisierung selbst (es finden weniger Context Switches statt und die Blöcke werden weniger oft zwischenkopiert).
Beispiel mit NetApp Storage
Volume erstellen
Das Volume soll nur soviel Platz belegen, den die Datenbank aktuell benötigt. Im Fall von NetApp Storages kann man dies mittels auto-shrink und auto-grow wunderbar umsetzen. Speziell die Archivelog Volumes können bei einem Data Load, Import oder Reorg sehr schnell viel Platz benötigen und – sobald diese gesichert wurden – wieder freigeben. Bei anderen Speicherlösungen (lokale Filesysteme, SAN, iSCSI) muss man immer so viel Platz vorhalten, wie man maximal braucht.
Damit man dies auch noch sinnvoll monitoren kann – beispielsweise eine Warnung bei 90% und ein Critical bei 95% Füllgrad – legt man den Schwellwert für Autogrow auf 89%. Solange in der Storage noch Platz ist, bzw. die maximale Größe des Volumes nicht erreich ist, wird es niemals einen Alarm gehen. Für Oracle Datenbanken ist die Nutzung von SnapShot-Reserve nicht sinnvoll. Entweder nutzt man kein Snapshoting (was schade wäre, aber das ist ein anderer Blog…) oder diese ist im Fall von Archivelog Volumes immer falsch (zu klein). Daher einfach auf 0 setzen und durch sinnvolles Monitoring lösen. Die User- und GroupID sind die Defaults von Oracle Preinstall Package und man erspart sich ein CHOWN nach dem Mounten des NFS Volumes.
volume create -volume VOLUME_NAME -aggregate aggr1_aff220a -junction-path /VOLUME_NAME -size 1G -min-autosize 1G -max-autosize 100G -autosize-mode grow_shrink -autosize-shrink-threshold-percent 79 -autosize-grow-threshold-percent 89 -state online -type rw -unix-permissions ---rwxr-xr-x -space-guarantee none -snapshot-policy none -percent-snapshot-space 0 -foreground true -user 54321 -group 54321 -policy myPolicy
Erklärung der Parameter
-aggregate aggr1_aff220a # Name des Aggregates in der Storage
-junction-path /VOLUME_NAME # Name des Mountpoints (Storage NFS Export)
-size 1G # Größe beim Anlegen des Volumes
-min-autosize 1G # min Größe des Volumes
-max-autosize 100G # max Größe für Autogrow
-autosize-mode grow_shrink # wächst wenn Daten dazu kommen schrumpft wenn Daten gelöscht werden
-autosize-shrink-threshold-percent 79 # wenn weniger als 79% genutzt werden schrumpft es
-autosize-grow-threshold-percent 89 # wenn mehr als 89% genutzt werden wächst es
-state online # Nach dem Anlegen ist das Volume Online
-type rw # Read Write Volume
-unix-permissions ---rwxr-xr-x # Default Rechte auf dem OS
-space-guarantee none # Thin provisioned
-snapshot-policy none # keine automatischen Snapshots
-percent-snapshot-space 0 # kein Speicher für Snapshots reserviert
-foreground true # Volume wird im Vordergrund erstellt (Konsole erst freigegeben wenn das Voulme erstellt wurde)
-user 54321 # Gehört User (in dem Fall oracle)
-group 54321 # Gehört Gruppe (in dem Fall oinstall)
-policy myPolicy # Aktive Policy = myPolicy
Das Volume auf dem System einbauen
Dieser Blog bezieht sich auf Oracle Linux 8 und 9 sowie auf Oracle Database 19c und Oracle Database 26ai. Bei anderen Betriebssystemen und älteren Oracle Versionen kann es etwas anders sein.
Um NFS auf einem Oracle Linux 8 oder 9 einzurichten muss das Package nfs-utils installiert sein. Dies ist auch schon im Oracle Preinstall vorhanden. Falls es auf dem System nicht installiert ist kann man es so installieren:
dnf install -y nfs-utils
NFS-Volumes auf dem Betriebssystem Mounten
Oracle gibt beim Mounten gewisse Parameter vor, diese findet man hier: https://docs.oracle.com/en/database/oracle/oracle-database/19/ssdbi/configuring-nfs-buffer-size-parameters-for-oracle-database.html
Einmalig Mounten
Es besteht die Möglichkeit ein Volume nur einmalig also bis zum Ersten Reboot zu mounten. Dies wird für Volumes verwendet, die nicht dauerhaft gebraucht werden wie z.B. ein Volume wo die neusten Patches oder Software liegen.
mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,vers=3,timeo=600,actimeo=0 192.168.1.222:/VOLUME_NAME /u01/app/oracle/VOLUME_NAME
NFS Versionen und Erklärung der Mount Optionen
Oracle unterstützt NFSv3 und NFSv4 / NFSv4.1, wobei die Empfehlung (der Default) von Oracle selbst bis vor kurzem NFSv3 war. Erst ab 19.32 ändert Oracle den Default auf NFSv4. NFSv3 hat den Vorteil, dass es einfacher zum Implementieren geht und weniger CPU (sowohl am Datenbank Server als auch in der Storage) benötigt wird und somit schneller ist. Beginnend mit NFSv4 ist die Security besser und es werden ab NFSv4.1 – ansatzweise – Funktionen wie Parallel NFS unterstützt (allerdings nur eingeschränkt).
mount
-t nfs # Legt fest das es NFS ist
-o # Liste mit Optionen mitgeben beim Mounten
rw # Read Write erlaubt
bg # Der Mount erfolgt im Hintergrund
hard # Mount Modus (HARD -> Wenn das Netzwerk ausfällt stoppt alles und wartet bis das Netzwerk wieder da ist)
nointr # Wartet auf NFS bei Latenzproblemen oder ähnlichem
rsize=32768 # Blockgröße für Lese Geschwindigkeit, Oracle dNFS nutzt intern 65536
wsize=32768 # Blockgröße für Schreib Geschwindigkeit
tcp # Kommunikation läuft über TCP
vers=3 # Gibt die Benutzte NFS Version an (in dem Fall 3)
timeo=600 # Timeout 60s danach probiert er wieder ein Connect
actimeo=0 # Es wird alles (File Attribute) Direkt von NFS geholt und nicht aus dem Cache
192.168.1.222:/VOLUME_NAME /u01/app/oracle/VOLUME_NAME # Wohin gemounted werden soll
Permanentes Mounten
vi /etc/fstab
192.168.1.222:/VOLUME_NAME /u01/app/oracle/VOLUME_NAME nfs rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,vers=3,timeo=600,actimeo=0 0 0
Erklärung
Beim permanenten Mounten gibt es zwei zusätzliche Parameter
0 # Dump darf dieses Laufwerk/ NFS nicht automatisch kopieren
0 # Beim Neustart/ nach Absturtz wird dieses Laufwerk/ NFS nicht geprüft
Alle mountbaren Volumes ansehen
Mit showmount -e sieht man alle Volumes die man Mounten kann sehen
showmount -e 192.168.1.222
Mounten
mkdir -p /u01/app/oracle/VOLUME_NAME
systemctl daemon-reload
mount -a
Was ist dNFS
Oracle Direct NFS (dNFS) ist ein datenbankspezifisches Feature von Oracle, über welches die Datenbank direkt ohne Umwege auf das NFS-Storage zugreifen kann. Dies ist ein exklusiver Bestandteil der Oracle-Datenbank-Software.
NFS vs Oracle dNFS
Als Beispiel nehmen wir folgende Ausgangssituation: Du arbeitest in einem Büro und brauchst ständig Akten aus dem Archievraum im Keller (NFS).
Normales NFS:
Theoretische Erklärung:
Du darfst nicht selber in den Keller gehen und dir die Akten holen sondern du musst ein Formular ausfüllen und es dem Postboten (das Betriebssystem) geben. Der Postbote nimmt das Formular und läuft jedes mal zum Archive und holt dir deine Akten. Das dauert immer länger selbst wenn der Postbote schnell ist.
Praktische Erklärung:
Das Betriebssystem holt sich die Daten über das Netzwerk in den Cache des Betriebssystems. Danach kopiert es die Daten in den Speicher der Datenbank (Double Buffering).
- Wer holt die Daten: Das Betriebssystem
- Weg: NFS Storage -> Netzwerk -> OS Cache -> kopieren -> Datenbank Speicher
dNFS:
Theoretische Erklärung:
Du bekommst den Schlüssel zum Archive und kannst selber jederzeit ins Archive gehen und dir die Akten holen. Dies ist schnell da es keinen Zwischenschritt gibt (Postbote).
Praktische Erklärung:
Die Datenbank Software holt sich die Daten über das Netzwerk direkt in den Speicher der Datenbank. Das Spart CPU-Leistung
- Wer holt die Daten: Die Datenbank Software
- Weg: Datenbank -> Netzwerk -> NFS Storage
Vorteile von dNFS zusammengefasst
- Oracle dNFS ist direkt in den Oracle Datenbank Kernel integriert und reduziert damit die Context Switches erheblich.
- Es werden wirklich nur die benötigten Daten gelesen/geschrieben – bei NFS Clients wird oft Read Ahead gemacht und somit unnötig Daten angefordert.
- Das dNFS Protokoll ist auf den Bedarf der Datenbank optimiert und benötigt dadurch weniger CPU.
- Kann auch bei Oracle unter Windows genutzt werden – obwohl Windows NFS nicht nativ unterstützt!
- Wenn der Server mit dem NFS Storage mit 4 Kabeln verbunden ist nutzt NFS standardmäßig nur 1 Kabel. Im Gegensatz dazu verteilt dNFS die Last auf alle 4 Kabel. Fällt ein Kabel aus erkennt dNFS dies und verteilt (ohne Unterbrechung) die Last auf die restlichen 3 Kabel.
- Fallback: Falls die Datenbanksoftware nicht auf das NFS Storage zugreifen kann, wechselt dNFS automatisch auf das normale NFS.
dNFS aktivieren
Voraussetzung: NFS muss vorhanden sein und gemountet
Info: Die Downtime dauert in der Regel wenige Sekunden
Aktivieren von dNFS
Alle Instanzen aus dem betroffenen Oracle Home müssen für das aktivieren von dNFS gestoppt werden ( Datenbank, Listener, … ).
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk dnfs_on
Jetzt können die Instanzen wieder gestartet werden.
Deaktivieren von dNFS
Um dNFS zu deaktivieren muss man nahezu das gleiche machen wie um es zu aktivieren:
Zuerst alle Instanzen aus dem Oracle Home stoppen.
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk dnfs_on
und danach wieder starten.
Überprüfen ob ein Volume von der Datenbank unter dNFS läuft
Nach dem Neustart der Datenbank und ihren Prozessen können wir überprüfen ob dNFS von Volumes auf der Datenbank genutzt wird aktiv ist.
Es werden alle Volumes angegeben die auf der Datenbank unter dNFS laufen.
sqlplus / as sysdba
col DIRNAME format A80
col SVRNAME format A50
col NFSVERSION format A20
select DIRNAME, SVRNAME, NFSVERSION from v$dnfs_servers;
Output
DIRNAME SVRNAME NFSVERSION
---------------------------------------------------------------------
VOLUME_NAME 192.168.1.222 NFSv3.
INFO: Falls No Rows Selected zurück kommt wurde keine dNFS Volumes von dieser Datenbank gefunden.
Zusätzlich kann man im Alert log nach Direct NFS suchen und muss diese Zeile finden falls dNFS aktiviert ist (die Version kann sich ändern)
SELECT message_text
FROM v$diag_alert_ext
WHERE message_text LIKE '%Direct NFS%'
ORDER BY originating_timestamp DESC;
Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 6.0