Unterschied zwischen Sharding und Replikation in MongoDB

77

Ich bin nur verwirrt über das Sharding und die Replikation, wie sie funktionieren .. Laut Definition

Replikation: Ein Replikatsatz in MongoDB ist eine Gruppe von Mongod-Prozessen, die denselben Datensatz verwalten.

Sharding: Sharding ist eine Methode zum Speichern von Daten auf mehreren Computern.

Nach meinem Verständnis werden bei einer Datenmenge von 75 GB nach Replikation (3 Server) 75 GB auf jedem Server gespeichert, dh 75 GB auf Server-1, 75 GB auf Server-2 und 75 GB auf Server-3. (Bitte korrigieren Sie mich.) wenn ich mich irre) .. und durch Sharding wird es als 25 GB Daten auf Server-1, 25 GB Daten auf Server-2 und 25 GB Daten auf Server-3 gespeichert. (Richtig?) ... aber dann bin ich auf diese Zeile in gestoßen das Tutorial

Shards speichern die Daten. Um eine hohe Verfügbarkeit und Datenkonsistenz zu gewährleisten, ist in einem Produktions-Shard-Cluster jeder Shard ein Replikatsatz

Da das Replikatset 75 GB hat, aber der Shard 25 GB hat, können sie gleichwertig sein. Das verwirrt mich sehr. Ich denke, ich vermisse etwas Großartiges. Bitte hilf mir dabei.

Saad Saadi
quelle

Antworten:

111

Ein Replica-Set bedeutet, dass Sie mehrere Instanzen von MongoDB haben, die alle Daten voneinander spiegeln. Ein Replikat-Set besteht aus einem Master (auch "Primary" genannt) und einem oder mehreren Slaves (auch "Secondary" genannt). Lesevorgänge können von jedem Slave ausgeführt werden, sodass Sie die Leseleistung steigern können, indem Sie dem Replikatsatz weitere Slaves hinzufügen (vorausgesetzt, Ihre Clientanwendung kann tatsächlich verschiedene Set-Member verwenden). Schreibvorgänge finden jedoch immer auf dem Master des Replikat-Sets statt und werden dann an die Slaves weitergegeben, sodass das Schreiben nicht schneller wird, wenn Sie weitere Slaves hinzufügen.

Replikat-Sets bieten auch Fehlertoleranz. Wenn eines der Mitglieder des Replikat-Sets ausfällt, übernehmen die anderen. Wenn der Master abstürzt, wählen die Slaves einen neuen Master. Aus diesem Grund wird für eine produktive Bereitstellung empfohlen , MongoDB immer als Replikat-Set von mindestens drei Servern zu verwenden, von denen zwei Daten enthalten (der dritte ist ein datenloser "Arbiter", der zur Bestimmung eines neuen Masters erforderlich ist, wenn einer der Sklaven geht unter).

Ein Sharded Cluster bedeutet, dass jeder Shard des Clusters (der auch ein Replikatsatz sein kann) einen Teil der Daten verwaltet. Jede Anforderung, sowohl Lese- als auch Schreibzugriff, wird von dem Cluster bedient, in dem sich die Daten befinden. Dies bedeutet, dass sowohl die Lese- als auch die Schreibleistung gesteigert werden kann, indem einem Cluster mehr Shards hinzugefügt werden. Welches Dokument sich auf welchem ​​Shard befindet, wird durch den Shard-Schlüssel jeder Sammlung bestimmt. Es sollte so gewählt werden, dass die Daten gleichmäßig auf alle Cluster verteilt werden können und für die häufigsten Abfragen, in denen sich der Shard-Key befindet, klar ist (Beispiel: Wenn Sie häufig nach fragen user_name, sollte Ihr Shard-Key den enthalten Feld, user_nameso dass jede Abfrage nur an den einen Shard delegiert werden kann, der dieses Dokument enthält).

Der Nachteil ist, dass die Fehlertoleranz leidet. Wenn ein Shard des Clusters ausfällt, kann auf keine Daten zugegriffen werden. Aus diesem Grund sollte jedes Mitglied des Clusters auch ein Replikatsatz sein. Dies ist nicht erforderlich. Wenn Sie sich nicht für Hochverfügbarkeit interessieren, kann ein Shard auch eine einzelne mongod-Instanz ohne Replikation sein . Aber für produktions verwenden sollten Sie immer die Replikation verwenden .

