Statische Dateien mit Nginx über NFS bereitstellen?

9

Ich habe eine Website, die ungefähr 7.000 Anfragen pro Sekunde auf einem Nginx-Server erhält. Dieser Server übernimmt sowohl das Umschreiben auf einen Apache-Server als auch das direkte Bereitstellen statischer Dateien, Bilder usw. Statische Dateien sind mit etwa 5.000 Anfragen der größte Teil.

Bei einem Architektur-Upgrade denke ich über die Verwendung eines zentralen Dateiservers nach, der ein Verzeichnis mit diesen statischen Dateien über NFS exportiert. Es wird keinen Schreibzugriff auf diese Dateien geben, sodass das Verzeichnis schreibgeschützt auf dem Nginx-Computer bereitgestellt werden kann. Mein Hauptanliegen ist:

Ist NFS dafür schnell genug? Gibt es eine Begrenzung für die Anzahl der Anfragen, die NFS verarbeiten kann? Gibt es einige "Must-Have" -Optionen, wenn Sie diesen Weg gehen?

Bonus: Gibt es neben NFS noch andere Alternativen für dieses Setup?

Vielen Dank!

j0nes
quelle
Kein Lesezugriff oder "nur" Lesezugriff?
Pause
Vielen Dank! Nur Lesezugriff, kein Schreibzugriff.
j0nes
2
7.000 Anfragen pro Sekunde sind ~ 6.048.00.000 Anfragen pro Tag. Wenn Sie dies auf einem einzelnen NGINX-Server ausführen, würden wir (und die Unternehmen, die Servercluster für die Hälfte dieser Last verwenden) gerne Ihr Setup kennen.
Smudge

Antworten:

2

Durch das Einrichten eines zentralen NFS-Servers führen Sie einen einzelnen Fehlerpunkt in Ihr Design ein. Das allein sollte ein Deal Breaker sein. Wenn nicht, kann NFS für eine solche Last schnell genug sein. Die kritischen Faktoren sind genügend RAM zum Zwischenspeichern von Dateien, Verbindungen mit geringer Latenz (Gig-E oder besser) und Optimierung (weniger als beim vorherigen).

Sie sollten auch die Verwendung von rsync oder eines ähnlichen Tools in Betracht ziehen, um lokale Kopien der statischen Dateien auf jedem einzelnen Webserver zu aktualisieren. Eine andere Option könnte eine SAN- oder redundante NFS-Serverlösung sein (beide sind viel komplizierter und kostspieliger als die rsync-Idee).

Chris S.
quelle
2
NFS muss kein SPoF sein
gWaldo
@gWaldo Wie genau können Sie "einen zentralen NFS-Server" einrichten und muss es sich nicht um einen SPoF handeln?
Chris S
Sie tun dies, indem Sie erkennen, dass ein zentraler NFS-Server , wie Sie sagten, ein SPoF ist, und stattdessen einen NFS-Cluster implementieren. Ich bin nicht wirklich anderer Meinung als Sie ...
GWaldo
Vielen Dank - ich akzeptiere diese Lösung, weil ich denke, dass ich den Rsync-Weg gehen werde, um die Single-Point-of-Failure-Sache zu vermeiden (was mein Hauptanliegen sein sollte).
18.
Es ist ziemlich einfach, einen doppelt replizierten NFS-Server mit hoher Verfügbarkeit mithilfe von GlusterFS und CTDB zu implementieren. In Bezug auf die Leistung erhielt mein Cluster ungefähr 10.000 Anfragen pro Sekunde und es läuft einfach gut. Das einzige Problem ist, dass die NFS-Server viel RAM benötigen.
Alpha01
2

Ich verwende cachefilesd (und einen neueren Linux-Kernel mit cachefs), um NFS-Dateien auf einer lokalen Festplatte zwischenzuspeichern. Auf diese Weise kopiert jeder Lesevorgang in der NFS die Datei in ein Verzeichnis / var / cache / fs, und die nächsten Lesevorgänge werden von dort geliefert, wobei der Kernel die NFS überprüft, ob der Inhalt noch gültig ist.

Auf diese Weise können Sie ein zentrales NFS haben, ohne jedoch die Leistung lokaler Dateien zu beeinträchtigen

Cachefilesd kümmert sich um die Bereinigung alter Dateien, wenn die freie Größe / Inodes eine konfigurierte Ebene erreicht, sodass Sie ungewöhnliche Daten aus dem NFS und allgemeine Anforderungen aus der Festplatte bereitstellen können

Verwenden Sie natürlich auch einen Lack, um die häufigeren Anforderungen zwischenzuspeichern und das Nginx / NFS vor dem Serving zu schützen.

Hier ist eine kleine Cache-Datei und ein Howto

Higuita
quelle
1

Die Geschwindigkeit hängt von vielen Faktoren ab:

  • Wie werden Ihre Server mit dem NFS-Ziel verbunden? Eine einzelne SAS-Festplatte mit zwei Ports kann eine Übertragungsgeschwindigkeit von 6 Gbit / s verwenden. Denken Sie daran, wenn Sie 1gig Ethernet verwenden möchten (von dem Sie 20% TCP-Overhead abziehen können).
  • Welche Art von Cache wird der NFS-Server erhalten? Verwenden Sie einen Array-Controller für Unternehmen mit viel Cache? Der Lese-Cache ist der Schlüssel in diesem Setup
  • Wie viele Server werden gleichzeitig auf dieselbe Datei zugreifen? NFS-Verriegelung kann sehr weh tun

Die Beschränkung offener Dateien über NFS ist eine Beschränkung des Host-Betriebssystems. FreeBSD bietet beispielsweise viele verschiedene Optimierungsoptionen, um eine große Anzahl geöffneter Dateien zu unterstützen. Dies hängt jedoch von der Größe des Arbeitsspeichers auf Ihrem Server ab.

Eine Alternative zu einem zentralen Dateiserver ist die Verwendung der Synchronisierung / Replikation zwischen Ihren Webservern (wie von Chris S vorgeschlagen). rsync oder DRBD sind möglicherweise eine gute und kostengünstige Wahl.

pauska
quelle
1

Ich würde von NFS abraten, es sei denn, Sie setzen dort etwas Caching ein. Der Nginx-Cache ist besser als nichts, aber Lack ist besser.

Wenn sich Ihre Last jedoch in einen dynamischeren als einen statischen Inhalt ändert, wird es wichtiger, Apps-Dateien von der lokalen Festplatte bereitzustellen.

Wenn Sie NFS einfügen, stellen Sie sicher, dass Sie über Redundanz verfügen.

gWaldo
quelle
Dies erfordert möglicherweise eine geringfügige Änderung der Architektur. Zusätzlich zur Verwendung einer Caching-Ebene wie Varnish empfiehlt es sich, ein Origin-Pull-CDN-Setup für alle statischen Dateien zu verwenden, die sich auf der NFS-Freigabe befinden. Dadurch wird die Belastung des NFS-Backends verringert.
Alpha01