Hoch skalierbarer Technologie-Stack

8

Ich baue einen Webservice, der unter lächerlicher Last steht (Tausende bis Zehntausende von Abfragen pro Sekunde). Mein normaler Stack aus Apache, PHP, Memcache und einigen DBs wird es mit einem schönen Load Balancer Infront und vielen Maschinen aufnehmen können, aber ich frage mich, ob es bessere Lösungen gibt.

Der Endpunkt wird von einem Beacon getroffen (via Javascript auf dem Client), ich werde die Cookies des Benutzers lesen, ein paar kleine Informationen über sie aus der Datenbank ziehen, zwischenspeichern, eine kleine Berechnung durchführen, die Antwort senden und wenn benötigt, um in die DB zu schreiben und den Cache ungültig zu machen.

Und gute Technologieauswahl und / oder Hardware-Empfehlungen?

    
Paul Tarjan 14.09.2009, 06:30
quelle

6 Antworten

13

Dies ist nicht die Art von Frage, die hier in etwas anderem als einem breiten Überblick beantwortet werden kann. Einige allgemeine Hinweise:

  • Hardware: Die beiden Optionen sind im Grunde viele kleine, billige Boxen oder weniger leistungsfähige Boxen. Billigere Boxen sind, naja, billiger, verbrauchen aber normalerweise viel mehr Strom für die gleiche CPU oder den gleichen Speicher (je nachdem, was für Sie wichtig ist) als größere Boxen. Oft vergessen die Leute die manchmal erheblichen Kosten des Stromverbrauchs;
  • Backend: Sie haben eine Auswahl zwischen dem großen Ende der Stadt (Oracle, SQL Server) und dem kommodizierenden Ende (MySQL). MySQL ist offensichtlich billiger und Sie können auf MySQL weit gehen, aber es ist keine Frage, dass Oracle (mit dem ich mehr vertraut bin als SQL Server) einen besseren Optimierer hat, leistungsfähiger und robuster als MySQL ist. Du wirst dafür bezahlen;
  • Budget: Dies ist ein großer Faktor, da es sich lohnt, für gute kommerzielle Software zu bezahlen, anstatt Entwicklungskosten für die Nutzung von "kostenloser" Software zu bezahlen. Software-Entwicklung ist eine der teuersten Kosten von allen;
  • Vertikale und horizontale Skalierbarkeit: Die Frage, die Sie hier im Grunde beantworten möchten, lautet: Bauen Sie auf (größere Boxen usw.) oder bauen Sie sie aus (Cluster-Umgebungen). Die am besten skalierbaren Lösungen haben eine nahezu lineare horizontale Skalierbarkeit, aber auf kurze Sicht kann die vertikale Skalierbarkeit billiger sein.

Was Ihren normalen Stack anbetrifft, bleibe ich dabei, es sei denn, Sie haben eine bestimmte Anforderung, die Sie nicht erwähnt haben und die das verbietet. Schließlich ist PHP eine bewährte Technologie, die 4 oder so der Top 20 Seiten im Internet (Facebook, Wikipedia, Flickr und ich denke, Yahoo) läuft. Wenn es gut genug für sie ist, ist es gut genug für dich.

Noch wichtiger ist, Sie wissen es. Technologie-Stacks, von denen Sie wissen, dass Trump-Technologie-Stacks Sie nicht in jedem Fall bieten. Hüten Sie sich vor der "grüneren Weide" -Falle des neuesten Hype-Up-Technologie-Stacks.

Memcache ist gut. Die andere Sache, die Sie in Erwägung ziehen könnten, der Mischung hinzuzufügen, ist beandalkd als verteilter Arbeitswarteschlangenprozessor.

Eine wichtige Frage zu beantworten ist: Wie gut können Sie Ihre Anwendung partitionieren? Anwendungen, die sich leicht zur Partitionierung eignen, sind viel einfacher zu skalieren. Diejenigen, die nicht auf irgendeine Weise modifiziert werden, um die Partitionierung zu erleichtern.

Ein gutes Beispiel dafür ist eine einfache Sharetrading-Anwendung. Sie können Marktinformationen basierend auf dem Lagercode partitionieren (A-C auf einem Server, D-F auf einem anderen usw.). Für viele solcher Anwendungen wird das gut funktionieren.

    
cletus 14.09.2009, 06:49
quelle
5

Ссылка es gibt hier viel zu lernen, Sie werden wahrscheinlich Ihre Antwort finden.

    
Nicolas Dorier 14.09.2009 06:37
quelle
1

