Czy to ważna strategia tworzenia kopii zapasowych dla MongoDB?

11

Mam jeden dedykowany serwer z bazą danych MongoDB o wielkości około 10 GB. Muszę robić codzienne kopie zapasowe, ale nie mogę mieć przestojów w bazie danych. Czy można użyć zestawu replik na jednym dysku (z 2 instancjami mongod działającymi na różnych portach) i po prostu przełączyć drugi z nich w tryb offline i wykonać kopię zapasową plików danych w pamięci zewnętrznej, takiej jak S3 (kronikowanie jest włączone)? A może użycie master / slave byłoby lepsze niż zestaw replik?

Czy to jest wykonalne, a jeśli tak, jakie potencjalne problemy mogę mieć? Jeśli nie, to jak mam to pojąć?

James Simpson
źródło

Odpowiedzi:

6

ReplicaSet będzie działać w tym scenariuszu. Nie mogę jednak stwierdzić, czy posiadanie dwóch instancji MongoDB na tym samym serwerze jest dobrym pomysłem - zależy to od sprzętu / oprogramowania serwera i obciążenia.

Aby upewnić się, że twój backupwęzeł MongoDB nie zostanie master, ustaw jego priorityparametr na 0np

rs.add({_id: 1, host: "localhost:<port>", priority: 0})

UWAGA : jeśli nie możesz mieć przestojów, POWINNYŚ mieć co najmniej 2 podstawowe węzły MongoDB w ReplicaSet, zobacz artykuł

Aleksander Azarow
źródło
2

Jedną strategią do rozważenia jest użycie opcji „ukrytej” w węźle zapasowym w replice. Z bloga MongoDB:

Ukryte serwery nie pojawią się w wynikach isMaster (). Oznacza to również, że nie będą one używane, jeśli sterownik automatycznie rozdzieli odczyty do urządzeń slave. Ukryty serwer musi mieć priorytet 0 (nie możesz mieć ukrytego podstawowego). Aby dodać ukrytego członka, uruchom:

rs.add ({"_ id": num, "host": nazwa hosta, "priorytet": 0, "ukryty": prawda})

Travis Dunn
źródło
1

Zestawy replik są ogólnie preferowane, ale także w tym przypadku po prostu ze względu na ich funkcję automatycznego odzyskiwania i automatycznej resynchronizacji. Opisana przez ciebie metoda tworzenia kopii zapasowych brzmi całkowicie rozsądnie i była wcześniej stosowana również w innych bazach danych.

Jedyny potencjalny problem, jaki widzę, to to, że w pewnych okolicznościach twoja pomocnicza może zostać awansowana na podstawową i albo albo) będziesz musiał wziąć kopię zapasową z nowej pomocniczej, albo b) sprawić, by twój skrypt zapasowy był wystarczająco inteligentny, aby poinformować to wystąpienie MongoDB, aby ustąpić.

Dobra wiadomość jest taka, że ​​powinno to być dość trywialne

  1. Zapytaj źródło kopii zapasowej, aby dowiedzieć się, która instancja jest podstawowa, a która dodatkowa ( db.isMaster())
  2. Przekonaj wystąpienie kopii zapasowej, aby zrezygnować za pomocą poleceń rs.freeze()i lub ponownie połącz się z pomocniczymrs.stepDown()
Charles Hooper
źródło
Czy nie jest możliwe ustawienie priorytetu na 0, jak sugeruje Alexander, aby wtórny nigdy nie stał się pierwotny?
James Simpson
Będziesz musiał przeprowadzić testy, ale nie jestem pewien, czy system wtórny przejdzie w tryb gotowości, jeśli z jakiegoś powodu podstawowy proces ulegnie awarii. Zawsze chciałem, aby moje drugorzędne przejęły;)
Charles Hooper
1
>> Twoje drugie miejsce może zostać awansowane na pierwsze - jak wspomniano, ustawienie drugiego na priorytet 0 zapobiegnie kiedykolwiek przełączeniu na główny.
Jonesome przywraca Monikę
Możesz połączyć się z dowolnym węzłem równorzędnym z listy węzłów równorzędnych (może to być dowolny węzeł główny, pomocniczy, arbiter lub ukryty), zapytać tego równorzędnego, kto jest drugim węzłem ( rs.status()i przejść przez niego result["members"]), i połączyć się z jednym z pomocnicze do wykonania kopii zapasowej.
yfeldblum