Datenbank-Sharding vs. Partitionierung


166

Ich habe kürzlich über skalierbare Architekturen gelesen. In diesem Zusammenhang sind zwei Wörter, die in Bezug auf Datenbanken immer wieder auftauchen, Sharding und Partitionierung . Ich habe nach Beschreibungen gesucht, war aber immer noch verwirrt.

Könnten mir die Experten von stackoverflow helfen, die Grundlagen richtig zu machen?

  • Was ist der Unterschied zwischen Sharding und Partitionierung ?
  • Stimmt es, dass "alle Sharded-Datenbanken im Wesentlichen partitioniert sind (über verschiedene Knoten), aber alle partitionierten Datenbanken nicht unbedingt Sharded sind" ?

Antworten:


130

Partitionierung ist eher ein Oberbegriff für die Aufteilung von Daten auf Tabellen oder Datenbanken. Sharding ist eine bestimmte Art der Partitionierung, die Teil der sogenannten horizontalen Partitionierung ist.

Hier replizieren Sie das Schema über (normalerweise) mehrere Instanzen oder Server, wobei Sie eine Art Logik oder Kennung verwenden, um zu wissen, welche Instanz oder welcher Server nach den Daten suchen soll. Eine Kennung dieser Art wird oft als "Shard Key" bezeichnet.

Eine übliche Logik ohne Schlüssel besteht darin, das Alphabet zum Teilen der Daten zu verwenden. AD ist Instanz 1, EG ist Instanz 2 usw. Kundendaten sind dafür gut geeignet, werden jedoch in der Größe zwischen Instanzen etwas falsch dargestellt, wenn bei der Partitionierung nicht berücksichtigt wird, dass einige Buchstaben häufiger als andere sind.

Eine andere übliche Technik besteht darin, ein Schlüsselsynchronisationssystem oder eine Logik zu verwenden, die eindeutige Schlüssel über die Instanzen hinweg sicherstellt.

Ein bekanntes Beispiel, das Sie studieren können, ist, wie Instagram die Partitionierung in den frühen Tagen gelöst hat (siehe Link unten). Sie wurden zunächst auf sehr wenigen Servern partitioniert und verwendeten Postgres, um die Daten von Anfang an zu teilen. Ich glaube, es waren mehrere tausend logische Scherben auf diesen wenigen physischen Scherben. Lesen Sie hier ihren großartigen Artikel aus dem Jahr 2012: Instagram Engineering - Sharding & IDs

Siehe auch hier: http://www.quora.com/Whats-the-difference-between-sharding-and-partition


16
Sharding ist eine Art von HP . Es ist nicht HP.
NoChance

1
Habe ich Recht, wenn ich denke, dass horizontale Partitionierung nur bedeutet, Zeilen aus einer Tabelle in mehrere Untertabellen aufzuteilen (möglicherweise innerhalb desselben Schemas oder derselben Datenbankinstanz). Während Sharding horizontal partitioniert werden soll, werden die Untertabellen in separate Schemas innerhalb einer einzelnen Datenbank eingefügt oder in separate Datenbankinstanzen auf separaten Computern. Oder nicht?
Jonathan Hartley

48

Sieht so aus, als würde dies Ihre beiden Fragen beantworten:

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 Tabelle eine bestimmte Zeile gefunden wird, ohne zuerst den Index durchsuchen zu müssen, z. B. den 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.

Quelle: Wiki-Shard .

Sharding ist der Prozess des Speicherns von Datensätzen auf mehreren Computern und der Ansatz von MongoDB, die Anforderungen des Datenwachstums zu erfüllen. Mit zunehmender Datengröße reicht eine einzelne Maschine möglicherweise nicht aus, um die Daten zu speichern oder einen akzeptablen Lese- und Schreibdurchsatz bereitzustellen. Sharding löst das Problem mit der horizontalen Skalierung. Mit Sharding fügen Sie weitere Maschinen hinzu, um das Datenwachstum und die Anforderungen von Lese- und Schreibvorgängen zu unterstützen.

