Der beste Weg, um den Lastausgleich über mehrere statische Dateiserver hinweg auch für eine Bandbreitenverteilung durchzuführen?


12

Zunächst erkläre ich Ihnen meine Situation. Ich betreibe eine ziemlich beliebte Website als Nebenprojekt, daher kann ich nicht wirklich eine Menge Geld in sie investieren. Ich habe derzeit nur einen Server mit HAProxy im Vordergrund, der normale Anfragen an Apache und alle statischen Dateianfragen an Lighttpd sendet. Dies funktioniert sehr gut, da alle PHP- und Post-Anfragen von Apache bearbeitet werden, während alle Bilder an das schnellere Lighttpd gesendet werden (die Site besteht hauptsächlich aus Bildern, dies ist also sehr wichtig). Es wäre schön, wenn Sie keine Subdomain für die Bereitstellung der Bilder einrichten müssten, denn auch kurze URLs sind sehr wichtig, daher mein Grund für die Verwendung von HAProxy.

Ich habe einen Hosting-Anbieter gefunden, der ziemlich billige, nicht gemessene Bandbreite bietet. Das Problem tritt auf, wenn ich anfange, so viel Bandbreite herauszuschieben, wie die 100-MB-Netzwerkkarte verarbeiten kann, und daher einen zweiten Server benötige.

Ich habe viel über meine Optionen nachgedacht, daher erkläre ich Ihnen jede. Hoffentlich könnten Sie einen Einblick geben, welche Option für mich die beste ist, oder vielleicht gibt es eine andere Option, an die ich noch nicht gedacht habe.

Bedarf:

  • Eine gleichmäßige Bandbreitenverteilung ist ein Muss. Ich habe einen ziemlich leistungsfähigen Server, daher ist eine Vergrößerung nicht möglich. Ich muss skalieren, um mehr Bandbreite zu erhalten.

  • Kurze URLs. Ich werde wirklich keine Unterdomäne wie img.example.com einrichten, um meine Bilder bereitzustellen. example.com/image.jpg ist, wie es jetzt ist und wie ich möchte, dass es wirklich bleibt. Aber wenn es keinen anderen Weg gibt, dann verstehe ich.

  • Der nächste Server, der die Anfrage bearbeitet, wäre wirklich nett, aber kein Muss. Etwas zu beachten.

HAProxy zum Lastenausgleich:

  • Es wäre wirklich einfach, da ich HAProxy sowieso bereits benutze. Ich denke jedoch, dass das Problem bei der Verteilung der Bandbreite auftritt. Ich liege möglicherweise falsch, aber sendet HAProxy die Anfrage nicht an einen Server, auf dem der Server sie verarbeitet und dann über HAProxy an den Client zurücksendet? Auf diese Weise wird der gesamte Datenverkehr über den Load Balancer zurückgesendet, sodass er so viel Bandbreite belegt wie alle Server zusammen.

DNS Round Robin:

  • Dies könnte meine beste Option sein. Replizieren Sie einfach die Website auf mehreren Servern und machen Sie das, was ich gerade mache. Der Nachteil ist, dass, wenn ein Server ausfällt, weiterhin Clients an ihn gesendet werden. Ich müsste auch die Site über die mehreren Server replizieren. Ich hatte gehofft, ich könnte einen Hauptserver haben, der alles außer statischen Dateien handhabt, und dann ein paar statische Dateiserver. Ich habe auch gelesen, dass dies eine Art Lastausgleich für Arme war, und es wäre schön, wenn etwas etwas ausgefeilter wäre.

Direkte Server-Rückgabe:

  • Es scheint wirklich kompliziert, könnte aber eine gute Option sein. Kann ich trotzdem bestimmte URLs an bestimmte Server senden? Wie jetzt bei HAProxy wird jede URL, die mit der richtigen Dateierweiterung endet, an Lighttpd gesendet, während andere Erweiterungen an Apache gesendet werden. Also würde ich etwas Ähnliches brauchen. Ebenso werden alle PHP-Anfragen von demselben Server bearbeitet, auf dem die Balancing-Software ausgeführt wird, während alle JPG-Anfragen an mehrere Server gesendet werden.

Idealerweise wäre mein Problem gelöst, wenn HAProxy Direct Server Return unterstützen würde. Ich möchte auch kein CDN verwenden, da diese sehr teuer sind und es sich letztendlich nur um ein Nebenprojekt handelt.

