Frage MySQL Sharding-Ansätze?


Was ist der beste Ansatz für das Sharing von MySQL-Tabellen? Die Ansätze, die ich mir vorstellen kann, sind:

  1. Anwendungsebene sharding?
  2. Sharing auf MySQL Proxy-Ebene?
  3. Zentraler Lookup-Server zum Sharding?

Kennen Sie interessante Projekte oder Tools in diesem Bereich?


76
2018-04-04 16:26


Ursprung


Antworten:


Der beste Ansatz für die Erstellung von MySQL-Tabellen, um es nicht zu tun, es sei denn, es ist absolut unvermeidlich, es zu tun.

Wenn Sie eine Anwendung schreiben, möchten Sie dies normalerweise so tun, dass Geschwindigkeit und Entwicklergeschwindigkeit maximiert werden. Sie optimieren Latenz (Zeit bis die Antwort fertig ist) oder Durchsatz (Anzahl der Antworten pro Zeiteinheit) nur bei Bedarf.

Sie partitionieren und weisen dann Partitionen nur dann unterschiedlichen Hosts (= shard) zu, wenn die Summe all dieser Partitionen nicht mehr auf eine einzelne Datenbankserverinstanz passt - der Grund hierfür sind Schreib- oder Lesevorgänge.

Der Schreibfall ist entweder a) die Häufigkeit von Schreibvorgängen überlastet diese Serverfestplatten dauerhaft oder b) es laufen zu viele Schreibvorgänge ab, so dass die Replikation in dieser Replikationshierarchie permanent nacheilt.

Der Lesefall für das Sharding liegt vor, wenn die Größe der Daten so groß ist, dass der Arbeitssatz nicht mehr in den Speicher passt und die Datenlesevorgänge beginnen, auf die Festplatte zu stoßen, anstatt die meiste Zeit aus dem Speicher bereitgestellt zu werden.

Nur wenn du haben zu shard du machst es.


In dem Moment, in dem du zersplitterst, zahlst du dafür auf verschiedene Arten:

Ein großer Teil Ihres SQL ist nicht mehr deklarativ.

Normalerweise teilen Sie der Datenbank in SQL mit, welche Daten Sie wünschen, und überlassen diese dem Optimierer, um diese Spezifikation in ein Datenzugriffsprogramm umzuwandeln. Das ist eine gute Sache, weil es flexibel ist und weil das Schreiben dieser Datenzugriffsprogramme eine langweilige Arbeit ist, die die Geschwindigkeit beeinträchtigt.

In einer sharded Umgebung verbinden Sie wahrscheinlich eine Tabelle auf Knoten A mit Daten auf Knoten B oder Sie haben eine Tabelle größer als ein Knoten auf Knoten A und B und verbinden Daten daraus mit Daten, die sich auf Knoten B und C befinden. Sie fangen an, Hash-basierte Join-Auflösungen auf der Anwendungsseite manuell zu schreiben, um das zu lösen (oder Sie erfinden den MySQL-Cluster neu), was bedeutet, dass Sie eine Menge SQL haben, die nicht mehr deklarativ ist, sondern die SQL-Funktionalität prozedural ausdrückt (ZB verwenden Sie SELECT-Anweisungen in Schleifen).

Sie haben eine große Netzwerklatenzzeit.

Normalerweise kann eine SQL-Abfrage lokal aufgelöst werden, und der Optimierer weiß um die Kosten, die mit lokalen Festplattenzugriffen verbunden sind, und löst die Abfrage auf eine Weise, die die Kosten dafür minimiert.

In einer Sharded-Umgebung werden Abfragen gelöst, indem entweder Schlüssel-Wert-Zugriffe über ein Netzwerk auf mehrere Knoten ausgeführt werden (hoffentlich mit gebuchten Schlüsselzugriffen und nicht einzelnen Schlüsselsuchen pro Rundreise) oder indem Teile des WHERE Klausel weiter zu den Knoten, wo sie angewendet werden können (das heißt 'Bedingungs-Pushdown'), oder beides.

Aber selbst in den besten Fällen beinhaltet dies viel mehr Netzwerk-Rundreisen, als eine lokale Situation, und es ist komplizierter. Vor allem, weil der MySQL-Optimierer überhaupt nichts über die Netzwerklatenz weiß (Ok, der MySQL-Cluster wird langsam besser, aber für MySQL ist MySQL außerhalb des Clusters immer noch wahr).

Sie verlieren viel Ausdruckskraft von SQL.

Ok, das ist wahrscheinlich weniger wichtig, aber Fremdschlüsseleinschränkungen und andere SQL-Mechanismen für die Datenintegrität können nicht mehrere Shards überspannen.

MySQL hat keine API, die asynchrone Abfragen erlaubt, die funktionieren.

Wenn sich Daten desselben Typs auf mehreren Knoten befinden (z. B. Benutzerdaten auf Knoten A, B und C), müssen horizontale Abfragen häufig für alle Knoten aufgelöst werden ("Alle Benutzerkonten suchen, die seit 90 Tagen nicht mehr angemeldet sind oder mehr"). Die Datenzugriffszeit wächst linear mit der Anzahl der Knoten, es sei denn, mehrere Knoten können parallel abgefragt werden und die Ergebnisse werden so aggregiert, wie sie eingehen ("Map-Reduce").

