Dienstag, 23. Oktober 2007

PlentyOfFish Architecture

Original: http://highscalability.com/plentyoffish-architecture
Author: Todd Hoff
Übersetzung: Sebastian Wallroth

PlentyOfFish ist ein äußerst populäres Online-Datingsystem, dass von 45 Millionen Besuchern im Monat überrannt wird und mehr als 30 Millionen Zugriffe pro Tag verzeichnet (500 - 600 Seiten pro Sekunde). Aber das ist nicht der interessanteste Teil der Geschichte. All das wird von einer Person betreut, mit einer Handvoll Servern, mit nur ein paar Arbeitsstunden pro Tag, und dabei 6 Millionen US-Dollar im Jahr mit Google AdSense generierend. Eifersüchtig? Ich bin's jedenfalls. Wie werden all diese Liebesbeziehungen mit nur so wenigen Ressouren hergestellt?

Seite: http://www.plentyoffish.com/

Informationsquellen
Die PlattformDie Fakten
  • PlentyOfFish (POF) hat nur einen Angestellten: den Gründer und CEO Markus Frind
  • POF bringt bis zu 6 Millionen US-Dollar im Jahr mit Google-Werbung bei nur zwei Arbeitsstunden am Tag
  • Mehr als 30 Millionen Zugriffe am Tag (500 - 600 Seiten pro Sekunde)
  • 1,1 Milliarden Seitenaufrufe und 45 Millionen Besucher im Monat
  • POF ist unter den Top 30 Seiten der USA (nach Messungen von Competes Attention), Top 10 in Kanada und Top 30 in Großbritannien
  • 2 Webserver mit Lastverteilern, zwei Quad Core Intel Xeon X5355 @ 2,66 GHz, 8 Gigabyte RAM (etwa 800 MB in Benutzung), zwei Festplatten, Windows x64 Server 2003
  • 3 Datenbankserver. (Über deren Konfiguration liegen keine Daten vor.)
  • Annähernd 64.000 gleichzeitige Verbindungen und 2 Millionen Seitenaufrufe pro Stunde.
  • Die Internetverbindung ist eine 1 GBps-Leitung, von der 200 MBps verwendet werden
  • 1 Terabyte pro Tag kommen von 171 Millionen Bildern, die Akamai ausliefert
  • 6 Terabyte Festplattenspeicher, die Millionen Bilder in Originalgröße vorhalten, die jeden Monat auf die Seite hochgeladen werden.
