Frage Wie teile ich Assets zwischen mehreren Webservern?


Ich habe mehrere Linux-Webserver mit einem Load Balancer verbunden, und ich teile gerne Ressourcen (wie Bilder, Videos und andere Dinge) zwischen diesen Servern. Was ist der beste Weg, dies zu tun?

Zurzeit habe ich einen Dateiserver auf allen Webservern installiert, aber ich bin besorgt, dass es unter starkem Verkehr untergeht. Wie kann ich das vermeiden?

Danke im Voraus.


15
2018-02-08 15:10


Ursprung


Hier sind Dinge wie Cassandra (NoSQL-Datenbanken) nützlich. - Alexis Wilke
Wird Varnish zur Verbesserung der Leistung bei starkem Verkehr eingesetzt? en.wikipedia.org/wiki/Varnish_%28software%29 - Thorbjørn Ravn Andersen


Antworten:


Es gibt mehrere Möglichkeiten, dies basierend auf Ihren Anforderungen zu tun.

  • Verwenden Sie einen zentralen Dateiserver, der mit fx NFS auf den Webservern bereitgestellt wird
  • Dasselbe wie oben, aber redundant, wenn also jemand untergeht, übernimmt der andere
  • Verwenden Sie ein Synchronisationstool (zB rsync) und hosten Sie die Dateien lokal auf den Webservern. Richten Sie dann einen Cronjob ein, um die Dateien in einem bestimmten Intervall zwischen den Servern zu synchronisieren.
  • Verwenden Sie ein CDN wie Amazon S3, Akamai usw.

Die ersten beiden sind am besten, wenn Sie viele neue Dateien haben. Die dritte wäre die ideale Lösung, wenn Sie keine Dateien hinzufügen oder ändern, da die Benutzer 404 auf statischen Inhalten erhalten, die noch nicht synchronisiert sind.

Die letzte Option ist vielleicht in vielerlei Hinsicht ideal, könnte aber auch die teuerste der 4 sein. Sie müssten auch Ihre Websites neu schreiben, um dies zu unterstützen.


12
2018-02-08 16:12



Das große Problem mit rsync ist, dass Sie wahrscheinlich einen 404 bekommen, wenn Sie neue Daten hochladen und das rsync nicht sehr schnell passiert ... Auch ein System wie Cassandra (Punkt 4) ist kostenlos, obwohl es natürlich 10 Server nicht gibt frei ... also, vielleicht sollte ich keinen Aufpreis sagen (obwohl es etwas Programmierung benötigt, damit alles funktioniert.) - Alexis Wilke
@AlexisWilke - Du hast recht mit rsync, und ich habe es auch in der Antwort erwähnt. Ich habe es jetzt in der Antwort geklärt. - Frederik Nielsen
Zu: # 3, die "Totzeit" zwischen dem neuen Asset und der neuen Asset-Synchronisierung kann minimiert werden, wenn Sie einen Dateisystemwächter verwenden (wie Facebook's) Wächter) und ein schnelles Synchronisierungswerkzeug (wie z csync2). Nein, die Verzögerung wird niemals auf Null gehen, aber sie ist sehr minimal und könnte leichter zu implementieren sein als die anderen Alternativen. - pepoluan


Ein weiterer guter Weg, die Auslastung von Webservern zu reduzieren und den Lastenausgleich durchzuführen, ist mit squid (nämlich squid3). Richten Sie es als Reverse-Proxy mit Caching ein. Statische Inhalte wie Bilder usw. werden entweder auf der Festplatte (Standard) oder im RAM (schneller und am besten) zwischengespeichert, wenn Sie dies so einstellen. Es ist in der Lage Round-Robin zu anderen Squid-Servern auch wenn ein bestimmter Knoten überlastet ist.


2
2018-02-08 20:01



Ich denke, dass diese Art von Caching fehlschlägt, wenn Sie eine sehr dynamische Website möchten. Denn mit großer Dynamik müssen Sie immer noch den einen Haupt-Backend-Server für viele Daten treffen. Ich denke, der Benutzer versucht stattdessen, die Backend-Arbeit aufzuteilen. - Alexis Wilke
Ihre Antwort ist richtig, dass die Last möglicherweise reduziert wird, beantwortet jedoch nicht die Frage zum Teilen von Asset-Dateien zwischen mehreren Servern.
@AlexisWilke es tut (scheitern), wenn Sie nicht richtig Tintenfisch-Setup haben. Passen Sie an, wie es in den Einstellungen zwischenspeichert (oder wenn es zwischengespeichert wird), aber möglicherweise stellen Sie fest, dass keine Seite jemals vollständig dynamisch ist. Es gibt immer etwas, das Sie zwischenspeichern können. Auch Andre, es hilft sehr beim Teilen von Assets, wie der Titel beschreibt, aber Dateien nicht so viel teilen. Die Frage war, wie man die Seiten davon abhalten kann, unter schwerer Last herunterzufahren. Squid ist dabei hervorragend. - Aihngel Tech