Verstehst du mein problem Lassen Sie mich wissen, wenn ich etwas falsch erklärt habe oder wenn Sie weitere Informationen benötigen.


1
Das ist Imgur und hat vor kurzem 40 Millionen Dollar gesammelt. : O
L1th1um

Antworten:


3

Zeichnen Sie ein Bild Ihres Anforderungs- / Antwortzyklus für die Anwendung und lokalisieren Sie den Engpass. Sie haben Recht, dass ein einzelner Proxy, der die Last auf viele Anwendungsserver verteilt, die Gesamtbandbreite aller Anwendungsserver benötigt. Die klassische Lösung ist RR DNS. Google, Yahoo und Amazon verwenden diese Technik mit einer kurzen TTL. Ich habe vor einiger Zeit Nachforschungen angestellt und meine Ergebnisse dokumentiert .

Eine andere Lösung ist die Verwendung einer ausgefallenen Enterprise-Load-Balancing-Lösung unter Verwendung virtueller IP-Adressen, um Anforderungen zwischen mehreren Anwendungsservern mit realen IP-Adressen auszugleichen. Ich habe mit Netscaler- und Stonesoft-Produkten gearbeitet. Beide funktionieren gut, haben aber schreckliche Eigenheiten und sind recht komplex.


Vielen Dank. Ihre Umfrageergebnisse waren sehr hilfreich. Ich denke, das ist die Lösung, zu der ich endlich kommen werde. "Wie jeder gute Forscher handle ich jedoch erst, wenn ich genügend Daten habe." :)
Alan

Vielen Dank für den Einblick. Leider scheint der Link zu Ihren Ergebnissen ironischerweise nicht zu funktionieren. Können Sie ihn beheben?
TCB13

3

Einige Antworten:

  • Ja, der gesamte Datenverkehr wird über HAProxy übertragen, da es als Proxy auf HTTP-Ebene fungiert. Dies gilt auch dann, wenn HAProxy auf einem separaten Server installiert ist, auf dem mehrere Back-End-Server geladen werden. Wenn Ihr Hosting-Provider also nur 100 MBit-Netzwerkports bereitstellt und Sie bereits 100 MBit pushen, liegt ein Problem vor.
  • In Bezug auf die Domain ist es am besten, Bilder von einer anderen Domain als Ihrer Webanwendung bereitzustellen - nicht von einer Subdomain, sondern von einer anderen, damit bei Bildanfragen keine Cookies mitgesendet werden. Sehen Sie Steve Souders Originalarbeit oder die Implementierung hier auf Stack Overflow . Wenn kurze URLs für Sie sehr wichtig sind, ist es möglicherweise das Beste, die Webanwendung von der Haupt-URL zu entfernen, dh die Dateiverwaltungsanwendung auf login.sitename.com zu verschieben.

Benötigen Sie eine Authentifizierung für die Bildanforderungen? Wenn nicht, wie wäre es mit Amazon S3? Es ist massiv skalierbar und die Datenübertragungskosten sind relativ günstig. In diesem Fall würde ich i.sitename.com als DNS-CNAME für den Amazon S3-Bucket-Hostnamen verwenden ( siehe Amazons-Dokumentation) . AFAIK Sie können den Root-Domain-Namen (sitename.com) nicht als CNAME verwenden, daher müssen Sie hierfür eine Subdomain wie i.sitename.com verwenden.

Sie können Ihre Bilder auch über mehrere Server hinweg hacken. Dh Sie erstellen eine DNS-Struktur wie login.sitename.com und a.sitename.com; b.sitename.com; c.sitename.com und so weiter. Das "a." und B." etc-Server enthalten lediglich ein Dateisystem mit Bildern und einen einfachen HTTP-Server (Sie verwenden bereits Lighttpd, verwenden Sie das also weiterhin. Für ein zukünftiges Projekt würde ich vorschlagen, nginx als besseren Ersatz zu betrachten.) Wenn ein Benutzer hochlädt Für ein Bild erstellen Sie einen Hash mit einer eindeutigen Kennung, z. B. seinem Benutzernamen, dem Dateinamen oder einer Kombination mehrerer Kennungen . Aus diesem Hash bestimmen Sie, auf welchem ​​Server das Image gespeichert werden soll.

Bearbeiten Ich hätte gesehen , dass Hashing wurde bereits diskutiert. Im Wesentlichen schlage ich hier vor, Hashing auch für den Hostnamen zu verwenden, um den Netzwerkverkehr gleichmäßig auf mehrere Hosts zu verteilen.

