Was ist Scherben und warum ist es wichtig?


196

Ich glaube, ich verstehe unter Sharding, dass Sie Ihre in Scheiben geschnittenen Daten (die Shards) wieder in ein einfach zu handhabendes Aggregat umwandeln, das im Kontext sinnvoll ist. Ist das richtig?

Update : Ich denke , ich bin hier zu kämpfen. Meiner Meinung nach sollte die Anwendungsebene kein Geschäft damit haben, zu bestimmen, wo Daten gespeichert werden sollen. Bestenfalls sollte es sich um einen Shard-Client handeln. Beide Antworten beantworteten das Was, aber nicht das Warum ist es wichtig. Welche Auswirkungen hat es außerhalb der offensichtlichen Leistungssteigerungen? Reichen diese Gewinne aus, um die MVC-Verletzung auszugleichen? Ist Sharding vor allem bei sehr großen Anwendungen wichtig oder gilt es für kleinere Anwendungen?


Antworten:


193

Sharding ist nur ein anderer Name für "horizontale Partitionierung" einer Datenbank. Vielleicht möchten Sie nach diesem Begriff suchen, um ihn klarer zu gestalten.

Aus Wikipedia :

Die horizontale Partitionierung ist ein Entwurfsprinzip, bei dem Zeilen einer Datenbanktabelle getrennt gehalten werden und nicht wie bei der Normalisierung durch Spalten aufgeteilt werden. Jede Partition ist Teil eines Shards, der sich wiederum auf einem separaten Datenbankserver oder an einem physischen Standort befinden kann. Der Vorteil ist, dass die Anzahl der Zeilen in jeder Tabelle reduziert wird (dies reduziert die Indexgröße und verbessert somit die Suchleistung). Wenn das Sharding auf einem realen Aspekt der Daten basiert (z. B. europäische Kunden gegenüber amerikanischen Kunden), kann möglicherweise einfach und automatisch auf die entsprechende Shard-Mitgliedschaft geschlossen und nur der relevante Shard abgefragt werden.

Weitere Informationen zum Sharding:

Erstens ist jeder Datenbankserver identisch und hat dieselbe Tabellenstruktur. Zweitens werden die Datensätze logisch in einer Sharded-Datenbank aufgeteilt. Im Gegensatz zur partitionierten Datenbank ist jeder vollständige Datensatz nur in einem Shard vorhanden (es sei denn, es gibt eine Spiegelung für Sicherung / Redundanz), wobei alle CRUD-Operationen nur in dieser Datenbank ausgeführt werden. Möglicherweise gefällt Ihnen die verwendete Terminologie nicht, dies stellt jedoch eine andere Art der Organisation einer logischen Datenbank in kleinere Teile dar.

Update: Sie werden MVC nicht brechen. Die Ermittlung des richtigen Shards, in dem die Daten gespeichert werden sollen, wird von Ihrer Datenzugriffsschicht transparent erledigt. Dort müssten Sie den richtigen Shard anhand der Kriterien ermitteln, anhand derer Sie Ihre Datenbank sharden. (Da Sie die Datenbank basierend auf einigen konkreten Aspekten Ihrer Anwendung manuell in verschiedene Shards zerlegen müssen.) Dann müssen Sie beim Laden und Speichern der Daten aus / in die Datenbank vorsichtig sein, um den richtigen Shard zu verwenden.

Vielleicht macht dieses Beispiel mit Java-Code etwas klarer (es geht um das Hibernate Shards- Projekt), wie dies in einem realen Szenario funktionieren würde.

Um das " why sharding" anzusprechen : Es ist hauptsächlich für sehr große Anwendungen mit vielen Daten gedacht . Erstens hilft es, die Antwortzeiten für Datenbankabfragen zu minimieren. Zweitens können Sie billigere "Low-End" -Maschinen zum Hosten Ihrer Daten anstelle eines großen Servers verwenden, was möglicherweise nicht mehr ausreicht.


1
Verzeihen Sie mir, aber sollte die Datenbank nicht bestimmen, wo Daten gespeichert werden sollen. Betrifft dies Code auf der Anwendungsebene?
Ojblass

6
Ich habe lange versucht zu verstehen, wie es sich von der horizontalen Partitionierung unterscheidet, und der Link in Ihrer Antwort beweist, dass es keinen Unterschied gibt. Wie jemand in Kommentaren zu Theo Schlossnagles Beitrag sagt: "... Wenn Sie aus einer traditionellen Datenbankkultur stammen und horizontale Partitionierung durchführen, wenn Sie aus einer Webkultur stammen, ist dies 'Sharding' ..."
andreister