Was steckt drin
  • Das Einkommensmodell ist es, Google-Werbung zu verwenden. Match.com generiert im Vergleich dazu 300 Millionen US-Dollar im Jahr, vorwiegend über kostenpflichtige Registrierungen. POFs Einkommensmodell ist gerade dabei, sich zu ändern, um mehr Einkommen über die Benutzer zu erzielen. Der Plan ist, mehr Angestellte in Bord zu holen, Sales-Leute einzustellen und Werbung direkt zu verkaufen, statt nur von AdSense abhängig zu sein.
  • Mit 30 Millionen Seitenaufrufen pro Tag kann man mit Werbung gutes Geld verdienen, auch mit nur 3 - 5 Cent pro CPM (Cost-per-million; synonym zu Tausender-Kontakt-Preis, TKP)
  • Akamai wird verwendet, um mehr als 100 Millionen Bilderabfragen pro Tag zu bedienen. Wenn Du acht Bilder hast und jedes 100 Millisekunden braucht, dann redest Du von einer zweiten Last nur durch Bilder. Also ist es sinnvoll auch die Bilder zu verteilen.
  • Mehrere 10 Millionen Bilderabfragen werden direkt von POFs Servern geliefert, aber die Mehrzahl dieser Bilder sind kleiner als 2 Kilobyte und können meistens im RAM gehalten werden.
  • Alles ist dynamisch, nichts ist statisch.
  • Alle rausgehenden Daten sind gzipped, was 30% der CPU-Last erzeugt. Das verlangt eine Menge Rechenleistung auf diesen Servern, aber es vermindert wirklich die Bandbreitenauslastung.
  • Es wird keine Caching-Funktionalität von ASP.NET verwendet, weil die Daten bereits veraltet sind, sobald sie im Cache landen.
  • Keine der vorhandenen Komponenten von ASP.NET werden verwendet. Alles ist von Grund auf selbst programmiert. Nichts ist komplexer als ein einfaches IF...THEN...AND für Schleifen. Immer schön einfach.
  • Lastverteilung
    • IIS begrenzt die Anzahl der Verbindungen willkürlich auf 64.000, so dass ein Lastverteiler hinzugefügt werden musste, um eine riesige Anzahl gleichzeitiger Verbindungen zu bearbeiten. Das Hinzufügen einer zweiten IP um dann Rechnerzuordnungen für Indexpartitionen durch Datenverteilung (round robin DNS) zu verwenden wurde in Betracht gezogen, aber der Lastverteiler erschien besser für eine mehrfache Vorhaltung der Daten und ein einfacheres Hinzuschalten neuer Webserver. Und die Verwendung von ServerIron bot erweiterte Funktionalitäten, wie Bot-Blockierung und Lastverteilung basierend auf weitergeleiteten Cookies, Sessiondaten und IP-Daten.
    • Die Netzwerklastverteilung (network load balancing, NLB) von Windows wurde nicht verwendet, weil es keine "sticky sessions" unterstützt. Um das zu umgehen, kann man den Sessionzustand in einer Datenbank oder in einem gemeinsam genutzten Dateisystem speichern.
    • 8 - 12 NLB-Server können in einer Farm zusammen gefasst werden. Die Anzahl der Farmen ist unbegrenzt. Ein Round-Robin-DNS-Schema kann zwischen den Farmen benutzt werden. So eine Architektur wurde verwendet, um 70 Front-End-Webserver zu ermöglichen, um über 300.000 gleichzeitige Benutzer zu ermöglichen.
    • NLB kennt eine Ähnlichkeitsfunktion, so dass ein Benutzer immer einem bestimmten Server zugeordnet wird, weswegen kein externen Speicherplatz verwendet wird, um den Sessionzustand zu speichern. Wenn der Server abstürzt gehen jedoch die Sessionzustandsdaten verloren und der Benutzer muss sich neu einloggen. Wenn der Sessionzustand auch einen Warenkorb enthält oder andere wichtige Daten, dann ist dieser Lösung wirklich schwach, aber für eine Dating-Seite scheint es Okay zu sein.
    • Man war der Ansicht, dass die Kosten des Speicherns und Gewinnens der Sessiondaten zu teuer ist. Hardwarelastverteilung ist einfacher. Ordne Benutzer einfach spezifischen Servern zu und wenn der Server abstürzt, fordere die Benutzer einfach auf, sich neu einzuloggen.
    • Die Kosten von ServerIron sind jedoch niedriger und es ist einfacher zu benutzen als NLB. Bedeutende Seiten verwenden es für TCP-Verbindungsbündelung (TCP connection pooling), automatische Bot-Erkennung, etc. ServerIron kann weit mehr als Lastverteilung und diese Features sind wegen der niedrigen Kosten sehr attraktiv.
  • Es ist ein großes Problem, einen Adserver auszuwählen. Adserverfirmen wollen mehrere Hunderttausend Dollar pro Jahr und sie wollen Mehrjahresverträge.
  • POF ist dabei die ASP.NET Repeater loszuwerden und statt dessen dieses Append-String-Dings oder response.write zu verwenden. Wenn Du jeden Tag Millionen Seitenaufrufe auslieferst, dann schreib einfach den Code, um es am Bildschirm auszugeben.
  • Der größte Teil der Hardwarekosten stecken in einer SAN. Redundanz im jeden Preis.
  • Das Wachstum kam durch Mundpropaganda. Die Kanadier drehten völlig durch, dann schwappte es nach Großbritannien, Australien und dann in die USA.
  • Datenbanken
    • Eine Datenbank ist die Hauptdatenbank
    • Zwei Datenbanken dienen der Suche. Die Lastverteilung zwischen den Suchservern basiert auf der Art der Suche.
    • Die Leistung wird mit dem Taskmanager überwacht. Wenn sich Spitzen zeigen, wird das untersucht. Übliche Probleme sind Blockierungen in der Datenbank. Es sind immer Datenbankprobleme. Ganz selten sind es Probleme mit .NET. Weil POF die .NET-Bibliothek nicht verwendet, ist es recht einfach, Leistungsprobleme zurückzuverfolgen. Wenn man viele Framework-Schichten verwenden würde, wäare ganz schön hart und frustrierend herauszufinden, wo sich die Probleme verstecken.
    • Wenn Du die Datenbank 20mal pro Seitenaufruf ansprichst, bist du angemeiert, egal was Du versuchst.
    • Trenne Datenbank-Lese- von -Schreib-Zugriffen. Wenn Du nicht viel RAM hast und Du Lese- und Schreib-Zugriffe brauchst, wird das Paging eingeschaltet, was deine Datenbank für Sekunden hängen lassen kann.
    • Versuche eine Nur-Lesen-Datenbank einzurichten, wenn es geht.
    • Denormalisiere die Daten. Wenn Du viel Zeug aus 20 verschiedenen Tabellen holen musst, versuche eine einzige Tabelle zu erstellen, die nur zum Lesen da ist.
    • Einen Tag geht es, aber wenn deine Datenbank ihre Größe verdoppelt, wird sie nicht mehr funktionieren.
    • Mach nur eine Sache im System und es wird alles ganz prächtig laufen. Schreibe in die Datenbank - das geht gut. Lese aus der Datenbank - das geht gut. Mische die Aufgaben und es wird alles durcheinander bringen. Du wirst Locking- und Blocking-Probleme kriegen.
    • Wenn Du an die Grenzen der CPU-Leistung stößt, dann hast Du entweder etwas falsch gemacht oder es ist in höchsten Maße optimiert. Wenn Du die Datenbank in den RAM kriegst, tu es.
  • Der Entwicklungsprozess sieht so aus: Hab eine Idee. Lass sie 24 Stunden online. Das funktioniert in der Hälfte der Fälle. Beobachte die Benutzerakzeptanz, indem Du analysierst, was sie tatsächlich auf deiner Seite machen. Erhöht sich die Anzahl der Nachrichten pro Benutzer? Bleiben sie länger auf deiner Seite? Wenn die Leute es nicht mögen, schalte es ab.
  • Systemabstürze sind selten und von kurzer Dauer. Die größten Probleme sind DNS-Probleme, wenn einige ISP (internet service provider) melden, dass die POF-Seite nicht mehr existiere. Weil die Seite jedoch kostenlos ist, akzeptieren die Leute eine kleine Auszeit. Die Leute bemerken Auszeiten meist gar nicht, weil sie denken, es sei ihr Problem.
  • Das Wachstum von 1 Million auf 12 Millionen Benutzer war ein großer Sprung. POF könnte mit 2 Webservern bis zu 60 Millionen Benutzern skalieren.
  • POF schaut oft bei Mitbewerbern nach neuen Ideen und Features.
  • POF wird Amazons S3 in Betracht ziehen, wenn es geografische Lastverteilung unterstützt.