Quelle: MongoDB .


41

Ich habe mich auch damit befasst und obwohl ich bei weitem die Referenz in dieser Angelegenheit bin, gibt es einige wichtige Fakten, die ich gesammelt habe, und Punkte, die ich gerne teilen möchte:

Eine Partition ist eine Aufteilung einer logischen Datenbank oder ihrer Bestandteile in verschiedene unabhängige Teile. Datenbank Partitionierung wird in der Regel für die Verwaltbarkeit, Leistung oder Verfügbarkeit Gründen erfolgt, wie für den Lastausgleich.

https://en.wikipedia.org/wiki/Partition_(database)

Sharding ist eine Art der Partitionierung, z. B. Horizontal Partitioning (HP).

Es gibt auch eine vertikale Partitionierung (VP), bei der Sie eine Tabelle in kleinere Teile aufteilen. Bei der Normalisierung werden auch Spalten auf Tabellen aufgeteilt, aber die vertikale Partitionierung geht darüber hinaus und partitioniert Spalten, selbst wenn sie bereits normalisiert sind.

https://en.wikipedia.org/wiki/Shard_(database_architecture)

Ich mag Tony Bacos Antwort auf Quora sehr, wo er Sie dazu bringt, in Schemata zu denken (anstatt in Spalten und Zeilen). Er behauptet, dass...

" Horizontale Partitionierung " oder Sharding repliziert [kopiert] das Schema und teilt die Daten dann basierend auf einem Shard-Schlüssel.

Bei der " vertikalen Partitionierung " wird das Schema aufgeteilt (und die Daten werden für die Fahrt mitgeführt).

https://www.quora.com/Was-der-Differenz- zwischen-sharding-DB-tables-and-partitioning-them

Das Oracle Database Partitioning Guide enthält einige nette Zahlen. Ich habe einige Auszüge aus dem Artikel kopiert.

https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm

Wann muss eine Tabelle partitioniert werden?

Hier einige Vorschläge, wann eine Tabelle partitioniert werden soll:

  • Tabellen mit mehr als 2 GB sollten immer als Kandidaten für die Partitionierung betrachtet werden.
  • Tabellen mit historischen Daten, in denen der neuesten Partition neue Daten hinzugefügt werden. Ein typisches Beispiel ist eine historische Tabelle, in der nur die Daten des aktuellen Monats aktualisiert werden können und die anderen 11 Monate schreibgeschützt sind.
  • Wenn der Inhalt einer Tabelle auf verschiedene Arten von Speichergeräten verteilt werden muss.

Partitionsschnitt

Das Bereinigen von Partitionen ist das einfachste und auch wesentlichste Mittel, um die Leistung mithilfe der Partitionierung zu verbessern. Das Bereinigen von Partitionen kann die Abfrageleistung häufig um mehrere Größenordnungen verbessern. Angenommen, eine Anwendung enthält eine Auftragstabelle, die einen historischen Auftragsdatensatz enthält, und diese Tabelle wurde nach Wochen aufgeteilt. Eine Abfrage, bei der Bestellungen für eine einzelne Woche angefordert werden, greift nur auf eine einzelne Partition der Tabelle "Bestellungen" zu. Wenn die Tabelle "Bestellungen" historische Daten für 2 Jahre enthält, greift diese Abfrage auf eine Partition anstatt auf 104 Partitionen zu. Diese Abfrage kann möglicherweise 100-mal schneller ausgeführt werden, allein aufgrund des Bereinigens von Partitionen.

Partitionierungsstrategien

  • Angebot
  • Hash
  • Aufführen

Sie können ihren Text lesen und ihre Bilder visualisieren, die alles ziemlich gut erklären.

Und schließlich ist es wichtig zu verstehen, dass Datenbanken äußerst ressourcenintensiv sind:

  • Zentralprozessor
  • Scheibe
  • I / O.
  • Erinnerung

Viele Datenbankadministratoren partitionieren auf demselben Computer, auf dem die Partitionen alle Ressourcen gemeinsam nutzen, aber durch Aufteilen der Daten und / oder des Index eine Verbesserung der Festplatte und der E / A bewirken.