Da in der Regel mehr Server für die Ausführung dynamischer Websites / aps benötigt werden, sollten Sie in Erwägung ziehen, statische Assets in einer anderen Subdomain / Domäne zu hosten. (wie static.ihredomain.com)

Sie können dann einen anderen Server / Server verwenden, um sie zu hosten. Statisches Datei-Hosting verbraucht nicht sehr viele Ressourcen, so dass Sie wesentlich weniger Server für Ihren statischen Inhalt benötigen. Sie werden auch einige Ressourcen auf den Servern für Ihren dynamischen Inhalt freigeben.

Abhängig von Ihrem Load Balancer können Sie dies möglicherweise auch in derselben Domäne tun, wobei der Load Balancer entscheidet, welcher Server für welche Anfrage verwendet wird. Wenn Sie jedoch eine separate Domain verwenden, können Sie Ihre statischen Assets recht einfach auf ein CDN stellen das Bedürfnis sollte entstehen!


1
2018-02-09 09:42





Eine Lösung für diese Herausforderung besteht darin, die Hauptlese- / Schreibkopie der Dateien auf einem freigegebenen NFS-Laufwerk zu haben, aber auch auf jedem Webserver eine schreibgeschützte Kopie zu behalten, damit ein Fehler des NFS-Hosts den Dateizugriff ermöglicht im schreibgeschützten Modus, anstatt sie vollständig zu verlieren.

  • Die Dateien werden auf dem zentralen Host gespeichert und über NFS-Mount mit den Webhosts geteilt
  • rsync läuft immer 15 Minuten, um die schreibgeschützte Kopie auf jedem Web-Host frisch zu halten.
  • EIN check_link Das Bash-Skript wird jede Minute ausgeführt, um sicherzustellen, dass der NFS-Mount noch vorhanden ist und wenn nicht, wird ein Symlink zur schreibgeschützten Kopie ausgetauscht.

Weitere Details finden Sie in Dieser Beitrag von wann ich dieses System zum ersten Mal eingerichtet habe.

Upside:

  • Dateilesevorgänge sind hoch verfügbar
  • Keine Race-Bedingungen für Dateischreibvorgänge
  • Neue Dateien sind sofort für alle Web-Hosts verfügbar.

Nachteile:

  • ein bisschen komplex.
  • Die Anzahl der schreibgeschützten Kopien wird mit der Anzahl der Webhosts skaliert, was bei vielen mehr als zwei zu hoch sein kann.
  • Dateischreibvorgänge sind nicht hoch verfügbar.
  • Potenzial für bis zu 1 Minute Ausfallzeit vor dem Wechsel zur schreibgeschützten Kopie.

1
2018-03-12 04:05





Vielleicht möchten Sie eine NoSQL-Datenbank in Betracht ziehen. Sie sind so konzipiert, dass sie an Clustern arbeiten und eine Konsistenz gewährleisten. Aber sei vorsichtig, sie sind keine Säure.

Hier ist ein Einführung das wird Ihnen helfen zu entscheiden, welche Art von NoSQL-Datenbank Sie für Ihren Zweck möchten.

Hier ist ein Liste der Ressourcen im Zusammenhang mit verfügbaren NoSQL.


0
2018-02-09 07:54



Wie hilft diese Antwort beim Dateisynchronisierungsproblem? - titus
@titus Wenn in NoSQL auf einen der Knoten geschrieben wird, wird er auf anderen Knoten im Cluster repliziert. Kassandra Schreib Konsistenz Ebenen könnte helfen, es klar zu machen - Azzy
Also ist der Weg zu gehen alle Dateien in NoSQL db zu speichern? - titus
@titus können Sie, aber NoSQL-Datenbanken können viel mehr als Dateien speichern, es hängt alles von Ihren Bedürfnissen ab. - Azzy
OP hat nach einer Lösung für ein spezifisches Problem gefragt "Mehrere Linux-Webserver, die an einen Load Balancer angeschlossen sind, teilen Ressourcen (wie Bilder, Videos und andere Dinge) zwischen diesen Servern."Ihre Antwort ist sehr generisch, können Sie spezifische Tools (und vorzugsweise Konfigurationen davon) vorschlagen und erklären, um das Problem anzugehen? - kdbanman


Warum versuchen Sie nicht eine DFS-Lösung, sie bieten ein hohes Maß an Redundanz und das Volumen könnte zwischen beliebig vielen geteilt werden. Gluster ist mein Favorit und ist sehr einfach in jeder bekannten Linux-Distribution zu installieren und zu konfigurieren


0
2017-09-12 19:43