Różnica między dzieleniem na fragmenty i replikacją w MongoDB

77

Po prostu mylę się co do dzielenia i replikacji na to, jak działają. Zgodnie z definicją

Replikacja: Zestaw replik w MongoDB to grupa procesów mongod, które utrzymują ten sam zestaw danych.

Sharding: Sharding to metoda przechowywania danych na wielu komputerach.

Według mojego zrozumienia, jeśli są dane 75 GB, to przez replikację (3 serwery), będzie przechowywać 75 GB danych na każdym serwerze oznacza 75 GB na serwerze-1, 75 GB na serwerze-2 i 75 GB na serwerze-3 .. (popraw mnie jeśli się mylę) .. i dzielenie na fragmenty będzie przechowywane jako dane 25 GB na serwerze 1, dane 25 GB na serwerze 2 i dane 25 GB na serwerze 3. (prawda?) ... ale wtedy napotkałem tę linię w samouczek

Odłamki przechowują dane. Aby zapewnić wysoką dostępność i spójność danych, w klastrze z odłamkami produkcyjnymi każdy odłamek jest zestawem replik

Ponieważ zestaw replik ma 75 GB, ale fragment nie ma 25 GB, to jak mogą być równoważne ... to mnie bardzo myli ... Myślę, że brakuje mi czegoś wspaniałego. Proszę, pomóż mi w tym.

Saad Saadi
źródło

Odpowiedzi:

111

Zestaw replik oznacza, że ​​masz wiele wystąpień MongoDB, z których każde odzwierciedla wszystkie dane. Zestaw replik składa się z jednego Mistrza (zwanego również „Pierwotnym”) i jednego lub więcej Niewolników (zwanych również Drugorzędnymi). Operacje odczytu mogą być obsługiwane przez dowolny element podrzędny, dzięki czemu można zwiększyć wydajność odczytu, dodając więcej elementów podrzędnych do zestawu replik (pod warunkiem, że aplikacja kliencka może faktycznie używać różnych elementów zestawu). Ale operacje zapisu zawsze odbywają się na systemie głównym zestawu replik, a następnie są propagowane do urządzeń podrzędnych, więc zapisy nie będą przyspieszane, gdy dodasz więcej urządzeń podrzędnych.

Zestawy replik oferują również odporność na uszkodzenia. Kiedy jeden z członków zestawu replik upada, inni przejmują kontrolę. Kiedy mistrz upadnie, niewolnicy wybiorą nowego mistrza. Z tego powodu jest to sugerowane do wdrożenia produkcyjnego, aby zawsze używać MongoDB jako replik zestawu co najmniej trzech serwerów, dwie z nich o objętości danych (trzecia to dane mniej „arbiter”, który jest wymagany do określenia nowego kapitanowi statku w chwili jeden z niewolników upada).

Sharded klastra oznacza, że każdy fragment klastra (która może być również zestawu replik) zajmuje część danych. Każde żądanie, zarówno do odczytu, jak i do zapisu, jest obsługiwane przez klaster, w którym znajdują się dane. Oznacza to, że wydajność odczytu i zapisu można zwiększyć, dodając więcej odłamków do klastra. Który dokument rezyduje, na którym odłamku decyduje klucz odłamka każdej kolekcji. Powinien zostać wybrany w taki sposób, aby dane mogły być równomiernie rozmieszczone we wszystkich klastrach i aby było jasne dla najczęstszych zapytań, w których znajduje się klucz niezależnego fragmentu (na przykład: gdy często user_namepytasz, klucz niezależnego fragmentu powinien zawierać pole, user_nameaby każde zapytanie mogło być delegowane tylko do jednego fragmentu, który ma ten dokument).

Wadą jest to, że cierpi na to tolerancja na uszkodzenia. Gdy jeden fragment klastra ulegnie awarii, wszelkie dane w nim zawarte są niedostępne. Z tego powodu każdy członek klastra powinien być również zestawem replik. Nie jest to wymagane. Jeśli nie zależy ci na wysokiej dostępności, fragment może być pojedynczą instancją mongod bez replikacji . Ale do użytku produkcyjnego należy zawsze używać replikacji .

