Wie teile ich Assets zwischen mehreren Webservern?

16

Ich habe mehrere Linux-Webserver an einen Load Balancer angeschlossen und teile gerne Assets (wie Bilder, Videos und andere Dinge) zwischen diesen Servern. Wie geht das am besten?

Gegenwärtig habe ich auf allen Webservern einen Dateiserver gemountet, aber ich mache mir Sorgen, dass dieser unter hohem Datenverkehr ausfällt. Wie kann ich das verhindern?

Danke im Voraus.

getmizanur
quelle
Hier sind Dinge wie Cassandra (NoSQL-Datenbanken) nützlich.
Alexis Wilke
Sie möchten Lack verwenden, um die Leistung bei starkem Verkehr zu verbessern? en.wikipedia.org/wiki/Varnish_%28software%29
Thorbjørn Ravn Andersen

Antworten:

12

Es gibt mehrere Möglichkeiten, dies Ihren Bedürfnissen entsprechend zu tun.

  • Verwenden Sie einen zentralen Dateiserver, der mit fx NFS auf den Webservern gemountet ist
  • Wie oben, aber überflüssig. Wenn einer ausfällt, übernimmt der andere
  • Verwenden Sie eine Art Synchronisationstool (z. B. rsync) und hosten Sie die Dateien lokal auf den Webservern. Richten Sie dann einen Cronjob ein, um die Dateien zwischen den Servern in einem bestimmten Intervall zu synchronisieren.
  • Verwenden Sie einen CDN wie Amazon S3, Akamai usw.

Die ersten beiden sind am besten, wenn Sie viele neue Dateien haben. Die dritte Option ist die ideale Lösung, wenn Sie keine Dateien hinzufügen oder ändern, da die Benutzer 404-Werte für statische Inhalte erhalten, die noch nicht synchronisiert sind.

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

Frederik Nielsen
quelle
Das große Problem mit rsync ist, dass Sie wahrscheinlich einen 404 erhalten, wenn Sie neue Daten hochladen und der rsync nicht sehr schnell abläuft ... Auch ein System wie Cassandra (Punkt 4) ist kostenlos, obwohl es natürlich nicht 10 Server hat kostenlos ... also, vielleicht sollte ich sagen, keine zusätzliche Gebühr (obwohl es einige Programmierung benötigt, damit alles funktioniert.)
Alexis Wilke
@AlexisWilke - Sie haben Recht mit rsync, und ich habe es auch in der Antwort erwähnt. Ich habe es jetzt in der Antwort geklärt.
Frederik Nielsen,
Betreff: # 3, die 'Totzeit' zwischen der Bereitstellung neuer Assets und der Synchronisierung neuer Assets kann minimiert werden, wenn Sie einen Dateisystem-Watcher (wie Facebooks Watchman ) und ein Tool zur schnellen Synchronisierung (wie csync2 ) verwenden. Nein, die Verzögerung wird niemals auf Null sinken, ist jedoch sehr gering und möglicherweise einfacher zu implementieren als die anderen Alternativen.
Pepoluan
2

Eine weitere großartige Möglichkeit, die Last auf Webservern zu verringern und den Lastausgleich durchzuführen, ist die Verwendung von Squid (Squid3). Richten Sie es als Reverse-Proxy mit Caching ein. Bei dieser Einstellung werden statische Inhalte wie Bilder usw. entweder auf der Festplatte (Standardeinstellung) oder im RAM (schneller und am besten) zwischengespeichert. Es ist auch in der Lage, Round-Robin-Verfahren für andere Squid-Server durchzuführen, wenn ein bestimmter Knoten überlastet ist.

Aihngel Tech
quelle
1
Ich denke, diese Art von Caching schlägt fehl, wenn Sie eine sehr dynamische Website wünschen. Weil Sie bei starker Dynamik immer noch einen Haupt-Backend-Server für viele Daten benötigen. Ich denke, der Benutzer möchte stattdessen die Backend-Arbeit aufteilen.
Alexis Wilke
1
Ihre Antwort ist in Bezug auf die potenzielle Reduzierung der Auslastung korrekt, sie beantwortet jedoch nicht die Frage zur gemeinsamen Nutzung von Asset-Dateien zwischen mehreren Servern.
@AlexisWilke es funktioniert (nicht), wenn Sie Tintenfisch nicht richtig eingerichtet haben. Passen Sie in den Einstellungen an, wie die Seite zwischengespeichert wird (oder ob sie zwischengespeichert wird). Es kann jedoch vorkommen, dass keine Seite 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 beim Teilen von Dateien nicht so sehr. Die Frage war, wie verhindert werden kann, dass die Websites unter hoher Last stehen. Squid kann das hervorragend.
Aihngel Tech
1