Was bedeutet das für Ihr Beispiel?

                            Sharded Cluster             
             /                    |                    \
      Shard A                  Shard B                  Shard C
        / \                      / \                      / \
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+
|Primary| |Secondary|    |Primary| |Secondary|    |Primary| |Secondary|
|  25GB |=| 25GB    |    | 25 GB |=| 25 GB   |    | 25GB  |=| 25GB    |   
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+

Wenn Sie Ihre Daten mit 75 GB in 3 Shards mit jeweils 25 GB aufteilen möchten, benötigen Sie mindestens 6 Datenbankserver, die in drei Replikatsätzen organisiert sind. Jeder Replikatsatz besteht aus zwei Servern mit denselben 25 GB Daten.

Sie benötigen außerdem Server für die Arbiter der drei Replikatsätze sowie den Mongos-Router und den Konfigurationsserver für den Cluster. Die Arbiter sind sehr kompakt und werden nur benötigt, wenn ein Mitglied der Replikatgruppe ausfällt. Daher können sie in der Regel dieselbe Hardware mit etwas anderem gemeinsam nutzen. Aber Mongos Router und Config-Server sollten redundant und auf eigenen Servern sein.

Philipp
quelle
2
Vielen Dank für die ausführliche Antwort ... noch eine Frage ... wenn die primäre während eines Schreib- oder Lesevorgangs ausgefallen ist..1) Welche Verzögerung besteht bei der Auswahl der primären aus den sekundären und 2) Wo werden die Daten während dieser Verzögerung zwischengespeichert?
Saad Saadi
4
@SaadSaadi Der primäre Wahlprozess ist in der Dokumentation beschrieben . Es dauert zwischen 10 und 12 Sekunden, bis die Secondaries bemerken, dass die Primary ausgefallen ist. Die Vorwahlen selbst dauern in der Regel nur Millisekunden. Der Replikatsatz ist schreibgeschützt, solange es keinen Primärsatz gibt. Alle Versuche von Anwendungen, Daten in dieser Zeit zu schreiben, schlagen fehl.
Philipp
1
@Philipp: Nur zwei Kommentare: (1) Der Shard-Schlüssel kann nicht geändert werden (dh Sie können keinen anderen Schlüssel verwenden) und (2) Sie können von den sekundären Knoten des Replikatsatzes lesen, die Konsistenz hängt jedoch vom Schreibproblem ab (in Um konsistent zu sein, sollte die Option w gleich dem Replikatsatz sein, der nicht realisierbar ist, da jeder Shard absichtlich oder aufgrund von Knotenfehlern unterschiedliche Replikatsatzgrößen haben kann.
Mike Argyriou
@Philipp können Sie bitte weitere Folgefragen unter dba.stackexchange.com/questions/208482/… beantworten ?
user3198603
18
  • Sharding partitioniert den Datensatz in einzelne Teile.
  • Die Replikation dupliziert den Datensatz.

Diese beiden Dinge können gestapelt werden, da sie unterschiedlich sind. Wenn Sie beides verwenden, werden Sie Ihren Datensatz über mehrere Gruppen von Replikaten hinweg teilen. Anders ausgedrückt: Du replizierst Scherben. Ein Datensatz ohne Scherben ist eine einzelne "Scherbe".

Ein Mongo-Cluster mit drei Scherben und drei Repliken hätte 9 Knoten.

  • 3 Sätze von Replikaten mit 3 Knoten.
  • Jedes Replikat-Set enthält einen einzelnen Splitter.
sysadmin1138
quelle
Wird eine große Datei in einem oder mehreren Shards gespeichert (also über die Knoten hinweg)?
Tony
Beachten Sie, dass Sie in MongoDB 3.4 oder höher auch MongoDB-Server für die Konfiguration und einen zusätzlichen Server als Mongos-Router benötigen. Dies bringt die Gesamtsumme des 3x3-Clusters in Ihrem Beispiel auf insgesamt 13 Server.
Dthrasher
9

Durch sharding spaltete Sie Ihre Sammlung in mehrere Teile.
Wenn Sie Ihre Datenbank replizieren, wird Ihr Datensatz gespiegelt.

haper
quelle
4

In Sachen Funktionalität geliefert. Sharding bietet Skalierbarkeit und Parallelität. Replikation sorgt für Verfügbarkeit

Ashish Kumar
quelle
Nein, Replikation bietet nur Skalierbarkeit und Parallelität, da Lesevorgänge viel häufiger sind als Schreibvorgänge
Kristóf Szalay