14 rzeczy, które chciałbym wiedzieć przed rozpoczęciem pracy z MongoDB

Przekład artykułu przygotowany przed rozpoczęciem kursu Bazy danych NoSQL.

14 rzeczy, które chciałbym wiedzieć przed rozpoczęciem pracy z MongoDB

Najważniejsze punkty:

  • Niezwykle istotne jest opracowanie schematu, mimo że w MongoDB jest on opcjonalny.
  • Podobnie, indeksy muszą odpowiadać twojemu schematowi i wzorcom dostępu.
  • Unikaj używania dużych obiektów i dużych tablic.
  • Zachowaj ostrożność z ustawieniami MongoDB, szczególnie jeśli chodzi o bezpieczeństwo i niezawodność.
  • W MongoDB nie ma optymalizatora zapytań, więc musisz być ostrożny przy wykonywaniu operacji zapytań.

Pracuję z bazami danych od bardzo długiego czasu, ale dopiero niedawno odkryłem MongoDB. Jest kilka rzeczy, które chciałbym wiedzieć przed rozpoczęciem pracy z nią. Kiedy ktoś ma już doświadczenie w danej dziedzinie, ma swoje wcześniejsze wyobrażenia o tym, czym są bazy danych i co robią. Aby ułatwić zrozumienie innym ludziom, przedstawiam listę powszechnych błędów.

Utworzenie serwera MongoDB bez uwierzytelniania

Niestety, MongoDB domyślnie jest instalowana bez uwierzytelniania. Dla stacji roboczej, do której dostęp uzyskuje się lokalnie, taka praktyka jest w porządku. Ale ponieważ MongoDB jest systemem wielodostępnym, który lubi korzystać z dużych ilości pamięci, lepiej byłoby, gdybyś zainstalował ją na serwerze z maksymalną ilością pamięci RAM, jaką możesz mieć w tych warunkach, nawet jeśli zamierzasz używać jej tylko do rozwoju. Instalacja na serwerze przez domyślny port może być problematyczna, szczególnie, jeśli w zapytaniu można wykonać dowolny kod JavaScript (np. $where jako pomysł na wstrzyknięcia).

Istnieje kilka metod uwierzytelniania, ale najłatwiej jest ustawić ID/hasło dla użytkownika. Skorzystaj z tego pomysłu, podczas gdy myślisz o fantazyjnej uwierzytelnianiu opartej na LDAP. Jeśli mówimy o bezpieczeństwie, to MongoDB powinna być stale aktualizowana, a logi zawsze należy sprawdzać pod kątem nieautoryzowanego dostępu. Na przykład, lubię wybierać inny port jako port domyślny.

Nie zapomnij powiązać powierzchni ataku z MongoDB

Lista kontrolna zabezpieczeń MongoDB zawiera dobre porady dotyczące zmniejszenia ryzyka nieautoryzowanego dostępu do sieci i wycieku danych. Łatwo jest zlekceważyć i powiedzieć, że serwer deweloperski nie wymaga wysokiego poziomu bezpieczeństwa. Jednak sprawy nie są takie proste i odnosi się to do wszystkich serwerów MongoDB. W szczególności, jeśli nie ma przekonującego powodu do użycia mapReduce, grupa lub $where, należy wyłączyć możliwość uruchamiania dowolnego kodu w JavaScript, zmieniając plik konfiguracyjny javascriptEnabled:false. Ponieważ w standardowej MongoDB pliki danych nie są szyfrowane, rozsądnie jest uruchamiać MongoDB z Dedykowany użytkownik, który ma pełny dostęp do plików, z ograniczonym dostępem tylko dla niego oraz możliwością korzystania z własnych narzędzi zarządzania dostępem do plików systemu operacyjnego.

Błąd w projektowaniu schematu

MongoDB nie korzysta z schematu. Ale to nie znaczy, że schemat jest zbędny. Jeśli chcesz po prostu przechowywać dokumenty bez jakiegokolwiek zharmonizowanego schematu, można je szybko i łatwo przechować, ale ich późniejsze wydobycie może być niezwykle trudne.

Klasyczny artykuł „6 empirycznych zasad projektowania schematów MongoDB” wart jest przeczytania, a takie funkcje jak Schema Explorer w zewnętrznym narzędziu Studio 3T są warte wykorzystania do regularnych kontroli schematów.

Nie zapomnij o porządku sortowania

Zapominając o porządku sortowania, można doświadczyć największego rozczarowania i stracić więcej czasu niż przy użyciu jakiejkolwiek innej błędnej konfiguracji. Domyślnie MongoBD używa sortowania binarnego. Ale mało kto uzna to za użyteczne. Wrażliwe na wielkość liter i akcentowanie, sortowanie binarne uważało się za ciekawy anachronizm, podobnie jak koralików, kaftany i kręcone wąsy jeszcze w latach 80. XX wieku. Teraz ich użycie jest nie do przyjęcia. W rzeczywistości „motocykl” to to samo, co „Motocykl”. A „Wielka Brytania” i „wielka brytania” to to samo miejsce. Mała litera to po prostu wielka litera w równoważnej formie. I nie zmuszaj mnie, bym mówił o sortowaniu znaków diakrytycznych. Przy tworzeniu bazy danych w MongoDB używaj parametrów sortowania, które nie uwzględniają akcentów i wielkości liter, które odpowiadają językowi i kulturze użytkowników systemu. W ten sposób znacząco uprościsz wyszukiwanie w danych tekstowych.