@andreister Nach dem, was ich lese, unterscheidet sich Sharding konzeptionell darin, dass es durch horizontale Skalierung über mehrere logische oder physische Knoten definiert wird (nach meinem Verständnis (mySQL) mehrere Datenbanken, die höchstwahrscheinlich auf unterschiedlicher logischer Hardware untergebracht sind). Horizontale Partitionierung ist ein weniger spezifischer Begriff, von dem "Sharding" eine Teilmenge ist. Wiederum am Beispiel von mySQL wird eine mySQL-Partition von einer einzelnen Datenbankinstanz verwaltet, die für die Anwendung zu 100% transparent ist. Ein Sharding-Ansatz würde entweder einen Proxy oder eine Anwendung beinhalten, die intelligent ausgewählt hat, welche Instanz.
NateDSaint

Laut Wikipedia "Jede einzelne Partition wird als Shard oder Datenbank-Shard bezeichnet." Dies unterscheidet sich ein wenig von dem Text in der Antwort "Jede Partition ist Teil eines Shards".
Kevin Wheeler

Der Wiki-Artikel, auf den Sie verwiesen haben, unterscheidet geringfügig zwischen diesen beiden Begriffen. Bei der horizontalen Partitionierung werden eine oder mehrere Tabellen zeilenweise aufgeteilt, normalerweise innerhalb einer einzelnen Instanz eines Schemas und eines Datenbankservers. / *** / Sharding geht darüber hinaus: Es partitioniert die problematischen Tabellen auf die gleiche Weise, tut dies jedoch über möglicherweise mehrere Instanzen des Schemas hinweg. en.wikipedia.org/wiki/…
Peeter Kokk

38

Wenn Sie Fragen an ein DBMS haben, für das die Lokalität stark eingeschränkt ist (z. B. wenn ein Benutzer nur Auswahlen mit einem 'where username = $ my_username' auslöst), ist es sinnvoll, alle Benutzernamen, die mit AM beginnen, auf einem Server und alle in Neuseeland zu platzieren auf dem anderen. Auf diese Weise erhalten Sie für einige Abfragen eine nahezu lineare Skalierung.

Lange Rede, kurzer Sinn: Beim Sharding werden Tabellen im Grunde genommen auf verschiedene Server verteilt, um die Last gleichmäßig auf beide zu verteilen.

Natürlich ist es in der Realität viel komplizierter. :) :)


Sharding wirkt sich also auf das Design der Daten aus, die Sie speichern ... Entschuldigung, wenn ich das nicht ganz verstehe.
Ojblass

Ist das nicht eine horizontale Partitionierung?
Harunurhan

18

Sharding ist eine horizontale ( zeilenweise ) Datenbankpartitionierung im Gegensatz zu einer vertikalen ( spaltenweisen ) Partitionierung, bei der es sich um Normalisierung handelt . Es trennt sehr große Datenbanken in kleinere, schnellere und einfacher zu verwaltende Teile, sogenannte Data Shards. Es ist ein Mechanismus, um verteilte Systeme zu erreichen.

Warum brauchen wir verteilte Systeme?

  • Erhöhte Verfügbarkeit.
  • Einfachere Erweiterung.
  • Wirtschaftlichkeit: Die Erstellung eines Netzwerks kleinerer Computer mit der Leistung eines einzelnen großen Computers kostet weniger.

Weitere Informationen finden Sie hier: Vorteile der verteilten Datenbank

Wie hilft Sharding dabei, ein verteiltes System zu erreichen?

Sie können einen Suchindex in N Partitionen partitionieren und jeden Index auf einen separaten Server laden. Wenn Sie einen Server abfragen, erhalten Sie 1/9 der Ergebnisse. Um eine vollständige Ergebnismenge zu erhalten, verwendet ein typisches verteiltes Suchsystem einen Aggregator , der die Ergebnisse von jedem Server sammelt und kombiniert. Ein Aggregator verteilt auch Abfragen auf jeden Server. Dieses Aggregatorprogramm heißt in der Big-Data-Terminologie MapReduce . Mit anderen Worten, Distributed Systems = Sharding + MapReduce (obwohl es auch andere Dinge gibt).

Eine visuelle Darstellung unten. Verteiltes System


7

Ist Sharding vor allem bei sehr großen Anwendungen wichtig oder gilt es für kleinere Anwendungen?

Sharding ist genau dann ein Problem, wenn Ihre Anforderungen über das hinausgehen, was von einem einzelnen Datenbankserver bereitgestellt werden kann. Es ist ein Swell-Tool, wenn Sie über Shardable-Daten verfügen und unglaublich hohe Anforderungen an Skalierbarkeit und Leistung haben. Ich würde vermuten, dass ich in meinen gesamten 12 Jahren als Softwareprofi auf eine Situation gestoßen bin, die vom Sharding hätte profitieren können. Es ist eine fortschrittliche Technik mit sehr begrenzter Anwendbarkeit.

