Wie Quora MySQL auf über 100.000 Abfragen pro Sekunde skalierte

Heute werden wir darüber reden

  • Skalierung von MySQL bei Quora

    • Quora verwendet einen Shard-MySQL-Cluster zum Speichern von Fragen, Antworten, Upvotes, Kommentaren usw.

    • Datenbank-Lesevorgänge mit Caching und Abfrageoptimierung skalieren

    • Skalieren Sie den Datenbankspeicher durch den Wechsel zu RocksDB

    • Skalieren von Datenbankschreibvorgängen mit parallelisierter Replikation

  • Tech-Snippets

    • Umsetzbare Tipps zur Verbesserung Ihrer Codierungsgeschwindigkeit und -effizienz

    • Wie Shopify Pair Programming für Mentoring nutzt

    • Der Wert interner Expertise

    • Was einen großartigen Manager von Software-Ingenieuren ausmacht

    • Karriereberatung für Nachwuchsentwickler

Der Beitritt zu einer Discord-Gruppe für Ihr Lieblings-Framework/Ihre Lieblingssprache ist eine fantastische Möglichkeit, Ihre Lernkurve zu beschleunigen.

Appwrite betreibt eine Community von über 16.000 Entwicklern, die äußerst freundlich, integrativ und voller erfahrener Entwickler ist.

Es ist ein fantastischer Ort

  • Chatten Sie über die neuesten Trends in der Full-Stack-Entwicklung

  • Finden Sie technische Mitgründer für Ihr nächstes Projekt

  • Erfahren Sie, wie Sie hoch skalierbare Anwendungen erstellen

Die Ingenieure von Appwrite sind auch im Discord äußerst aktiv, sodass sie eine großartige Hilfsquelle sind, wenn Sie mit Appwrite eine Web-, iOS-, Android- oder Flutter-App erstellen. Oder Sie können darüber sprechen, was sie bei der Skalierung von Appwrite für mehr als 26.000 Ingenieure gelernt haben!

Quora ist eine Social-Media-Site, auf der Sie Fragen posten können, auf die die Community antworten kann. Sie haben über 300 Millionen monatlich aktive Benutzer, die täglich Zehntausende Fragen stellen.

Um diesen Datenverkehr zu bedienen, nutzen sie intensiv MySQL. Sie verfügen über eine Shard-Konfiguration, die mehrere zehn Terabyte speichert und auf Hunderttausende QPS skaliert werden kann (Anfragen pro Sekunde).

Wenn Sie neugierig sind, wie sie MySQL fragmentiert haben, können Sie hier darüber lesen.

Zusätzlich zum Hinzufügen weiterer Maschinen zum MySQL-Cluster musste Quora sicherstellen, dass das bestehende Setup so effizient wie möglich läuft.

Vamsi Ponnekanti ist Softwareentwickler bei Quora und hat einen fantastischen Artikel geschrieben, in dem er sich mit den verschiedenen Faktoren der Datenbanklast und den spezifischen Schritten beschäftigt, die die Entwicklerteams zur Optimierung unternommen haben.

Bei der Datenbanklast gibt es drei Hauptfaktoren für die Skalierung: Leselast, Schreiblast und Datengröße.

  • Lesevolumen – Wie viele Leseanfragen können Sie pro Sekunde verarbeiten? Quora hat dies durch die Verbesserung seiner Caching-Strategie (Änderung der Struktur zur Minimierung von Cache-Fehlern) und durch die Optimierung ineffizienter Leseabfragen erreicht.

  • Volumen schreiben – Wie viele Schreibanfragen können Sie pro Sekunde bearbeiten? Quora ist keine schreibintensive Anwendung. Das Hauptproblem, mit dem sie konfrontiert waren, war die Replikation zwischen den primären Replikatknoten. Sie haben das Problem behoben, indem sie geändert haben, wie Schreibvorgänge wiedergegeben werden.

  • Datengröße – Wie viele Daten werden auf Ihren Festplatten gespeichert? Quora hat dies optimiert, indem es die MySQL-Speicher-Engine von InnoDB (der Standard) zu RocksDB.

Lesen Sie auch  Der deutsche Finanzminister bedauert „verschwendete Jahre“ unter von der Leyen

Wir werden uns näher mit jedem dieser Punkte befassen.

Lesevolumen

Quora hat eine hohe Leselast, daher ist die Optimierung der Lesevorgänge äußerst wichtig. Allerdings erfordern unterschiedliche Arten von Lesevorgängen unterschiedliche Optimierungen.

Eine Möglichkeit, die überschüssige Last Ihres Leseverkehrs aufzuteilen, ist mit

  • Komplexe Abfragen – Abfragen, die CPU-intensiv sind und die Datenbank belasten (Joins, Aggregationen usw.).

  • Hohe Anfragen pro Sekunde – Wenn Sie viel Datenverkehr haben, werden Sie mit hohen QPS zu kämpfen haben, unabhängig davon, wie gut Sie Ihre Datenbank entwerfen.

