Wie Facebook Milliarden von Anfragen pro Sekunde effizient bearbeitete

Facebook erhält Milliarden von Anfragen pro Sekunde und speichert Billionen von Artikeln in seinen Datenbanken.

Laut ihrem Team konnten „traditionelle Webarchitekturen“ mit den Anforderungen des sozialen Netzwerks einfach nicht mithalten.

Facebook nutzte einen einfachen Schlüsselwertspeicher namens Im Speicher gespeichert Und skaliert es auf Bearbeiten Sie effizient Milliarden von Anfragen pro Sekunde für Billionen von Artikeln.

Sie bemerkten im Jahr 2013 dass ihr System „das größte zwischengespeichert Installation in der Welt“.

Wenn Sie den technischen Teil überspringen möchten, können Sie gerne mit dem fortfahren Abschnitt „Lektionen und Imbissbuden“. Am Ende.

  • Konzentrieren Sie sich auf den Benutzer. Jede Änderung muss nur Auswirkungen auf ein Benutzer- oder Betriebsproblem haben.

  • Streben Sie nicht nach Perfektion. Sie sind damit einverstanden, dass einige Benutzer veraltete Daten erhalten, wenn sie dadurch weiter skalieren können.

Sie behielten die folgenden Annahmen im Hinterkopf:

  1. Benutzer lesen mehr als sie schreiben.

  2. Es stehen mehrere Datenquellen zum Lesen zur Verfügung.

  3. Lesen, Schreiben und Kommunizieren müssen nahezu augenblicklich erfolgen.

Sie hatten drei Skalierungsebenen: Cluster, Region und weltweit.

Sie skalierten Im Speicher gespeichert um dies zu tun.

Es ist ein Grundlegender Schlüsselwertspeicher, implementiert mithilfe einer Hash-Tabelle, gespeichert im Speicher. Es handelt sich um eine Caching-Schicht über der Datenbank.

Datenbank-Lesevorgänge sind wesentlich teurer als In-Memory-Lesevorgänge. In den Datenbanken von Facebook wurden Billionen von Elementen gespeichert.

Beispielsweise dauerte die Rückgabe einer 1,2 MB großen JSON-Antwort in einer von mir entwickelten App etwa 1100 ms. Nachdem ich installiert habe Im Speicher gespeichertdauerte die Rückkehr im Cache nur 200 ms.

Im Speicher gespeichert gespeicherte Antworten auf verschiedene Anfragen.

Wenn ein Benutzer seine Profilinformationen anfordert und diese sich seit seiner letzten Anfrage nicht geändert haben, wurde die Antwort dieser Anfrage bereits in Memcached gespeichert.

Außerdem wurden gängige Zwischenartefakte gespeichert, etwa vorberechnete Ergebnisse der maschinellen Lernalgorithmen von Facebook.

„Memcached bietet eine einfache Reihe von Operationen (Festlegen, Abrufen und Löschen), die es als elementare Komponente in einem großen verteilten System attraktiv machen.“ (Abschnitt 2, Übersicht)

In der Zeitung verwenden sie Im Speicher gespeichert als grundlegender Schlüsselwertspeicher und Memcache als verteilte Systemversion von Im Speicher gespeichert dass sie laufen. Diese verteilte Version von Im Speicher gespeichert verfügt über zusätzliche Fähigkeiten, wie einen speziellen Client für die Server-zu-Server-Kommunikation und mehr.

Ich fand ihre Benennung verwirrend, deshalb verweise ich auf ihre verteilte Systemversion. Memcachefür den Rest dieses Beitrags.

Ziele:

Innerhalb eines Clusters verfügte Facebook über Tausende von Servern.

Jeder Server hatte eine Memcache Client, der eine Reihe von Funktionen erfüllte (Komprimierung, Serialisierung, Komprimierung usw.). Alle Clients verfügten über eine Karte aller verfügbaren Server.

Lesen Sie auch  SaltWire Network beantragt Gläubigerschutz und hat Schulden in Höhe von 94 Millionen US-Dollar

Das Laden einer beliebten Facebook-Seite führt im Durchschnitt zu 521 verschiedene Lesungen von Memcache.

Normalerweise muss ein Webserver mit mehreren kommunizieren Memcache Server nur für 1 Anfrage.

Anfragen mussten nahezu in Echtzeit ausgefüllt und zurückgesendet werden.

Facebook hatte drei Strategien: parallele Anfragen + Stapelverarbeitung, schnellere Client-Server-Kommunikation und Kontrolle der Anfragestaus.

Das Ziel der Verwendung paralleler Anfragen und der Stapelverarbeitung bestand darin, die Anzahl der Netzwerk-Roundtrips zu reduzieren.

Sie erstellten einen DAG von Datenabhängigkeiten, der verwendet wurde, um die Anzahl der Elemente zu maximieren, die gleichzeitig abgerufen werden können, was (im Durchschnitt) 24 Schlüsseln gleichzeitig entsprach.

Die Komplexität wurde in einen zustandslosen Client eingefügt, sodass der Memcache Server könnten einfach gehalten werden.