Tworzenie kolekcji z dużymi dokumentami

MongoDB umożliwia przechowywanie dużych dokumentów o rozmiarze do 16 MB w kolekcjach, a GridFS jest przeznaczone do dużych dokumentów o rozmiarze przekraczającym 16 MB. Jednak tylko dlatego, że można tam przechowywać duże dokumenty, nie jest to najlepszy pomysł. Najlepiej MongoDB działa, gdy przechowujesz pojedyncze dokumenty o rozmiarze kilku kilobajtów, traktując je bardziej jak wiersze w szerokiej tabeli SQL. Duże dokumenty będą źródłem problemów z wydajnością.

Tworzenie dokumentów z dużymi tablicami

Dokumenty mogą zawierać tablice. Najlepiej, jeśli liczba elementów w tablicy jest znacznie mniejsza niż cztery cyfry. Jeśli elementy są często dodawane do tablicy, przekroczy ona zawierający ją dokument i będzie trzeba ją przenieść, co oznacza, że trzeba będzie zaktualizować i indeksy. Podczas ponownej indeksacji dokumentu z dużą tablicą, indeksy często będą nadpisywane, ponieważ dla każdego elementu istnieje zapis, przechowujący jego indeks. Taka ponowna indeksacja występuje również, gdy dokument jest dodawany lub usuwany.

W MongoDB istnieje tzw. „wskaźnik wypełnienia”, który zapewnia przestrzeń na rozwój dokumentów, aby zminimalizować ten problem.
Możesz pomyśleć, że można obejść się bez indeksacji tablic. Niestety, z powodu braku indeksów mogą pojawić się inne problemy. Ponieważ dokumenty są przeszukiwane od początku do końca, wyszukiwanie elementów na końcu tablicy zajmie więcej czasu, a większość operacji związanych z takim dokumentem będzie wolna.

Nie zapomnij, że kolejność etapów w agregacji ma znaczenie

W systemie baz danych z optymalizatorem zapytań, zapytania, które piszesz, są wyjaśnieniami tego, co chcesz uzyskać, a nie tym, jak to osiągnąć. Taki mechanizm działa na podobieństwo zamówienia w restauracji: zwykle po prostu zamawiasz danie, a nie dajesz szczegółowych instrukcji kucharzowi.

W MongoDB instruujesz kucharza. Na przykład, musisz upewnić się, że dane przechodzą przez reduce jak najszybciej w pipeline za pomocą $match i $project, a sortowanie odbywa się dopiero po reduce, i że wyszukiwanie odbywa się dokładnie w tym porządku, w jakim potrzebujesz. Posiadanie optymalizatora zapytań, który eliminuje zbędną pracę, optymalnie porządkuje etapy i wybiera typ połączenia, może Cię rozpieścić. W MongoDB masz większą kontrolę nad ceną wygody.

Takie narzędzia jak Studio 3T ułatwią tworzenie zapytań agregacyjnych w MongoDB. Funkcja Aggregation Editor pozwoli Ci stosować operatory potoków jeden etap za razem oraz sprawdzać dane wejściowe i wyjściowe na każdym etapie dla ułatwienia debugowania.

Używanie szybkiej rejestracji

Nigdy nie ustawiaj w MongoDB parametrów rejestracji z wysoką prędkością, ale niską niezawodnością. Ten tryb «file-and-forget» wydaje się szybki, ponieważ polecenie zwraca się przed zapisaniem. Jeśli system zawiedzie przed zapisaniem danych na dysku, zostaną one utracone i znajdą się w niespójnym stanie. Na szczęście w 64-bitowym MongoDB włączone jest dziennikowanie.

Silniki przechowywania MMAPv1 i WiredTiger używają dziennikowania, aby temu zapobiec, chociaż WiredTiger może przywrócić się do ostatniego spójnego punktu kontrolnego, jeśli dziennikowanie jest wyłączone.

Dziennikowanie zapewnia, że baza danych znajduje się w spójnym stanie po przywróceniu i przechowuje wszystkie dane do momentu zapisu w dzienniku. Częstotliwość zapisów jest konfigurowana za pomocą parametru commitIntervalMs.

Aby mieć pewność co do zapisów, upewnij się, że w pliku konfiguracyjnym dziennikowanie jest włączone (storage.journal.włączone), a częstotliwość zapisów odpowiada ilości informacji, którą możesz sobie pozwolić stracić.

Sortowanie bez indeksu

