Prawdopodobnie hostujesz MongoDB u niezawodnego dostawcy usług w chmurze, na przykład Atlas, ponieważ naprawdę chcesz skupić się na swoim pomyśle i przekazać wszystkie subtelne kluczowe obszary zarządzania, takie jak sieć, pamięć masowa, dostęp itp.
Na początku wszystko wygląda dobrze, dopóki Twój mały pomysł nie zamieni się w biznes, a koszty zaczną gwałtownie rosnąć. Nawet jeśli tak nie jest, ten post będzie nadal zawierał ogólny przegląd zawiłości technicznych (i zaoszczędzonych pieniędzy!), jeśli miałbyś migrować do rozwiązania z własnym hostingiem.
BTW, o ile oszczędności mówimy? Zróbmy szybkie porównanie Atlasu instancja i samoobsługowa baza danych MongoDB na AWS .
Atlas (~166 USD/miesiąc)
0,23 USD/godzinę w oparciu o powyższe wymagania (~ cloud.mongodb.com)
AWS (~36 USD/miesiąc)
0,0416 USD/godz. za instancję i dodatkowe ceny na podstawie typu EBS i pamięci (~ kalkulator.aws)
To prawie 4,5x oszczędności na samej infrastrukturze!
Teraz, gdy już znasz główne przyczyny i nadal czytasz ten post, bez zbędnych ceregieli, zagłębimy się w technologię.
Kontur
- Konfiguracja infrastruktury
- Konfigurowanie MongoDB
- Migracja zbiorcza
- Delta-sync w celu zlikwidowania opóźnienia przełącznika połączenia (nie dotyczy przestarzałych klastrów)
Ponieważ cała treść może być nieco wyczerpująca w jednym miejscu, podzielę to na 2 powiązane posty.
1. Konfiguracja infrastruktury
Wspomnę poniżej przewodnik dotyczący konfiguracji instancji z systemem RedHat Enterprise Linux 8 na AWS. Dzieje się tak, ponieważ MongoDB generalnie działa lepiej z systemem plików xfs. Oto artykuł, który pozwoli lepiej to zrozumieć.
Rozkręć instancję EC2
Użyłem pliku t3.small
instancja dostarczana z 2 procesorami wirtualnymi i 2 GB pamięci RAM aczkolwiek możesz wybrać dowolną instancję.
Zaleca się, aby baza danych miała dostęp do co najmniej 1 GB pamięci RAM i 2 prawdziwe rdzenie ponieważ ma to bezpośredni wpływ na wydajność podczas buforowania i mechanizmów współbieżności obsługiwanych przez domyślny silnik WiredTiger . Możesz przeczytać więcej o uwagach produkcyjnych związanych z wymaganiami dotyczącymi pamięci RAM i procesora tutaj .
Przegląd konfiguracji:
- System operacyjny:Redhat Enterprise Linux 8 (z procesorem x64 Intel)
- Typ wystąpienia:t3.small
- Pamięć:10 GB (os) + 30 GB (dane) + 3 GB (dzienniki) EBS tj. 3 oddzielne tomy
Zakładam, że znasz się na tworzeniu maszyny wirtualnej na AWS.
Teraz, gdy instancja będzie działać, przypisz elastyczny adres IP do niego, a następnie po prostu wykonaj zdalne logowanie do komputera.
Będziemy potrzebować elastycznego adresu IP aby ustawić publiczną nazwę hosta dla instancji
$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>
Podłącz dodatkowe woluminy
Dodaliśmy 2 dodatkowe woluminy EBS inne niż Root FS dla danych i dzienników, które nie zostały jeszcze zamontowane (Pamiętasz 30Gb i 3Gb? ). Możesz wyświetlić listę bloków głośności za pomocą,
$ sudo lsblk
Dodatkowe woluminy zostaną wyświetlone zaraz za blokiem głównym (patrz strzałki)
Na powyższym obrazku widać, że dodatkowe woluminy są nazwane
- xvdb (30 GB miejsca do przechowywania danych)
- xvdc (3 GB miejsca do przechowywania dzienników)
Teraz utwórzmy systemy plików w tych woluminach.
$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc
-L
to opcja aliasu do ustawienia etykiety woluminu
A następnie zamontuj woluminy.
$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb
Aby zmiany te zostały odzwierciedlone, system musi zostać ponownie uruchomiony. Dlatego teraz potrzebujemy również trwałości partycji, aby w przypadku niezamierzonego ponownego uruchomienia nie utracić pamięci bazy danych.
Możemy to osiągnąć, określając zasady montowania w pliku fstab. Więcej na ten temat możesz przeczytać tutaj.
Wcześniej skopiujmy UUID powyższych partycji (ponieważ są one unikalne i nie zmienią się po ponownym uruchomieniu systemu )
$ sudo blkid
Skopiuj identyfikatory UUID wymienione dla /dev/xvdb i /dev/xvdc . Zapoznaj się z „ETYKIETĄ” do identyfikacji bloku
Teraz otwórz /etc/fstab
plik i wklej konfigurację w następującym formacie.
UUID=<COPIED_UUID_FOR_DATA> /var/lib/mongo xfs defaults,nofail 0 0
UUID=<COPIED_UUID_FOR_LOGS> /var/log/mongodb xfs defaults,nofail 0 0
Aktualizuj nazwę hosta
Nazwa hosta będzie używana do identyfikacji serwera bazy danych w sieci. Możesz użyć wyżej przypisanego elastycznego adresu IP lub Nazwa domeny (jeśli jest dostępna). Otwórz /etc/hostname
pliku i dołącz wpis. Na przykład
ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...
Zaktualizuj limity procesu (opcjonalnie)
Jest to opcjonalnie wymagane w celu kontrolowania maksymalnej liczby akceptowalnych połączeń przy jednoczesnym utrzymaniu stabilności systemu. Otwórz /etc/security/limits.conf
plik i dodaj następujące wpisy.
* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000
Teraz, gdy wszystkie wymagania wstępne związane z infra są posortowane, uruchom ponownie instancji i przejdźmy do instalacji MongoDB.
1. Konfigurowanie MongoDB
Dodaj źródło repo
Utwórz plik /etc/yum.repos.d/mongodb-org.4.2.repo
i dodaj następujące szczegóły repozytorium pakietów.
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
Teraz zainstalujmy MongoDB.
$ sudo yum -y install mongodb-org
Tworzenie katalogów i ustawianie uprawnień
MongoDB domyślnie używa następujących ścieżek do przechowywania danych i dzienników wewnętrznych:
/var/lib/mongo → Dane
/var/log/mongodb → Dzienniki
Utwórz katalogi
$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb
Zmień uprawnienia użytkownika i grupy
$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod
Utwórz użytkownika administratora
demon/usługa Mongod musi być najpierw uruchomiony, zanim przystąpimy do tworzenia użytkownika. Użyjmy domyślnej konfiguracji (przechowywanej w /etc/mongod.conf
) na razie i uruchom proces demona.
$ sudo -u mongod mongod -f /etc/mongod.conf
Powyższe polecenie uruchomi demona mongod w trybie rozwidlenia (domyślnie).
Teraz zalogujmy się na serwer i utwórzmy naszego pierwszego administratora.
Otwórz muszlę mongo
$ mongo
Użyj bazy danych „admin”, aby utworzyć administratora root
> use admin
Utwórz administratora
> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})
Utwórz zwykłego użytkownika
> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
Na razie wyłącz serwer. Uruchomimy ponownie ze zmodyfikowaną konfiguracją
> db.shutDownServer()
Konfiguracja uwierzytelniania
W tym miejscu włączymy uwierzytelnianie bazy danych i zmodyfikujemy adres powiązania, aby nasz serwer był dostępny w domenie publicznej. Otwórz /etc/mongod.conf
i wprowadź poniższe zmiany.
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # accessible on the network address
security:
authorization: enabled # creds will be required for making db operations
Zapisz konfigurację i uruchom ponownie serwer.
$ sudo -u mongod mongod -f /etc/mongod.conf
Testuj logowanie
Możesz sprawdzić, czy poświadczenia działają, używając,
$ mongo -u admin -p password
To tyle, jeśli chodzi o początkową konfigurację! Czekajcie na mój kolejny powiązany post na temat szczegółowego procesu migracji i wskazówek dotyczących utrzymywania gotowości produkcyjnej bazy danych.
PS Dziękujemy Piyushowi Kumarowi za pomoc w przygotowaniu tego posta!