UDP wurde für Get-Anfragen verwendet Memcache weil alle Probleme als clientseitige Fehler angezeigt werden. (also versucht der Benutzer es einfach noch einmal)

TCP wurde für Setz-/Löschvorgänge mit einem verwendet mcrouter Beispiel.

McRouter ist ein Proxy, der die präsentiert Memcache Serverschnittstelle und leitet die Anfragen/Antworten an/von anderen Servern weiter.

Wenn es zu viele Anfragen auf einmal gibt, Memcache Clients verwenden einen Schiebefenstermechanismus, um die Anzahl ausstehender Anforderungen zu steuern.

Die von ihnen verwendete Fenstergröße wurde durch eine Datenanalyse ermittelt, bei der sie ein Gleichgewicht zwischen zu hoher Benutzerlatenz und zu vielen eingehenden Anfragen gleichzeitig fanden

Facebook reduzierte die Belastung der Datenbank mit drei Strategien: Leasing, Memcache Pools und Replikation innerhalb von Pools.

Wenn beim Client ein Cache-Fehler auftritt, a Memcache Instanz gibt a aus vorübergehender Mietvertrag. Wenn der Server manchmal in den Cache zurückschreibt, ist die Lease abgelaufen, was bedeutet, dass sie zu diesem Zeitpunkt zu alt ist und durch neuere Daten gefüllt wurde.

Mietverträge lösten zwei Probleme:

Mietverträge können pro Schlüssel nur alle 10 Sekunden vergeben werden.

Durch Leasing konnte die maximale Datenbankabfragerate von 17.000/s auf 1,3.000/s gesteigert werden.

Ein Cluster Memcache Server werden in separate Pools aufgeteilt.

Für die meisten Schlüssel gibt es einen Standardpool.

Der Rest verfügt über „problematische“ oder „spezielle“ Schlüssel, die sich nicht im Standardpool befinden, z. B. Schlüssel, auf die häufig zugegriffen wird, bei denen ein Cache-Fehler jedoch keine Rolle bei der Last oder Latenz spielt.

Wir entscheiden uns für die Replikation einer Schlüsselkategorie innerhalb eines Pools, wenn:

(1) Die Anwendung ruft routinemäßig viele Schlüssel gleichzeitig ab

(2) Der gesamte Datensatz passt in eins oder zwei Memcache Server

(3) Die Anforderungsrate ist viel höher als das, was ein einzelner Server verwalten kann.

Zitiert aus Abschnitt 3.2.3

Sie können einen Cluster nicht unendlich skalieren.

Lesen Sie auch  MEINUNG: Nach 12 Jahren islamistischer Terroranschläge scheinen Frankreich die Ideen ausgegangen zu sein

Mehrere (Frontend-)Cluster bilden eine Region. Sie hätten mehrere Web- und Memcache Servern sowie einem Speichercluster.

Sie hatten drei Strategien zur Skalierung Memcache innerhalb einer Region: ein Invalidierungsdämon, ein regionaler Pool und ein „Kaltstart“-Mechanismus zum schnellen Hochfahren neuer Cluster.

Ein Invalidierungsdämon (genannt mcsqueal), der die Cache-Invalidierungen über alle Caches in einer Region repliziert.

Wenn sich Daten im Speichercluster (Datenbanken) ändern, sendet er Ungültigmachungen an seine eigenen Cluster.

Jede Datenbank hat mcsqueal.

Mcsqueal löscht stapelweise in weniger Pakete und sendet sie dann an mcrouter Server in jedem Frontend-Cluster, die dann Invalidierungen nach rechts weiterleiten Memcache Server.

Regionaler Pool von Memcache Server, die alle Cluster in einer Region für bestimmte Datentypen gemeinsam nutzen.

Mehrere Frontend-Cluster nutzen denselben Satz von Memcache Server, die innerhalb einer Region existieren.

Die Replikation ist teuer, daher speichert der regionale Pool „seltsame“ Daten, beispielsweise Daten, auf die nicht oft zugegriffen wird. Dies erfolgt durch die Verwendung einiger Faktoren wie der durchschnittlichen Anzahl der Benutzer, der Anzahl der Zugriffe pro Sekunde und der durchschnittlichen Wertgröße.

Ein „kalter Cluster“ oder ein Frontend-Cluster mit leerem Cache ruft Daten von einem „warmen Cluster“ oder einem Cluster mit normalen Trefferraten-Caches ab.

Dadurch verkürzte sich die „Aufstellungszeit“ eines neuen Clusters von wenigen Tagen auf nur wenige Stunden.

Hinweis: Hier kann es zu Race-Conditions mit Cache-Konsistenz kommen, die gelöst werden, indem Löschvorgängen im Cold-Cluster eine Verzögerung von zwei Sekunden hinzugefügt wird. Dies wird deaktiviert, sobald die Cache-Trefferrate des Cold-Clusters abnimmt.

Regionen werden aus mehreren Gründen auf der ganzen Welt platziert:

  • Seien Sie näher an den Benutzern

  • Auswirkungen von Naturereignissen wie Stromausfällen abmildern

  • Einige Standorte bieten bessere wirtschaftliche Anreize (billigerer Strom, Steuererleichterungen usw.).