Co to oznacza dla twojego przykładu?

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

Jeśli chcesz podzielić swoje dane o pojemności 75 GB na 3 odłamki po 25 GB każdy, potrzebujesz co najmniej 6 serwerów baz danych zorganizowanych w trzy zestawy replik. Każdy zestaw replik składa się z dwóch serwerów, które mają takie same 25 GB danych.

Potrzebujesz także serwerów dla arbitrów trzech zestawów replik, a także routera mongo i serwera konfiguracji dla klastra. Arbitrzy są bardzo lekcy i są potrzebni tylko wtedy, gdy członek zestawu repliki ulegnie awarii, więc zwykle mogą dzielić ten sam sprzęt z czymś innym. Ale router i serwer konfiguracji Mongos powinny być redundantne i na własnych serwerach.

Philipp
źródło
2
Bardzo dziękuję za szczegółową odpowiedź ... jeszcze jedno pytanie ... jeśli podstawowy jest wyłączony podczas operacji zapisu lub odczytu, to ... 1) jakie jest opóźnienie w wyborze pierwotnego z pomocniczych i 2) w którym czasie dane będą tymczasowo przechowywane?
Saad Saadi
4
@SaadSaadi Podstawowy proces wyborczy opisano w dokumentacji . Zauważenie, że element główny jest wyłączony, zajmuje od 10 do 12 sekund. Same wybory pierwotne zwykle zajmują tylko milisekundy. Zestaw replik jest tylko do odczytu, gdy nie ma podstawowego. Wszelkie próby zapisu danych przez aplikacje w tym czasie zakończą się niepowodzeniem.
Philipp
1
@Philipp: Tylko dwa komentarze: (1) klucz niezależnego fragmentu nie może być modyfikowany (tzn. Nie można fragmentować przy użyciu innego klucza) i (2) można czytać z drugorzędnych węzłów zestawu replik, ale spójność zależy od problemu zapisu (w aby zachować spójność, opcja w powinna być równa sth zestawu replik, co nie jest wykonalne, ponieważ każdy fragment może mieć celowo różne rozmiary zestawu replik lub z powodu awarii węzła).
Mike Argyriou,
@Filipp, czy możesz odpowiedzieć na dalsze pytania na stronie dba.stackexchange.com/questions/208482/... ?
user3198603
18
  • Sharding dzieli zestaw danych na dyskretne części.
  • Replikacja powiela zestaw danych.

Te dwie rzeczy mogą się nakładać, ponieważ są różne. Używanie obu oznacza dzielenie zestawu danych na wiele grup replik. Innymi słowy, replikujesz odłamki; zbiór danych bez odłamków to pojedynczy „odłamek”.

Klaster Mongo z trzema odłamkami i 3 replikami miałby 9 węzłów.

  • 3 zestawy replik 3-węzłowych.
  • Każdy zestaw replik zawiera jeden odłamek.
sysadmin1138
źródło
W przypadku jednego dużego pliku jest on przechowywany w jednym odłamku lub w wielu odłamkach (a więc w węzłach)?
Tony
Zauważ, że w MongoDB 3.4 lub nowszym będziesz potrzebował także serwerów mongoDB do konfiguracji oraz dodatkowego serwera, który będzie działał jako router mongo. Daje to w sumie klaster 3x3 w twoim przykładzie do 13 serwerów łącznie.
dthrasher
9

Przez sharding , podzielić swoją kolekcję na kilka części.
Replikacja bazy danych oznacza, że ​​tworzysz kopię lustrzaną zestawu danych.

tańsze
źródło
4

Pod względem dostarczonej funkcjonalności. Sharding zapewnia skalowalność i równoległość. Replikacja zapewnia dostępność

Ashish Kumar
źródło
nie, replikacja zapewnia również skalowalność i równoległość, biorąc pod uwagę, że odczyty są znacznie częstsze niż zapisy
Kristóf Szalay