Während andere Strategien eine "Shared Nothing" -Architektur verwenden, befinden sich die Shards auf separaten und unterschiedlichen Recheneinheiten (Knoten), die 100% der CPU, der Festplatte, der E / A und des Speichers für sich haben. Bereitstellung eigener Vorteile und Komplexitäten.

https://en.wikipedia.org/wiki/Shared_nothing_architecture


"" Horizontale Partitionierung "oder Sharding repliziert [kopiert] das Schema und teilt die Daten dann basierend auf einem Shard-Schlüssel." - Das ist tautologisch.
8bitjunkie

Es gibt also einen Spiegel, und er ist fragmentiert, daher die Etymologie.
McKenzm

5

Betrachten Sie eine Tabelle in einer Datenbank mit 1 Million Zeilen und 100 Spalten. Bei der Partitionierung können Sie die Tabelle in zwei oder mehr Tabellen mit folgenden Eigenschaften unterteilen:

  1. 0,4 Millionen Zeilen (Tabelle 1), 0,6 Millionen Zeilen (Tabelle 2)

  2. 1 Million Zeilen und 60 Spalten (Tabelle 1) und 1 Million Zeilen und 40 Spalten (Tabelle 2)

    Es könnte mehrere solche Fälle geben

Dies ist eine allgemeine Partitionierung

Aber Sharding nur bis 1. Fall beziehen , bei denen wir die Daten auf der Basis von Zeilen unterteilt wird . Wenn wir die Tabelle in mehrere Tabellen aufteilen, müssen wir mehrere ähnliche Kopien von Schemas verwalten, da wir jetzt mehrere Tabellen haben.


1

Sharding in einem speziellen Fall der horizontalen Partitionierung , wenn sich Partitionen über mehrere Datenbankinstanzen erstrecken. Wenn eine Datenbank sharded ist, bedeutet dies, dass sie per Definition partitioniert ist.


1

Wenn Sie über Partitionierung sprechen, verwenden Sie bitte nicht den Begriff Replikation oder Replikation. Die Replikation ist ein anderes Konzept und fällt nicht in den Geltungsbereich dieser Seite. Wenn wir über Partitionierung sprechen, dann ist besseres Wort Teilen und wenn wir über Scherben sprechen, dann ist besseres Wort Verteilen. In der Partition (normalerweise und nach allgemeinem Verständnis nicht immer) werden die Zeilen der Tabelle mit großen Datenmengen in zwei oder mehr disjunkte Gruppen (die keine Zeilen gemeinsam nutzen) unterteilt. Sie können jede Gruppe als Partition bezeichnen. Diese Gruppen oder alle Partitionen bleiben unter der Kontrolle einer einmaligen RDMB-Instanz, und dies ist alles logisch. Die Basis jeder Gruppe kann ein Hash oder ein Bereich usw. sein. Wenn Sie zehn Jahre Daten in einer Tabelle haben, können Sie alle Jahresdaten in einer separaten Partition speichern. Dies kann erreicht werden, indem Partitionsgrenzen auf der Grundlage von a festgelegt werden Nicht-Null-Spalte CREATE_DATE. Wenn Sie die Datenbank abfragen und ein Erstellungsdatum zwischen dem 01.01.1999 und dem 31.12.2000 angeben, werden nur zwei Partitionen getroffen und es wird sequentiell. Ich habe auf DB über Milliarden Datensätze ähnlich gemacht und die SQL-Zeit betrug 50 Millis von 30 Sekunden unter Verwendung von Indizes usw. alle. Sharding bedeutet, dass Sie jede Partition auf einem anderen Knoten / Computer hosten. Jetzt kann die Suche innerhalb der Partitionen / Shards parallel erfolgen.


0

Die horizontale Partition wird beim Verschieben in eine andere Datenbankinstanz * zu einem Datenbank-Shard .

Die Datenbankinstanz kann sich auf demselben Computer oder auf einem anderen Computer befinden.

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.