Voraussetzung hierfür ist eine asynchrone Kommunikations-API, die für MySQL in einer guten Arbeitsform nicht existiert. Die Alternative ist eine Menge Forking und Verbindungen in den Kinderprozessen, die die Welt des Saugens auf einem Saisonpass besuchen.


Sobald Sie Sharding starten, werden Datenstruktur und Netzwerktopologie als Leistungspunkte für Ihre Anwendung sichtbar. Um eine vernünftige Leistung zu erzielen, muss Ihre Anwendung sich dieser Dinge bewusst sein, und das bedeutet, dass wirklich nur die Anwendungsebene sinnvoll ist.

Die Frage ist mehr, wenn Sie eine automatische Shard-Funktion verwenden möchten (indem Sie z. B. bestimmen, welche Zeile in welchen Knoten durch Hashing von Primärschlüsseln geht) oder ob Sie die Funktion manuell aufteilen möchten ("Die mit der xyz-Benutzergeschichte verknüpften Tabellen) Master, während Abc und Def verwandte Tabellen zu diesem Master gehen ").

Funktionales Sharding hat den Vorteil, dass es, wenn es richtig gemacht wird, für die meisten Entwickler die meiste Zeit unsichtbar ist, weil alle Tabellen, die sich auf ihre User Story beziehen, lokal verfügbar sein werden. Dadurch können sie immer noch so lange wie möglich von deklarativem SQL profitieren, und die Netzwerklatenz verringert sich, da die Anzahl der netzwerkübergreifenden Übertragungen minimal gehalten wird.

Funktionales Sharding hat den Nachteil, dass keine einzelne Tabelle größer als eine Instanz sein kann und manuelle Aufmerksamkeit eines Designers erfordert.

Funktionales Sharding hat den Vorteil, dass es relativ leicht zu einer bestehenden Codebasis mit einer Anzahl von Änderungen, die nicht übermäßig groß ist, getan werden kann. http://Booking.com hat es in den letzten Jahren mehrfach getan und es hat gut für sie funktioniert.


Nachdem ich all das gesagt habe und Ihre Frage betrachtet habe, glaube ich, dass Sie die falschen Fragen stellen, oder ich verstehe Ihre Problemstellung komplett falsch.


93
2018-04-11 06:16



  1. Sharting auf Anwendungsebene: dbShards ist das einzige Produkt, das ich kenne, das "anwendungsbewusstes Sharding" durchführt. Es gibt ein paar gute Artikel auf der Website. Per definitionem wird anwendungsbewusstes Sharding effizienter sein. Wenn eine Anwendung genau weiß, wohin sie mit einer Transaktion gehen soll, ohne nachzuschauen oder von einem Proxy weitergeleitet zu werden, wird das selbst schneller sein. Und Geschwindigkeit ist oft eines der Hauptanliegen, wenn nicht die einzige Sorge, wenn jemand Sharding betreibt.

  2. Manche Leute "shard" mit einem Proxy, aber in meinen Augen, die den Zweck der sharding besiegt. Sie verwenden nur einen anderen Server, um Ihren Transaktionen mitzuteilen, wo die Daten zu finden sind oder wo sie gespeichert werden sollen. Mit anwendungsbewusstem Sharding weiß Ihre Anwendung, wo sie eigenständig arbeiten kann. Viel effizienter.

  3. Das ist das gleiche wie # 2 wirklich.


10
2018-04-04 16:34



Kennen Sie interessante Projekte oder Tools in diesem Bereich?

Mehrere neue Projekte in diesem Bereich:

  • citusdata.com
  • spockproxy.sourceforge.de
  • github.com/twitter/gizzard/

7
2018-06-29 12:35



Splitter-Abfrage ist eine OLAP-basierte Sharding-Lösung für MySQL. Es ermöglicht Ihnen, eine Kombination aus formatierten Tabellen und unbeschichteten Tabellen zu definieren. Die nicht erschöpften Tabellen (wie Nachschlagetabellen) können frei an sharded -Tabellen angefügt werden, und sharded Tabellen können miteinander verbunden werden, solange die Tabellen durch den Shard-Schlüssel verbunden sind (kein Cross Shard oder Self Joins, die Shard-Grenzen überschreiten). Da es sich um eine OLAP-Lösung handelt, hat Shard-Query in der Regel minimale Antwortzeiten von 100 ms oder weniger, sogar für einfache Abfragen, so dass es für OLTP nicht funktioniert. Shard-Query wurde entwickelt, um große Datenmengen parallel zu analysieren.

OLTP-Sharing-Lösungen gibt es auch für MySQL. Closed-Source-Lösungen umfassen ScaleDB, DBSchwerte. Open-Source-OLTP-Lösung enthalten JetPants, Kubid oder Flock / Gizzard (Twitter-Infrastruktur).


4
2018-06-17 01:40



Bewerbungsniveau natürlich.

Der beste Ansatz, den ich je gemacht habe, habe ich in diesem Buch gefunden

Hochleistungs-MySQL http://www.amazon.com/High-Performance-MySQL-Jeremy-Zawodny/dp/0596003064

Kurzbeschreibung: Sie können Ihre Daten in viele Teile aufteilen und ~ 50 Teile auf jedem Server speichern. Es wird Ihnen helfen, das zweitgrößte Problem des Sharding - Rebalancing zu vermeiden. Verschieben Sie einfach einige von ihnen auf den neuen Server und alles wird gut :)

Ich empfehle Ihnen dringend, es zu kaufen und lesen "mysql Skalierung" Teil.


3
2018-04-14 09:58