Hier erfahren Sie, wie Quora mit jedem dieser Probleme umgegangen ist.

Komplexe Abfragen

Bei komplexen Abfragen besteht die Strategie einfach darin, diese neu zu schreiben, damit sie weniger Datenbanklast beanspruchen.

  • Große Scan-Abfragen – Wenn Sie eine Abfrage haben, die eine große Anzahl von Zeilen durchsucht, ändern Sie sie so, dass die Paginierung verwendet wird, damit die Abfrageergebnisse in kleineren Blöcken abgerufen werden. Dadurch wird sichergestellt, dass die Datenbank keine unnötige Arbeit leistet.

  • Langsame Abfragen – Es gibt viele Gründe, warum eine Abfrage langsam sein kann: kein guter Index, unnötig angeforderte Spalten, ineffiziente Verknüpfungen usw. Hier ist ein guter Blogbeitrag darüber, wie man langsame Abfragen findet und optimiert.

Hohe QPS-Anfragen

Die Lösung zur Reduzierung der Belastung durch diese Art von Abfragen ist eine effiziente Caching-Strategie. Bei Quora stellten sie fest, dass ineffizientes Caching (viele Cache-Fehler) die Ursache für viel unnötige Datenbanklast war.

Einige konkrete Beispiele, die Quora sah, waren:

  • Abrufen der Spracheinstellungen eines Benutzers – Quora musste überprüfen, welche Sprachen ein Benutzer versteht. Zuvor haben sie den Cache mit abgefragt (Benutzer-ID, Sprach-ID) und erhalten eine Ja/Nein-Antwort. Eine Abfrage von (carlos_sainz, spanisch) Ich würde prüfen, ob der Benutzer Carlos Sainz Spanisch versteht. Sie würden diese Abfrage für alle 25 von Quora unterstützten Sprachen ausführen – (carlos_sainz, Englisch), (carlos_sainz, französisch), usw.

    Dies führte zu einem großen Schlüsselraum für den Cache (Mögliche Schlüssel waren alle Benutzer-IDs multipliziert mit der Anzahl der Sprachen) und es kam zu einer großen Anzahl von Cache-Fehlern. Die Leute beherrschen normalerweise nur ein oder zwei Sprachen, daher führten die meisten dieser Anfragen zu „ NEIN. Dies verursachte eine Menge unnötiger Datenbanklast.

    Quora hat seinen Cache-Schlüssel dahingehend geändert, dass nur noch die Benutzer-ID verwendet wird (Carlos Sainz) und änderte die Nutzlast, um nur alle Sprachen zurückzusenden, die der Benutzer kannte. Dadurch erhöhte sich die Größe der zurückgesendeten Nutzlast (eine Liste von Sprachen statt nur Ja/Nein), aber es bedeutete eine deutlich höhere Cache-Trefferquote.

    Dadurch reduzierte Quora die QPS in der Datenbank bei dieser Art von Abfragen um über 90 %.

  • Ineffizientes Caching für spärliche Datensätze – Ein weiteres Problem beim Caching, auf das Quora häufig stieß, war spärlich Datensätze in einer Dimension. Beispielsweise müssen sie möglicherweise die Datenbank abfragen, um festzustellen, ob eine bestimmte Frage auf eine andere Frage umgeleitet werden muss (Dies kann passieren, wenn dieselbe Frage erneut gestellt wird).

    Die allermeisten Fragen nicht müssen umgeleitet werden, damit Quora nur wenige „Weiterleitungen“ und eine große Anzahl „Nicht weiterleiten“ erhält.

    Als sie gerade vorbeikamen Frage_IDdann wäre der Cache gefüllt mit Nein und nur wenige Weiterleitungen. Dies beanspruchte eine Menge Platz im Cache und führte auch zu einer Menge Cache-Fehlern, da die Anzahl der „Weiterleitungen“ so gering war.

    Stattdessen begannen sie mit dem Caching Bereiche. Wenn Frage-IDs 123127 Wenn es für keine der dortigen Fragen Weiterleitungen gab, würden sie den Bereich zwischenspeichern, in dem es nur Neins gibt, anstatt jede einzelne Fragen-ID zwischenzuspeichern.

    Dies führte zu einer starken Reduzierung der Datenbanklast für diese Art von Abfragen, wobei die QPS um 90 % sanken.

Lesen Sie auch  Jeremy Hunt wird für die chaotische Bilanz der Tory-Partei kritisiert

Reduzierung des von der Datenbank verwendeten Speicherplatzes

Ein weiterer Teil der Skalierung von Datenbanken ist die Bewältigung der riesigen Datenmengen, die Sie speichern müssen.

Große Tische haben viele Effekte zweiter Ordnung, die Ihnen das Leben schwerer machen

  • Mit zunehmender Tabellengröße passt ein kleinerer Prozentsatz der Tabellendaten in den Datenbankpufferpool, was bedeutet, dass die Festplatten-E/A zunimmt und die Leistung schlechter wird

  • Die Sicherungs- und Wiederherstellungszeiten nehmen linear mit der Tabellengröße zu

  • Die Größe des Backup-Speichers wächst ebenfalls linear