Außerdem wird die Zukunft wahrscheinlich etwas lustiges und aufregendes sein, wie eine massive Objekt- "Wolke", die alle potenziellen Leistungsbeschränkungen beseitigt, oder? :) :)


Können Sie die Situation teilen, in der Sie Scherben brauchen
Gagan Burde

4

Sharding wurde ursprünglich von Google-Ingenieuren geprägt, und Sie können sehen, dass es beim Schreiben von Anwendungen in Google App Engine ziemlich häufig verwendet wird. Da die Menge der Ressourcen, die Ihre Abfragen verwenden können, stark eingeschränkt ist und die Abfragen selbst strengen Einschränkungen unterliegen, wird das Sharding von der Architektur nicht nur gefördert, sondern fast erzwungen.

Ein weiterer Ort, an dem Sharding verwendet werden kann, besteht darin, Konflikte mit Datenentitäten zu reduzieren. Beim Erstellen skalierbarer Systeme ist es besonders wichtig, auf die Daten zu achten, die häufig geschrieben werden, da sie immer den Engpass darstellen. Eine gute Lösung besteht darin, diese bestimmte Entität abzusplittern, in mehrere Kopien zu schreiben und dann die Gesamtsumme zu lesen. Ein Beispiel für diesen "Sharded Counter Wrt GAE: http://code.google.com/appengine/articles/sharding_counters.html


7
<< Sharding wurde ursprünglich von Google-Ingenieuren geprägt >> - nicht wahr. Google wurde 1998 gegründet. Scholar.google.com findet Artikel aus den 1980er Jahren wie "Verwerfen veralteter Informationen in einem replizierten Datenbanksystem" ... Das bei CCA entwickelte System für hochverfügbare replizierte Daten (SHARD) ... Ich erinnere mich, Menschen gehört zu haben Ich spreche damals von Scherben.
Krazy Glew

3

Sharding ist mehr als nur eine horizontale Partitionierung. Nach dem Wikipedia - Artikel ,

Bei der horizontalen Partitionierung werden eine oder mehrere Tabellen zeilenweise aufgeteilt, normalerweise innerhalb einer einzelnen Instanz eines Schemas und eines Datenbankservers. Dies kann einen Vorteil bieten, indem die Indexgröße (und damit der Suchaufwand) verringert wird, vorausgesetzt, es gibt eine offensichtliche, robuste und implizite Möglichkeit, zu identifizieren, in welcher Partition eine bestimmte Zeile gefunden wird, ohne dass zuerst der Index durchsucht werden muss, z. B. der Klassiker Beispiel für die Tabellen 'CustomersEast' und 'CustomersWest', in denen die Postleitzahl bereits angibt, wo sie gefunden werden.

Sharding geht darüber hinaus: Es partitioniert die problematischen Tabellen auf die gleiche Weise, tut dies jedoch über potenziell mehrere Instanzen des Schemas hinweg. Der offensichtliche Vorteil wäre, dass die Suchlast für die große partitionierte Tabelle jetzt auf mehrere Server (logisch oder physisch) aufgeteilt werden kann, nicht nur auf mehrere Indizes auf demselben logischen Server.

Ebenfalls,

Das Aufteilen von Shards auf mehrere isolierte Instanzen erfordert mehr als eine einfache horizontale Partitionierung. Die erhofften Effizienzgewinne würden verloren gehen, wenn beim Abfragen der Datenbank beide Instanzen abgefragt werden müssten, nur um eine einfache Dimensionstabelle abzurufen. Über die Partitionierung hinaus teilt das Sharding somit große partitionierbare Tabellen auf die Server auf, während kleinere Tabellen als vollständige Einheiten repliziert werden


1

Meiner Meinung nach sollte die Anwendungsebene kein Geschäft damit haben, zu bestimmen, wo Daten gespeichert werden sollen

Dies ist eine gute Regel, aber wie die meisten Dinge nicht immer richtig.

Wenn Sie Ihre Architektur erstellen, beginnen Sie mit Verantwortlichkeiten und Kooperationen. Sobald Sie Ihre funktionale Architektur festgelegt haben, müssen Sie die nicht funktionalen Kräfte ausgleichen.

Wenn eine dieser nicht funktionalen Kräfte die massive Skalierbarkeit ist, müssen Sie Ihre Architektur anpassen, um dieser Kraft Rechnung zu tragen, auch wenn dies bedeutet, dass Ihre Datenspeicherabstraktion jetzt in Ihre Anwendungsebene gelangt.


1
Die Anwendungsebene kann weiterhin eine Trennung von Datenzugriffslogik und Geschäftsregeln herstellen. Dies bedeutet nur, dass Sie zusätzliche konzeptionelle Ebenen innerhalb der Ebene "Anwendungsebene" haben.
Eric
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.