Gelernte Lektionen
  • Du brauchst keine Millionen Gründerkapital, keine auswuchernde Infrastruktur und kein Haus voller Angestellter um eine Weltklassewebseite zu erschaffen, die einen Strom von Besuchern bewältigt während Du gutes Geld verdienst. Alles was Du brauchst ist eine Idee, die eine Menge Leute anlockt, eine Seiten, die per Mundpropaganda weiterempfohlen wird und die Erfahrung und die Vision, eine Seite aufzubauen, ohne in die typischen Fallen des Handels zu treten. Das war's schon ;-)
  • Bedarf ist die Mutter aller Änderungen
  • Wenn Du schnell wächst, aber nicht zu schnell, dann hast Du die Chance zu wachsen, dich zu ändern und dich anzupassen.
  • RAM löst alle Probleme. Danach wächst man einfach mit größeren Maschinen.
  • Wenn Du startest, dann halte alles so einfach wie möglich. Nahezu alle geben diesen Ratschlag und Markus Frind sagt ganz klar, dass alles was er tut, ganz einfach simpler gesunder Menschenverstand ist. Aber zu finden, was das Einfachste ist, schafft man nicht nur mit gesundem Menschenverstand. Einfache Dinge zu schaffen ist das Ergebnis von Jahren praktischer Erfahrung.
  • Ermögliche einen schnellen Datenbankzugriff und Du wirst keine Probleme haben.
  • Ein wichtiger Grund, warum POF mit so wenig Leuten und so wenig Ausrüstung auskommt ist, dass POF ein Medienverteilernetzwerk (content delivery network, CDN) für die Auslieferung großer, viel genutzter Medien benutzt. Die Verwendung eines CDN könnte die geheime Zutat einer Menge großer Webseiten sein. Markus Frings glaubt, dass es keine einzige Seite unter den Top 100 gibt, die kein CDN benutzen. Ohne ein CDN, glaubt Markus Frings, würde die Ladezeit in Australien wegen all der Bilder bis auf 3 bis 4 Sekunden ansteigen.
  • Werbung auf Facebook bringt fast nichts. Aus 2.000 Klicks wurde nur eine Anmeldung. Mit einem CTR von 0,04% bringt Facebook 0,4 Klicks pro 1.000 Anzeigen oder 0,4 Klicks/CPM. Bei 0,05 USD/CPM = 0,125 USD/Klick; 0,50 USD/CPM = 1,25 USD/Klick; 1 USD/CMP = 2,50 USD pro Klick; 15 USD/CPM = 37,50 USD/Klick
  • Es ist einfach ein paar Millionen Seitenaufrufe mit hohen CPMs zu verkaufen. Es ist VIEL schwerer, Milliarden von Seitenaufrufen mit hohen CPMs zu verkaufen, wie man bei Myspace und Facebook sehen konnte.
  • Das werbegestützte Modell begrenzt deine Einahmen. Du brauchst ab einer bestimmten Größe ein Bezahlmodell. 100 Millionen im Jahr mit einer kostenlosen Seite zu generieren ist praktisch unmöglich, weil Du einen zu großen Markt bräuchtest.
  • Die Anzahl der Seitenaufrufe via Facebook zu erhöhen funktioniert nicht für eine Dating-Seite. Besucher auf Deiner Webseite zu haben, ist viel profitabler. Die meisten Seitenaufrufe auf Facebook kommen von außerhalb der USA und Du musst 0,05 USD/CPM mit Facebook teilen.
  • Co-Req ist eine potenziell große Einkommensquelle. Du bietest dem Benutzer interessante Informationen über andere Produkte an, wenn er sich bei Dir anmeldet.
  • Du kannst nicht immer auf die Benutzer hören. Manche Benutzer wollen immer neue Features haben und andere werden neue Features hassen. Nur ein Teil wird sich beschweren. Analysiere stattdessen, welche Features die Leute auf deiner Seite tatsächlich benutzen.
Kommentar veröffentlichen