Daher sollten Sie genau wissen, welche Daten gespeichert werden müssen und welche Daten entfernt werden können. Optimale Richtlinien zur Datenaufbewahrung sind von entscheidender Bedeutung.

Um nun die Art und Weise, wie Daten auf der Festplatte gespeichert werden, zu optimieren, hat Quora RocksDB integriert.

RocksDB ist ein bei Facebook entwickelter Schlüsselwertspeicher, der eine Abzweigung von LevelDB von Google darstellt. Es wird üblicherweise als Speicher-Engine (die Speicher-Engine ist dafür verantwortlich, wie Daten gespeichert und von der Festplatte abgerufen werden) für NoSQL-Datenbanken eingesetzt.

Verwendung von MyRocks (RocksDB) zur Reduzierung der Tabellengröße

MyRocks wurde zuerst bei Facebook entwickelt, wo RocksDB als Speicher-Engine für MySQL integriert wurde. Eine ausführliche Analyse der Vorteile können Sie hier lesen.

Einer der großen Vorteile ist die erhöhte Komprimierungseffizienz. Ihre Daten werden in einem Datenblock namens a auf die Festplatte geschrieben Seite. Datenbanken können Daten seitenweise lesen/schreiben. Wenn Sie ein bestimmtes Datenelement anfordern, wird die gesamte Seite in den Speicher abgerufen.

Bei InnoDB sind die Seitengrößen festgelegt (Standard ist 16 KB). Wenn die Daten die Seitengröße nicht ausfüllen, wird der verbleibende Platz verschwendet. Dies kann zu zusätzlicher Fragmentierung führen.

Lesen Sie auch  [뉴페@스프] Wie soll ein Mensch leben, der weit vom Tod entfernt ist?

Mit RocksDB haben Sie variable Seitengrößen. Dies ist einer der Hauptgründe, warum RocksDB besser komprimiert. Für eine ausführliche Analyse empfehle ich dringend die Lektüre des Facebook-Blogbeitrags.

Facebook konnte seinen Speicherverbrauch reduzieren entzwei durch die Migration zu MyRocks.

Bei Quora konnten sie eine 80-prozentige Platzeinsparung für einen ihrer Tische feststellen. Bei anderen Tischen wurde der Platzbedarf um 50–60 % reduziert.

Schreibvorgänge optimieren

Mit Quora wird ihre Datenbank geladen ist nicht schreibe schwer. Wenn sie schreibintensive Arbeitslasten hatten, verwendeten sie HBase (eine schreiboptimierte verteilte Datenbank nach dem Vorbild von Google Bigtable) anstelle von MySQL.

Ein Problem sahen sie jedoch in einer übermäßigen Replikationsverzögerung zwischen MySQL-Instanzen. Sie haben ein primär Instanz, die Datenbankschreibvorgänge verarbeitet, und dann haben sie es Replik Instanzen, die Lesevorgänge verarbeiten. Replikatknoten blieben beim Erhalten dieser Änderungen hinter dem Primärknoten zurück.

Das Hauptproblem bestand darin, dass Replikations-Replay-Schreibvorgänge stattfinden der Reihe nach standardmäßig, auch wenn die Schreibvorgänge gleichzeitig auf dem Primärserver erfolgten.

Die vorübergehende Lösung, die Quora verwendete, bestand darin, Tabellen mit hohem Schreibaufwand von einem MySQL-Primärknoten auf einen anderen Knoten mit weniger Schreibdruck zu verschieben. Dies half bei der Lastverteilung, war aber nicht skalierbar.

Die dauerhafte Lösung bestand darin, die parallele Replikationsschreibfunktion von MySQL zu integrieren.

Für alle Details können Sie den vollständigen Blogbeitrag hier lesen.

Der Beitritt zu einer Discord-Gruppe für Ihr Lieblings-Framework/Ihre Lieblingssprache ist eine fantastische Möglichkeit, Ihre Lernkurve zu beschleunigen.

Appwrite betreibt eine Community von über 16.000 Entwicklern, die äußerst freundlich, integrativ und voller erfahrener Entwickler ist.

Es ist ein fantastischer Ort

  • Chatten Sie über die neuesten Trends in der Full-Stack-Entwicklung

  • Finden Sie technische Mitgründer für Ihr nächstes Projekt

  • Erfahren Sie, wie Sie hoch skalierbare Anwendungen erstellen

Die Ingenieure von Appwrite sind auch im Discord äußerst aktiv, sodass sie eine großartige Hilfsquelle sind, wenn Sie mit Appwrite eine Web-, iOS-, Android- oder Flutter-App erstellen. Oder Sie können darüber sprechen, was sie bei der Skalierung von Appwrite für mehr als 26.000 Ingenieure gelernt haben!

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.