Ich weiß nicht, wie billig das sein muss - aber wenn Sie 100 MBit Netzwerkverkehr nutzen, wird "billig und gut" schnell zu einer Illusion. Vielleicht sollten Sie zuerst ein gutes Geschäftsmodell suchen, das wiederkehrende Einnahmen bringt, und anschließend die entsprechende Technologie implementieren?


1

Ich nehme an, HAProxy befindet sich auf demselben Server wie Ihre anderen Anwendungen. Sie können HAProxy auf ein anderes System übertragen, um die Anforderungen auszuführen und normale Anforderungen an einen Server und Image-Anforderungen an einen anderen Server zu senden. Das Problem dabei ist, dass alle Anforderungen immer noch an eine einzige Box gesendet werden. Wenn die Bandbreite ausgelastet ist, hilft dies möglicherweise nicht viel.

Sie sagen, kurze URLs sind wichtig. Warum? Ist es wirklich so schwierig, Bilder von "example.com" auf "i.example.com" umzustellen? Sie können "i" mit Lighttpd auf einem eigenen Server auf eine eigene IP setzen und HAProxy vollständig umgehen, um Ihr Durchsatzproblem zu lösen. Sie können auch den Vorteil des Webbrowsers nutzen, dass mehr Anfragen gleichzeitig geöffnet werden, da diese als unterschiedliche Domainnamen betrachtet werden und mehr gleichzeitige Verbindungen geöffnet werden können. Wenn der einzelne "i" -Server überlastet ist, können Sie DNS Round-Robin verwenden, um einen weiteren hinzuzufügen. Hoffentlich erzielen Sie zu diesem Zeitpunkt genug Einnahmen, um eine bessere Lösung zu implementieren.


Ja, HAProxy befindet sich auf demselben Server - ich habe bisher nur einen. Auch wenn ich es auf einen anderen Server übertragen hätte, würden dann nicht alle Daten mit HAProxy über den Server übertragen, wie ich oben erklärt habe? Kurze URLs sind wichtig, da dies der Zweck der Site ist. Es ist eine Kreuzung zwischen ImageShack und TinyPic. Je länger die URL, desto weniger Punkte hat meine Website. Aber wie gesagt, wenn die einzig gangbare Option darin besteht, eine Unterdomäne einzurichten, müsste ich es einfach tun. Ich würde es aber wirklich vorziehen, es nicht zu tun.
Alan

1

Bietet Ihr Hosting-Anbieter Lastausgleichsdienste an? Ich denke, ist die beste Lösung.

Eine andere Möglichkeit, dies zu tun, die jedoch getestet werden muss, besteht darin, die Anforderungen (in Lighty oder Apache) neu zu schreiben. Beispiel: example.com/file.html bleibt in Apache und example.com/image.jpg leitet zu i.example.com/image.jpg weiter. Alle Anfragen werden über Apache verwaltet, aber die Antworten (Upstream-Bandbreite) gehen an den lighttpd-Server. Die Domain ist für den Benutzer transparent. Sie müssen jedoch testen, ob Apache alle Anforderungen verarbeiten kann, oder ob LightTPD diese Aufgabe übernimmt.

Sie haben Recht, dass alle Daten über HAProxy übertragen werden, so dass Sie (soweit ich weiß) keine direkte Server-Rückgabe damit durchführen können.

AKTUALISIEREN

In der HAproxy-Dokumentation habe ich den Parameter "redir" gefunden. Ich weiß nicht, ob es wie Apache Rewrite funktioniert, aber es kann nützlich sein. In der Dokumentation heißt es:

Die Hauptverwendung besteht darin, die Bandbreite für statische Server zu erhöhen, indem die Clients eine direkte Verbindung zu ihnen herstellen.

Vielleicht funktioniert es für Ihren Fall.


Hey, danke für die Antwort. Ich habe es bereits versucht und es funktioniert in der Praxis nicht so gut wie in der Theorie. Der Grund dafür ist, dass Apache alle Anfragen bearbeitet. Jedes Mal, wenn ein Benutzer auf ein Bild stößt, wird Apache gestartet, überprüft die URL und sendet sie dann an diese. Was nicht anders ist, als dass Apache das Image in erster Linie behandelt. Ich bin damit einverstanden, dass ein von meinem Host bereitgestellter Load Balancer die beste Option ist, aber auch eine der teuersten. Sie berechnen pro gleichzeitiger Verbindung und ich bekomme Hunderte von ihnen.
Alan