Regionenübergreifend verfügt eine Region über einen Speichercluster und mehrere Frontend-Cluster.

Eine Region enthält die Masterdatenbanken und die anderen Regionen enthalten schreibgeschützte Replikate, was mithilfe des Replikationsmechanismus von MySQL erfolgt.

Sie haben eine Best-Effort-Konsistenz, legen aber Wert auf Leistung und Betriebszeit.

Das Facebook-Team hat den Invalidierungsdaemon implementiert mcsqueal nach der Skalierung auf mehrere Regionen, sodass sie von Anfang an Code schreiben konnten, um die Rennbedingungen auf globaler Ebene ordnungsgemäß zu bewältigen.

Sie verwenden einen Remote-Markierungsmechanismus, um die Wahrscheinlichkeit zu verringern, veraltete Daten zu lesen. Diese ist höher, wenn Schreibvorgänge aus einer Nicht-Master-Region erfolgen. Lesen Sie mehr darüber in der Zeitung.

  • Sie haben optimiert zwischengespeichert selbst:

    • Erlaubt die automatische Erweiterung der internen Hash-Tabelle

    • Der Server wurde mithilfe einer globalen Sperre multithreadfähig gemacht

    • Hat jedem Thread einen eigenen UDP-Port gegeben

  • Die ersten beiden Optimierungen wurden an die Open-Source-Community zurückgegeben

  • Sie verfügen außerdem über viele weitere Optimierungen, die Facebook-intern bleiben.

  • Software-Upgrades auf eine Reihe von zwischengespeichert Server können übernehmen 12 Stunden.

Lesen Sie auch  Internet: Studie: App-Store von Apple ermöglichte Billionen-Umsatz

Bei Facebook fallen jede Minute Server, Festplatten und andere Hardwarekomponenten aus.

Wenn Hosts nicht erreichbar sind, verfügen sie über ein automatisiertes Behebungssystem.

Etwa 1 % davon Memcache Server in einem Cluster sind Teil davon Dachrinnenbeckenund dienen dazu, einige ausgefallene Server zu ersetzen.

Zunächst die Lehren von Facebook selbst, die in Abschnitt 9 (Schlussfolgerung) zu finden sind.

(1) Durch die Trennung von Cache- und persistenten Speichersystemen können wir diese unabhängig skalieren.

(2) Funktionen, die die Überwachung, das Debugging und die Betriebseffizienz verbessern, sind ebenso wichtig wie die Leistung.

(3) Die Verwaltung zustandsbehafteter Komponenten ist operativ komplexer als die Verwaltung zustandsloser Komponenten. Dadurch hilft die Beibehaltung der Logik in einem zustandslosen Client dabei, Funktionen zu iterieren und Störungen zu minimieren.

(4) Das System muss den schrittweisen Rollout und Rollback neuer Funktionen unterstützen, auch wenn dies zu einer vorübergehenden Heterogenität der Funktionssätze führt.

(5) Einfachheit ist entscheidend.

  • Sie haben Prioritäten gesetzt Betriebszeit und Verfügbarkeit. Jeder Kompromiss, den sie eingingen, wurde untersucht, gemessen und gut erklärt.

  • Einfachheit ist entscheidend was auch so war Leitprinzip der Instagram-Technik für ihre eigene Architektur, während sie skalierten.

  • Sie skaliert mit einer bewährten Technologie für eine sehr lange Zeit. Mir ist aufgefallen, dass sie angepasst wurden zwischengespeichert für ihre Bedürfnisse, anstatt sofort ihren eigenen, maßgeschneiderten KV-Shop zu bauen.

    • Ich glaube nicht, dass sie es verwenden zwischengespeichert mehr auf diese Weise, aber interessanterweise scheint dies wie ein ein ganz anderer Ansatz als Google oder Apple, die es vorziehen, ihre eigenen benutzerdefinierten Tools im eigenen Haus zu entwickeln.

    • Ich frage mich, ob das beim Onboarding und Recruiting hilft. Die meisten Backend-Ingenieure sind damit vertraut zwischengespeichertdaher ist es leicht zu verstehen, wie es funktioniert.

    • Dies war auch ein Leitprinzip von Instagram.

  • Schon damals, Sie leisteten einen Beitrag zur Forschungsgemeinschaft. Das ist heute vielleicht nicht mehr ganz so neuartig, aber damals war es ein beachtlicher Beitrag!

  • Facebook hat auch einige seiner Änderungen zur Open-Source-Lösung beigetragen zwischengespeichert. Die Open-Source-Kultur war damals auf Facebook lebendig und gutund es ist auch heute noch stark, mit React, LLaMA, PyTorch und mehr.

Ich weiß nicht, ob Facebook Memcached mehr verwendet, seit diesem Artikel darüber TAO beschreibt ein maßgeschneidertes System, das Teile davon ersetzt.

Quelle: Skalierung des Memcaches bei Facebook (2013)

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.