Sie können auch BigPipe verwenden, um Ihre Leistung zu steigern. Facebook benutzt es auch massiv und hier ist, was sie dazu sagen: "Um die Parallelität zwischen Webserver und Browser auszunutzen, bricht BigPipe Webseiten zunächst in mehrere Chunks namens Pagelets. So wie ein Pipelining-Mikroprozessor den Lebenszyklus einer Anweisung in mehrere Stufen unterteilt (wie "Instruction Fetch", "Instruction Decode", "Ausführung", "Register Write Back" etc.) bricht BigPipe den Seitengenerierungsprozess in mehrere Stufen:

Request-Parsing: Der Webserver analysiert die HTTP-Anfrage und überprüft die HTTP-Anfrage. Datenabruf: Der Webserver ruft Daten aus der Speicherschicht ab. Markup-Generierung: Webserver generiert HTML-Markup für die Antwort. Netzwerktransport: Die Antwort wird vom Webserver zum Browser übertragen. CSS-Download: Browser lädt CSS herunter, das für die Seite erforderlich ist. DOM-Baumkonstruktion und CSS-Stil: Der Browser erstellt den DOM-Baum des Dokuments und wendet dann CSS-Regeln darauf an. JavaScript-Download: Browser lädt JavaScript-Ressourcen herunter, auf die von der Seite verwiesen wird. JavaScript-Ausführung: Browser führt JavaScript-Code der Seite aus.

Die ersten drei Stufen werden vom Webserver ausgeführt, und die letzten vier Stufen werden vom Browser ausgeführt. Jedes Pagelet muss nacheinander alle diese Stufen durchlaufen, aber BigPipe ermöglicht die gleichzeitige Ausführung mehrerer Pagelets in verschiedenen Stufen. "

    
Gagan Deep 17.11.2012 11:06
quelle
0

Tornado sieht aus wie etwas, das ich auf diese Art von Problemen Ссылка versuchen würde, zumindest weißt du, dass es ein ist bewährte Lösung.

    
user173141 14.09.2009 13:58
quelle
0

Ich kann eine gute Komponente für Ihren Stack beitragen: MemCache .

    
jldupont 19.09.2009 18:54
quelle
0

PHP, memcached + DB im Allgemeinen skaliert gut, aber es kann Wege geben, dies mit geringeren Kosten zu tun, d. h. ein Stapel, der in der Lage ist, mehr gleichzeitige Anfragen pro Maschine zu handhaben.

Haben Sie Ihren Kommentar hier gegeben ...

  

Mein Ziel ist kein großes skalierbares System, sondern nur ein einfacher Technologie-Stack. Ich bin keine wachsende Datenbank, Suche, Crawler, etc. Nur eine einfache Anfrage, Abfrage, reagieren und speichern. Irgendwelche Empfehlungen für Technologie-Stack für meinen Zweck?

.. es klingt, als ob der DB-Teil von Amazon S3 ([was?!?] [1]) lösbar ist, vorausgesetzt, Sie müssen nur nach Schlüsseln suchen. Das würde Ihnen auch Cloudfront zum Lesen geben, wenn es Ihnen nichts ausmacht, eventuelle Konsistenz .

In der Zwischenzeit sollte serverseitig etwas, das async IO verwendet, um Anfragen zu bearbeiten, die Anzahl gleichzeitiger Anfragen jedes Rechners erheblich steigern klar kommen. Wie schon ein anderes Plakat sagte Tornado (bret.appspot.com/entry/tornado-web-server) wäre hier einen Blick wert - habe keine API für asynchrone IO gesehen, die freundlicher ist.

Sie würden wahrscheinlich immer noch memcached brauchen, um die Lesevorgänge schnell zu halten, aber Sie wollen darauf achten, dass der memcached Client den Serverprozess nicht blockiert, während er versucht, gleichzeitig Anfragen zu stellen - PHP hätte das normalerweise nicht Problem, da jeder PHP (oder Apache) -Prozess eine eigene Memcache-Verbindung hat und immer nur eine Sache gleichzeitig tut. Dieser Python-Client - sollte async IO unterstützen - der zugrunde liegende libmemcached unterstützt asynchrone Anfragen.

Gleiches gilt für HTTP-Anfragen vom Server an S3 - wie gehen Sie dort mit gleichzeitigen Anfragen um? boto scheint dafür einen Verbindungspool zu verwenden, wobei jede Verbindung einen anderen Socket geöffnet hat. Speicherverbrauch?

Disclaimer: Ich bin hier ein Sesselarchitekt - habe das noch nicht gemacht und der klügste Rat wäre, das Projekt pünktlich mit dem Stack abzuschließen, den Sie gut kennen und mit dem Sie nicht scheitern werden.

Entschuldigung für die Links

[1] - Ссылка

    
HarryF 27.09.2009 12:25
quelle