Zestaw repliki Mongo DB utknął w stanie ODZYSKIWANIA

14

Stworzyliśmy zestaw replik, a teraz problem polega na tym, że 2 członków zestawu replik [zestaw 3 członków] jest w trybie odzyskiwania od 48 godzin. Początkowo rozmiar odzyskiwania węzłów wzrastał, a teraz nawet to się zatrzymało. Odzyskiwanie węzłów utknęło więc po 90 GB danych przy ponad 60 GB danych lokalnych.

Jak wyjść z tego trybu?

Avinash Sahu
źródło

Odpowiedzi:

13

Łatwy, choć nieco niepewny sposób

  1. Zatrzymaj pierwszą pomocniczą
  2. Usuń jego zawartość dbpath
  3. Uruchom ponownie serwer pomocniczy
  4. Poczekaj, aż dogoni podstawowy
  5. Powtórz proces z drugim dodatkowym

Jest to trochę niepewne, ponieważ nie wiadomo, dlaczego pomocnicze urządzenia weszły w stan odzyskiwania.

Bardziej bezpieczny, ale i bardziej nachalny sposób

Jak wyżej, ale zatrzymaj aplikację podczas procesu. Zapobiega to możliwości wstawienia przez aplikację większej ilości danych niż są w stanie się replikować. Problem może jednak wystąpić podczas produkcji.

Najbezpieczniejszy, ale także najbardziej inwazyjny sposób

  1. Zamknij cały zestaw replik
  2. Usuń zawartość dbpathna obu wtórnych
  3. Skopiuj zawartość dbpathdo obu pomocniczych ”dbpath
  4. Uruchom starą podstawową.
  5. Uruchom jeden ze starych pomocników.
  6. Poczekaj, aż zostanie wybrany nowy podstawowy.
  7. Rozpocznij pozostałe dodatkowe.

Niektóre uwagi:

Użyj MMS . Jest bezpłatny, łatwy w konfiguracji i daje dobre informacje na temat zestawu replik. Staraj się, aby wartość „opóźnienia replikacji” wynosiła około 0, i weź wszelkie niezbędne środki, aby opóźnienie replikacji nigdy nie było większe niż „okno oplogowania replikacji”.

Zawsze upewnij się, że masz sieć 1 Gb i (przepraszam) gówno pamięci RAM. Im więcej tym lepiej. Dodatkowa zasada: raczej połowa pamięci RAM i dysków SSD niż podwójna pamięć RAM i brak dysków SSD (przy zachowaniu rozsądnych limitów pamięci RAM).

Oświadczenie: Zawsze wykonuj kopię zapasową danych produkcyjnych, zanim zaczniesz nimi manipulować.

Markus W Mahlberg
źródło
1
Na razie nie mamy drugiego węzła w zestawie replik. Jeden jest w trybie PODSTAWOWYM, a pozostałe dwa są w trybie ODZYSKIWANIA.
Avinash Sahu
1
Logiczne pomocnicze zatem. Proces jest taki sam.
Markus W Mahlberg
Wielokrotnie próbowałem uruchomić instancję Mongo i ponownie zsynchronizować, za każdym razem, gdy zaczyna kopiować dane do innego węzła, aż do ustalonego rozmiaru (~ 96 gb), a następnie blokuje się. Czy rozmiar oplog ma coś z tym wspólnego?
Avinash Sahu
1
Nie bardzo, z wyjątkiem faktu, że resynchronizacja może się zatrzymać, gdy wstawisz więcej danych, niż oplog może pomieścić podczas pierwszej synchronizacji. W takim przypadku wybierz opcję 2 lub 3.
Markus W Mahlberg,
1
Czy możesz wyjaśnić to nieco dalej? „raczej połowa pamięci RAM i dysków SSD niż podwójna pamięć RAM i brak dysków SSD (przy zachowaniu rozsądnych limitów pamięci RAM)”.
Stephen Nguyen
1

Proces replikacji kończy się niepowodzeniem, nawet jeśli zaczniesz rysować od nowej ścieżki dbp na dodatkowej, więc chodzi o wprowadzenie pewnych zmian w oplogu . Rozmiar oplogu musi być ustawiony na optymalną wartość, aby mógł obsługiwać wszystkie zapisy aplikacji.

Zwiększanie rozmiaru oplogu:

Zamknij główny serwer

use admin

db.shutdownServer()

Zacznij od podstaw jako samodzielny i uruchom na innym porcie, powiedz 37017

Zaloguj się do Mongo w porcie 37017

mongo --port 37017

Usuń starą zawartość z lokalnej bazy danych

Dla bezpieczeństwa miej zapasowe stare oplogowanie przed upuszczeniem

mongodump --db local --collection 'oplog.rs' --port 37017

Upuść starą zawartość w lokalnej bazie danych

use local

db.oplog.rs.drop()

db.me.drop()

db.replset.election.drop()

db.replset.minvalid.drop()

db.startup_log.drop()

Nie można usunąć kolekcji zastępczej, więc usuń ją z wymaganym identyfikatorem:

db.system.replset.remove({ "_id" : "your_replsetname"})

Utwórz nowy oplog o wymaganym rozmiarze, powiedzmy 50 GB

db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )

Możesz także określić rozmiar oplogu w MB w pliku mongod.conf, powiedzmy, że dla 50 GB to 429496 MB

replication:
   oplogSizeMB: 429496

Mam nadzieję że to pomoże !!!

Edytować:

Jak wspomniał Nicholas Tolley Cottrell w komentarzach. W wersji 3.6 MongoDB możemy zmienić rozmiar oplogu w czasie wykonywania bez restartu.

Sprawdź aktualny rozmiar oplogu

use local
db.oplog.rs.stats().maxSize

Aby zmienić rozmiar oplogu na 10 GB

db.adminCommand({replSetResizeOplog: 1, size: 10000})
NOCNIK
źródło
1
Powyższe jest nieaktualne od 3.6. Możesz teraz zmienić rozmiar oplogu bez upuszczania zawartości, a nawet restartowania węzłów: docs.mongodb.com/manual/tutorial/change-oplog-size
Nicholas Tolley Cottrell
1
@NicholasTolleyCottrell tak, zredagowałem odpowiedź.
JERRY