Da in der Regel mehr Server für die Ausführung dynamischer Websites / Apps erforderlich sind, sollten Sie statische Assets in einer anderen Subdomäne / Domain hosten. (wie static.yourdomain.com)

Sie können dann einen oder mehrere andere Server zum Hosten verwenden. Das Hosting von statischen Dateien beansprucht nicht viel Ressourcen, sodass Sie erheblich weniger Server für Ihre statischen Inhalte benötigen. Sie werden auch einige Ressourcen auf den Servern für Ihre dynamischen Inhalte 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 Anforderung verwendet werden soll. Wenn Sie jedoch eine separate Domäne verwenden, können Sie Ihre statischen Assets ganz einfach auf einem CDN ablegen, wenn das Bedürfnis sollte aufkommen!

Josef
quelle
1

Eine Lösung für diese Herausforderung besteht darin, die Haupt-Lese- / Schreibkopie der Dateien auf einem freigegebenen NFS-Laufwerk zu haben, aber auch auf jedem Webserver eine Nur-Lese-Kopie zu behalten, damit bei einem Ausfall des NFS-Hosts auf Dateien zugegriffen werden kann im schreibgeschützten Modus, anstatt sie vollständig zu verlieren.

  • Dateien werden auf einem zentralen Host gespeichert und über NFS-Mount mit Webhosts geteilt
  • rsync Läuft alle 15 Minuten, um die schreibgeschützte Kopie auf jedem Webhost auf dem neuesten Stand zu halten.
  • Ein check_linkBash-Skript wird jede Minute ausgeführt, um sicherzustellen, dass der NFS-Mount noch vorhanden ist. Andernfalls wird ein Symlink zu der schreibgeschützten Kopie ausgetauscht.

Weitere Details finden Sie in diesem Artikel, als ich dieses System zum ersten Mal einrichtete.

Vorteile:

  • Datei-Lesevorgänge sind hoch verfügbar
  • Keine Rennbedingungen für Dateischreibvorgänge
  • Neue Dateien stehen sofort allen Webhosts zur Verfügung.

Nachteile:

  • ein bisschen komplex.
  • Die Anzahl der schreibgeschützten Kopien richtet sich nach der Anzahl der Webhosts. Dies kann bei mehr als zwei übermäßig sein.
  • Dateischreibvorgänge sind nicht hoch verfügbar.
  • Möglicherweise bis zu 1 Minute Ausfallzeit, bevor Sie zur schreibgeschützten Kopie wechseln.
Adam Franco
quelle
0

Möglicherweise möchten Sie eine NoSQL-Datenbank in Betracht ziehen. Sie sind so konzipiert, dass sie in Clustern arbeiten und letztendlich für Konsistenz sorgen. Aber seien Sie vorsichtig, sie sind nicht sauer.

Hier ist eine Einführung , die Ihnen bei der Entscheidung hilft, welche Art von NoSQL-Datenbank Sie für Ihren Zweck benötigen.

Hier finden Sie eine Liste der Ressourcen zu verfügbarem NoSQL.

Azzy
quelle
4
Wie hilft diese Antwort bei der Dateisynchronisierung?
Titus
@titus In NoSQL wird ein Schreibzugriff auf einen der Knoten auf andere Knoten im Cluster repliziert. Cassandra schreiben Konsistenzstufen könnte dazu beitragen, um es klar zu machen
Azzy
Der Weg ist also, alle Dateien in der NoSQL-Datenbank zu speichern.
Titus
@titus können Sie, aber NoSQL-Datenbanken können viel mehr als nur Dateien speichern. Es hängt alles von Ihren Bedürfnissen ab.
Azzy
2
OP hat nach einer Lösung für ein bestimmtes Problem gefragt. " Mehrere Linux-Webserver, die an einen Load Balancer angeschlossen sind ... teilen Assets (wie Bilder, Videos und anderes) zwischen diesen Servern. " Ihre Antwort ist sehr allgemein Spezifische Tools (und vorzugsweise Konfigurationen davon) erläutern, um das Problem anzugehen?
kdbanman
0

Versuchen Sie es mit einer DFS-Lösung, da diese ein hohes Maß an Redundanz bietet und das Volume von beliebig vielen Benutzern gemeinsam genutzt werden kann. Gluster ist mein Favorit und lässt sich sehr einfach in jeder bekannten Linux-Distribution installieren und konfigurieren

Arash mo
quelle