Unterscheidet sich in der Art und Weise, wie der Lighty Server die Antwort direkt an den Client sendet, der seine eigene Bandbreite verbraucht. Das Problem ist, dass der Apache-Server viele Anfragen bearbeitet. Überprüfen Sie das Update auf meine Antwort, ich habe eine andere Lösung gefunden.
Hanniel

1

Ich gehe davon aus, dass Sie bei einem größeren Satz von Bildern die Bilder nicht auf der Grundlage ihres ursprünglichen Dateinamens speichern, da Sie ziemlich schnell auf Namenskonflikte stoßen würden.

Viele Anwendungen, die sich mit solchen Problemen befassen, verwenden den Hash der Datei und eine darauf basierende Verzeichnisstruktur. Die Verzeichnisstruktur sieht wie folgt aus: Der Verzeichnispfad besteht aus den ersten beiden Zeichen des Hashs, und das Verzeichnis der zweiten Ebene besteht aus den nächsten beiden Zeichen des Hashs.

/image root/AA/AA/images  
/image root/AA/AB/images

Der Vorteil dabei ist, dass Hashes die Verteilung von Dateien ziemlich gleichmäßig halten und Ihnen einen Namespace zur Verfügung stellen, der leicht auf mehrere Server aufgeteilt werden kann. Grundsätzlich bedienen Sie Teile des Hash-Speicherplatzes von verschiedenen Servern und können diese beim Skalieren nach Bedarf weiter unterteilen.

Der Nachteil ist, dass Hashes nicht perfekt sind und es zu Kollisionen kommen kann. Ich bin nicht sicher, wie damit umgegangen wird. Das kann also ein bisschen Nachforschungen von Ihrer Seite erfordern. Ich stelle mir vor, dass eine Umschreiberegel im Proxy in der Lage sein sollte, einen Hash-Befehl A3A8BBC83261.jpg zu verwenden und ihn in http://img3.domain.com/A3/A8/BBC83261.jpg umzuschreiben . Sie können dies jedoch nicht als kurze URL ansehen.


Ja, genau so speichere ich die Bilder. Das Problem liegt jedoch nicht beim Speicher, sondern bei der Bandbreitenverteilung.
Alan

Wenn Sie jedoch AA bis 33 auf einem Server und 34 bis 99 auf einem anderen Server speichern, gleichen Sie nicht nur das Speicherproblem aus, sondern auch die Bandbreitenverteilung.
3dinfluence

0

In Ihrem Beitrag haben Sie erwähnt, dass Sie der Meinung sind, dass DNS Round Robbin die beste Option ist, aber Sie befürchten, dass ein einzelner Server ausfällt ...

Wenn dies der Fall ist, schauen Sie sich Simple Failover von JH Software an. Ich habe es in der Vergangenheit benutzt und es funktioniert sehr gut.

http://www.simplefailover.com

Grundsätzlich werden Ihre Server überwacht, und wenn ein Server ausfällt, wird der DNS schnell neu geschrieben, um den toten Server aus der Rotation zu ziehen.

Hier ist ein Ausschnitt aus ihrer Website:

Simple Failover überwacht fortlaufend Ihre Server, um festzustellen, welche aktiv und welche nicht aktiv sind. Anschließend werden Ihre DNS-Einträge dynamisch entsprechend aktualisiert, sodass Ihr Domänenname immer auf einen funktionsfähigen Server verweist.

Es funktioniert mit Web-Servern (HTTP), Mail-Servern (SMTP, IMAP, POP3), FTP-Servern und praktisch jedem anderen TCP / IP-basierten Servertyp.

Wie bereits erwähnt, habe ich es in der Vergangenheit sowohl für Websites als auch für Mailserver verwendet. Es lief ziemlich gut. Das Failover war in den meisten Fällen ziemlich schnell (erraten 2-5 Minuten) und ich würde sagen, dass fast jeder in weniger als 15 Minuten ein Failover durchführte.

Nicht unbedingt PERFEKT ... aber auf jeden Fall schnell und einfach.

HINWEIS: Dies ist ein Windows-Produkt. Ich bin mir nicht sicher, ob sie eine Linux-Version haben oder nicht, aber Sie können auf jedem Server, den Sie mögen, ein Failover durchführen, da er auf DNS basiert.

In unserem Fall haben wir es einfach auf einen XP-Computer geworfen, den Computer angewiesen, einmal pro Nacht neu zu starten, und es lief jahrelang einwandfrei.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.