Podczas wyszukiwania i agregacji często zachodzi potrzeba sortowania danych. Miejmy nadzieję, że dzieje się to na jednym z ostatnich etapów, po filtrowaniu wyników w celu zmniejszenia objętości sortowanych danych. I nawet w takim przypadku do sortowania potrzebny będzie indeks. Można użyć indeksu pojedynczego lub złożonego.

Jeśli odpowiedniego indeksu nie ma, MongoDB poradzi sobie bez niego. Istnieje ograniczenie pamięci wynoszące 32 MB na całkowity rozmiar wszystkich dokumentów w operacji sortowania, a jeśli MongoDB osiągnie ten limit, to wyda błąd lub zwróci pusty zestaw rekordów.

Wyszukiwanie bez wsparcia indeksów

Zapytania wyszukiwania pełnią funkcję podobną do operacji JOIN w SQL. Aby działały lepiej, potrzebują indeksu wartości klucza używanego jako klucz obcy. To nie jest oczywiste, ponieważ użycie nie jest odzwierciedlone w explain(). Takie indeksy są uzupełnieniem indeksu zapisanego w explain(), który z kolei jest używany przez operatorów pipeline $match i $sort, gdy pojawiają się na początku pipeline. Indeksy mogą teraz obejmować dowolny etap pipeline'a agregacji.

Rezygnacja z wielokrotnych aktualizacji

Metoda db.collection.update() jest używana do zmiany części istniejącego dokumentu lub całego dokumentu, aż do pełnej wymiany, w zależności od zadanego parametru update. Nie jest tak oczywiste, że nie przetworzy wszystkich dokumentów w kolekcji, dopóki nie ustawisz parametru multi aby zaktualizować wszystkie dokumenty spełniające kryteria zapytania.

Nie zapomnij o znaczeniu kolejności kluczy w tablicy haszującej

W JSON obiekt składa się z nieuporządkowanej kolekcji zerowej lub większej par klucz/wartość, gdzie klucz to ciąg znaków, a wartość to ciąg znaków, liczba, wartość logiczna, zero, obiekt lub tablica.

Niestety, BSON przykłada dużą wagę do kolejności podczas wyszukiwania. W MongoDB kolejność kluczy wewnątrz wbudowanych obiektów ma wartość, tzn. { firstname: "Phil", surname: "factor" } nie jest to samo co { { surname: "factor", firstname: "Phil" }. Oznacza to, że musisz zachować kolejność par klucz/wartość w dokumentach, jeśli chcesz mieć pewność, że je znajdziesz.

Nie myl "null" i "undefined"

Wartość "undefined" nigdy nie były dozwolone w JSON, zgodnie z oficjalnym standardem JSON (ECMA-404, Rozdział 5), mimo że są używane w JavaScript. Co więcej, dla BSON zostały one uznane za przestarzałe i są przekształcane w $null, co nie zawsze jest dobrym rozwiązaniem. Unikaj używania "undefined" w MongoDB.

Użycie $limit() bez $sort()

Bardzo często, gdy rozwijasz aplikację w MongoDB, przydatne jest po prostu zobaczenie próbki wyniku, który zostanie zwrócony z zapytania lub agregacji. Do tego zadania przyda ci się $limit(), ale nigdy nie powinno go być w finalnej wersji kodu, chyba że przed nim używasz $sort. Ta mechanika jest potrzebna, ponieważ w przeciwnym razie nie możesz zagwarantować kolejności wyników i nie będziesz mógł niezawodnie przeglądać danych. Na górze wyników będziesz otrzymywał różne wpisy w zależności od sortowania. Aby działać niezawodnie, zapytania i agregacje muszą być deterministyczne, to znaczy muszą zwracać te same wyniki przy każdym wykonaniu. Kod, w którym są $limit(), ale nie ma $sort, nie będzie deterministyczny i w przyszłości może spowodować błędy, które będą trudne do zidentyfikowania.

Podsumowanie

Jedynym sposobem na rozczarowanie się MongoDB jest porównywanie jej bezpośrednio z innym typem baz danych, takim jak RDBMS, lub przyjście do jej używania, opierając się na jakichś określonych oczekiwaniach. To tak, jakby porównywać pomarańczę z widelcem. Systemy baz danych mają swoje cele. Najlepiej po prostu zrozumieć i docenić te różnice. Byłoby wstyd naciskać na programistów MongoDB z powodu drogi, którą zmusili ich zająć się RDBMS. Chciałbym widzieć nowe i interesujące sposoby rozwiązania starych problemów, takich jak zapewnienie integralności danych i tworzenie systemów danych odpornych na awarie i ataki cybernetyczne.

Wprowadzenie w MongoDB w wersji 4.0 transakcyjności ACID to dobry przykład wprowadzenia ważnych ulepszeń w sposób innowacyjny. Transakcje wielodokumentowe i wieloopera cyjne są teraz atomowe. Pojawiła się również możliwość regulacji czasu potrzebnego na uzyskanie blokad oraz kończenia zawieszonych transakcji, a także zmiany poziomu izolacji.

14 rzeczy, które chciałbym wiedzieć przed rozpoczęciem pracy z MongoDB

Czytaj dalej:

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster