MongoDB: Zestaw replik (HA)

Jak skonfigurować zestaw replik o wysokiej dostępności

Zestaw replik (replica set) to grupa węzłów MongoDB, które współpracują ze sobą, aby zapewnić wysoką dostępność i lepszą wydajność poprzez duplikowanie danych na wielu serwerach. Dzięki zestawowi replik Twoja baza danych pozostaje dostępna nawet w przypadku awarii jednego z węzłów, a rozkładanie obciążenia pozwala obsłużyć większą liczbę zapytań.

Przykład zestawu replik z 3 węzłamiPrzykład zestawu replik z 3 węzłami

W konfiguracji wysokiej dostępności, jeśli jeden z węzłów przestanie działać, dane nadal są dostępne na pozostałych węzłach. Wydajność również wzrasta, ponieważ wszystkie operacje zapisu trafiają do węzła primary, natomiast odczyty mogą być rozproszone pomiędzy węzły secondary.

Jeśli dopiero zaczynasz pracę z zestawami replik, warto zapoznać się z oficjalną dokumentacją MongoDB, aby uzyskać więcej informacji.

Aby skonfigurować zestaw replik, potrzebujesz co najmniej trzech węzłów MongoDB:

  1. Jeden węzeł pełni rolę primary – obsługuje wszystkie operacje zapisu oraz domyślnie także odczyty.
  2. Pozostałe węzły to secondaries. Replikują one dane z węzła primary niemal w czasie rzeczywistym.

Jeśli węzeł secondary stanie się niedostępny, Twoja aplikacja nadal działa bez zakłóceń. Po ponownym dołączeniu do klastra, węzeł synchronizuje brakujące dane i aktualizuje się względem reszty zestawu replik.

W przypadku awarii węzła primary, zestaw replik automatycznie przeprowadza wybory nowego primary. Proces ten trwa zazwyczaj około 10 sekund. W tym czasie zestaw replik działa w trybie tylko do odczytu. Po wybraniu nowego primary wszystkie operacje są wznawiane jak wcześniej.

Przykład wyborów primaryPrzykład wyborów primary

Aby utworzyć zestaw replik na Stackhero, potrzebujesz co najmniej trzech instancji MongoDB. Oto instrukcja krok po kroku:

  1. Uruchom trzy (lub więcej) instancje MongoDB z poziomu panelu Stackhero.
  2. Po uruchomieniu instancji zaktualizuj ich konfigurację w panelu:
    1. Ustaw to samo hasło administratora na każdej instancji.
    2. Włącz opcję Aktywuj zestaw replik.
    3. Wybierz nazwę repliki oraz klucz tajny, które będą współdzielone przez wszystkie węzły. (Pamiętaj: nazwa repliki nie może być zmieniona po utworzeniu. Jeśli nie masz pewności, rs-1 to dobra wartość domyślna.)

Pamiętaj, że WSZYSTKIE Twoje instancje muszą mieć identyczną konfigurację (hasło administratora, nazwę zestawu replik oraz klucz tajny zestawu replik).

Po zapisaniu konfiguracji musisz zdefiniować wszystkich członków zestawu replik w MongoDB. Oto jak to zrobić:

  1. Możesz użyć poniższego polecenia, aby połączyć się za pomocą Mongo CLI:
mongo --quiet mongodb://admin@<XXXXXX>.stackhero-network.com/?tls=true

Jeśli nie masz zainstalowanego Mongo CLI, możesz skorzystać z oficjalnego obrazu Docker, uruchamiając polecenie:

> docker run -it mongo /bin/bash

To polecenie otwiera powłokę, w której możesz bezpośrednio wykonywać polecenia Mongo.

  1. Po połączeniu możesz zainicjować zestaw replik poniższym poleceniem. Pamiętaj, aby podmienić _id na wybraną nazwę zestawu replik oraz zaktualizować hosty członków:
rs.initiate({
   _id: "rs-1",
   members: [
      { _id: 0, host: "<XXXXXX>.stackhero-network.com:27017" },
      { _id: 1, host: "<XXXXXX>.stackhero-network.com:27017" },
      { _id: 2, host: "<XXXXXX>.stackhero-network.com:27017" }
   ]
})

Jeśli polecenie zakończy się powodzeniem, zobaczysz odpowiedź w postaci { "ok" : 1 }.

  1. Aby sprawdzić konfigurację swojego zestawu replik, możesz wykonać:
rs.conf()

Konfigurację należy zastosować tylko na jednym węźle. Pozostałe węzły zostaną zaktualizowane automatycznie.

Twój zestaw replik MongoDB powinien być już uruchomiony i gotowy do pracy.

Aby ułatwić monitorowanie statusu zestawu replik, przygotowaliśmy skrypt Node.js, który sprawdza status co sekundę. Skrypt jest dostępny w naszym repozytorium GitHub.

Zrzut ekranu ze skryptuZrzut ekranu ze skryptu

Jeśli pojawi się ten błąd, najczęściej oznacza to, że nie została włączona obsługa szyfrowania TLS. Możesz to naprawić, dodając parametr tls=true do swojego URL połączenia. Przykład:

mongodb://admin:PASSWORD@<XXXXXX>.stackhero-network.com:27017/admin?tls=true