Po pomyślnym opracowaniu aplikacji, a przed poświęceniem się produkcji MongoDB, skorzystaj z tych krótkich wskazówek, aby zapewnić płynny i wydajny przepływ, a także osiągnąć optymalną wydajność.
1) Opcje wdrażania
Wybór odpowiedniego sprzętu
Aby uzyskać optymalną wydajność, lepiej jest używać dysku SSD niż dysku twardego. Należy zadbać o to, czy pamięć ma charakter lokalny czy zdalny i podjąć odpowiednie środki. Lepiej jest używać RAID do ochrony defektów sprzętowych i schematu odzyskiwania, ale nie polegaj na nim całkowicie, ponieważ nie zapewnia żadnej ochrony przed niepożądanymi awariami. Do wykonywania na dyskach RAID-10 jest dobrym rozwiązaniem pod względem wydajności i dostępności, której często brakuje na innych poziomach RAID. Właściwy sprzęt jest elementem składowym Twojej aplikacji, zapewniającym zoptymalizowaną wydajność i pozwalającym uniknąć poważnych niepowodzeń.
Hosting w chmurze
Dostępnych jest wielu dostawców chmury, którzy oferują wstępnie zainstalowane hosty baz danych MongoDB. Wybór najlepszego wyboru to podstawa rozwoju Twojej aplikacji i wywarcia pierwszego wrażenia na rynku docelowym. MongoDB Atlas to jeden z możliwych wyborów, który oferuje kompletne rozwiązanie dla interfejsu w chmurze z funkcjami takimi jak wdrażanie węzłów i migawka danych przechowywanych w Amazon S3. ClusterControl to kolejna dobra dostępna opcja ułatwiająca wdrażanie i skalowanie. Który oferuje wiele funkcji, takich jak łatwe dodawanie i usuwanie węzłów, zmiana rozmiaru instancji i klonowanie klastra produkcyjnego. Możesz wypróbować ClusterControl tutaj bez opłat. Inne dostępne opcje to RackSpace ObjectRocket i MongoStitch.
2) RAM
Często używane elementy są buforowane w pamięci RAM, dzięki czemu MongoDB może zapewnić optymalny czas odpowiedzi. Pamięć RAM zwykle zależy od ilości danych, które zamierzasz przechowywać, liczby kolekcji i indeksów. Upewnij się, że masz wystarczająco dużo pamięci RAM, aby pomieścić indeksy, w przeciwnym razie drastycznie wpłynie to na wydajność aplikacji w środowisku produkcyjnym. Więcej pamięci RAM oznacza mniej błędów strony i lepszy czas odpowiedzi.
3) Indeksowanie
W przypadku aplikacji, które zawierają chroniczne żądania zapisu, indeksowanie odgrywa nadrzędną rolę. Zgodnie z dokumentacją MongoDB:
„Jeśli operacja zapisu modyfikuje zindeksowane pole, MongoDB aktualizuje wszystkie indeksy, które mają zmodyfikowane pole jako klucz”
Dlatego zachowaj ostrożność podczas wybierania indeksów, ponieważ może to wpłynąć na wydajność bazy danych.
Przykład indeksowania:przykładowy wpis w bazie danych restauracji
{
"address": {
"building": "701",
"street": "Harley street",
"zipcode": "71000"
},
"cuisine": "Bakery",
"grades": [
{ "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
{ "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
{ "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
{ "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
{ "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
],
"name": "Bombay Bakery",
"restaurant_id": "187521"
}
-
Tworzenie indeksu w jednym polu
> db.restaurants.createIndex( { "cuisine": 1 } ); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
W powyższym przykładzie indeks kolejności rosnącej jest tworzony na polu kuchni.
-
Tworzenie indeksu na wielu polach
> db.restaurants.createIndex( { "cuisine": 1 , "address.zipcode": -1 } ); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
Tutaj tworzony jest indeks złożony na polach kuchni i kodu pocztowego. Liczba -ve określa porządek malejący.
4) Bądź przygotowany na sharding
MongoDB dzieli dane na różne maszyny przy użyciu mechanizmu zwanego shardingiem. Nie zaleca się dodawania shardingu na początku, chyba że oczekujesz obszernych zestawów danych. Pamiętaj, aby utrzymać wydajność aplikacji w linii, potrzebujesz dobrego klucza shardingu, zgodnie z wzorcami danych, ponieważ ma to bezpośredni wpływ na czas odpowiedzi. Równoważenie danych między fragmentami jest automatyczne. Jednak lepiej być przygotowanym i mieć odpowiedni plan. Dzięki temu możesz przeprowadzić konsolidację zawsze, gdy wymaga tego Twoja aplikacja.
5) Najlepsze praktyki dotyczące konfiguracji systemu operacyjnego
- System plików XFS
- Jest to wysoce skalowalny, wysokowydajny 64-bitowy system plików z księgowaniem. Poprawia wydajność we/wy, umożliwiając mniejszą i większą liczbę operacji we/wy.
- Ustaw limit deskryptorów plików.
- Wyłącz przezroczyste duże strony i niejednolitą pamięć dostępu (NUMA).
- Zmień domyślny czas utrzymywania aktywności TCP na 300 sekund (dla Linuksa) i 120 sekund (dla Azure).
Wypróbuj te polecenia, aby zmienić domyślny czas utrzymywania aktywności;
Dla Linuksa
sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>
Dla Windows
Wpisz to polecenie w wierszu polecenia jako administrator, gdzie
reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>
6) Zapewnienie wysokiej dostępności za pomocą replikacji
Przejście na produkcję bez replikacji może spowodować nagłe awarie aplikacji. Replikacja rozwiązuje problem w przypadku awarii węzła. Zarządzaj operacjami odczytu i zapisu dla drugorzędnych instancji MongoDB zgodnie z potrzebami aplikacji.
Pamiętaj o tych rzeczach podczas replikacji:
- Aby uzyskać wysoką dostępność, wdróż zestaw replik w co najmniej trzech centrach danych.
- Upewnij się, że instancje MongoDB mają 0 lub 1 głos.
- Zapewnij pełną dwukierunkową łączność sieciową między wszystkimi instancjami MongoDB.
Przykład tworzenia zestawu replik z 4 lokalnymi instancjami MongoDB:
-
Tworzenie 4 lokalnych instancji MongoDB
Najpierw utwórz katalogi danych
mkdir -p /data/m0 mkdir -p /data/m1 mkdir -p /data/m2 mkdir -p /data/m3
-
Uruchom 4 lokalne instancje
mongod --replSet cluster1 --port 27017 --dbpath /data/m0 mongod --replSet cluster2 --port 27018 --dbpath /data/m1 mongod --replSet cluster1 --port 27019 --dbpath /data/m2 mongod --replSet cluster1 --port 27020 --dbpath /data/m3
-
Dodaj instancje do klastra i zainicjuj
mongo myhost:34014 myConfig = {_id: ‘cluster1’, members: [ {_id: 0, host: ‘myhost1:27017’}, {_id: 1, host: ‘myhost2:27018’}, {_id: 2, host: ‘myhost3:27019’}, {_id: 3, host: ‘myhost4:27020’}] } rs.initiate(myConfig);
Środki bezpieczeństwa
7) Bezpieczne maszyny
Otwarte porty na maszynach hostujących MongoDB są podatne na różne złośliwe ataki. Ponad 30 tysięcy baz danych MongoDB zostało skompromitowanych w ataku ransomware z powodu opóźnień w odpowiedniej konfiguracji zabezpieczeń. Podczas pracy produkcyjnej zamknij swoje publiczne porty serwera MongoDB. Należy jednak pozostawić jeden port otwarty dla celów SSh.
Włączanie uwierzytelniania w instancji MongoDB:
-
Uruchom plik mongod.conf w swoim ulubionym edytorze.
-
Dołącz te wiersze na końcu pliku konfiguracyjnego.
security: authorization: enabled
-
Dołącz te wiersze na końcu pliku konfiguracyjnego.
service mongod restart
-
Potwierdź status
service mongod status
Ograniczanie dostępu z zewnątrz
Otwórz ponownie plik mongod.conf, aby ustawić ograniczony dostęp IP do serwera.
bind_ip=127.0.0.1
Dodanie tej linii oznacza, że możesz uzyskać dostęp do serwera tylko przez 127.0.0. (który jest hostem lokalnym). Możesz także dodać wiele adresów IP w opcji wiązania.
bind_ip=127.0.0.1,168.21.200.200
Oznacza to, że możesz uzyskać dostęp z hosta lokalnego i sieci prywatnej.
8) Ochrona hasłem
Aby dodać dodatkową warstwę bezpieczeństwa do swoich maszyn, włącz kontrolę dostępu i wymuś uwierzytelnianie. Pomimo tego, że ograniczyłeś serwer MongoDB do przyjmowania połączeń ze świata zewnętrznego, nadal istnieje możliwość przedostania się złośliwych skryptów na Twój serwer. Dlatego nie wahaj się ustawiać nazwy użytkownika/hasła do swojej bazy danych i przydzielać wymagane uprawnienia. Włączona kontrola dostępu pozwoli użytkownikom wykonywać tylko czynności określone przez ich role.
Oto kroki, aby utworzyć użytkownika i przypisać dostęp do bazy danych do określonych ról.
W pierwszej kolejności utworzymy użytkownika (w tym przypadku jest to administrator) do zarządzania wszystkimi użytkownikami i bazami danych, a następnie utworzymy konkretnego właściciela bazy danych z uprawnieniami tylko do odczytu i zapisu w jednej instancji bazy danych MongoDB.
Utwórz administratora do zarządzania innymi użytkownikami instancji bazy danych
-
Otwórz powłokę Mongo i przejdź do bazy danych administratora:
use admin
-
Utwórz użytkownika dla bazy danych administratora
db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
-
Uwierzytelnij nowo utworzonego użytkownika
db.auth("admin", "admin_password")
-
Tworzenie konkretnego użytkownika instancji:
use database_1 db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })
-
Teraz sprawdź, czy użytkownik został pomyślnie utworzony, czy nie.
db.auth("user_1", "your_password") show collections
Otóż to! Pomyślnie zabezpieczyłeś swoje instancje bazy danych za pomocą odpowiedniego uwierzytelniania. Możesz dodać dowolną liczbę użytkowników, wykonując tę samą procedurę.
9) Szyfrowanie i ochrona danych
Jeśli używasz Wiredtiger jako silnika pamięci, możesz użyć jego szyfrowania w konfiguracji spoczynkowej, aby zaszyfrować dane. Jeśli nie, szyfrowanie powinno być wykonywane na hoście przy użyciu systemu plików, urządzeń lub szyfrowania fizycznego.
10) Monitoruj swoje wdrożenie
Po zakończeniu wdrażania MongoDB w środowisku produkcyjnym należy śledzić działania wydajnościowe, aby zapobiec wczesnym możliwym problemom. Istnieje szereg strategii, które możesz dostosować, aby monitorować wydajność danych w środowisku produkcyjnym.
-
MongoDB zawiera narzędzia, które zwracają statystyki dotyczące wydajności i aktywności instancji. Narzędzia służą do wskazywania problemów i analizowania normalnych operacji.
-
Użyj mongostatu, aby zrozumieć rozmieszczenie typów operacji i planowanie wydajności.
-
Do śledzenia raportów i czynności odczytu i zapisu zalecany jest mongotop.
mongotop 15
To polecenie zwróci dane wyjściowe co 15 sekund.
ns total read write 2018-04-22T15:32:01-05:00
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
local.me 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.system.namespaces 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
ns total read write 2018-04-22T15:32:16-05:00
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
local.me 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.system.namespaces 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
Usługa monitorowania MongoDB (MMS) to kolejna dostępna opcja, która monitoruje klaster MongoDB i ułatwia podgląd działań związanych z wdrażaniem produkcyjnym.
Oczywiście jest też ClusterControl firmy Manynines, system automatyzacji i zarządzania bazami danych typu open source. ClusterControl umożliwia łatwe wdrażanie klastrów ze zautomatyzowanymi ustawieniami bezpieczeństwa i ułatwia rozwiązywanie problemów z bazą danych, zapewniając łatwą w użyciu automatyzację zarządzania, która obejmuje naprawę i odzyskiwanie uszkodzonych węzłów, automatyczne aktualizacje i nie tylko. Możesz zacząć od (bezpłatnej na zawsze) wersji Community Edition, za pomocą której możesz wdrażać i monitorować MongoDB, a także tworzyć niestandardowych doradców, aby dostosować monitorowanie do tych aspektów, które są specyficzne dla Twojej konfiguracji. Pobierz go za darmo tutaj.