14 rzeczy, które chciałbym wiedzieć, zanim zacząłem korzystać z MongoDB

Tłumaczenie artykułu zostało przygotowane w przeddzień rozpoczęcia kursu „Nierelacyjne bazy danych”.

14 rzeczy, które chciałbym wiedzieć, zanim zacząłem korzystać z MongoDB

Highlights:

  • Opracowanie schematu jest niezwykle ważne, mimo że w MongoDB jest to opcjonalne.
  • Podobnie indeksy muszą być zgodne ze schematem i wzorcami dostępu.
  • Unikaj używania dużych obiektów i dużych tablic.
  • Zachowaj ostrożność przy ustawieniach MongoDB, zwłaszcza jeśli chodzi o bezpieczeństwo i niezawodność.
  • MongoDB nie posiada optymalizatora zapytań, dlatego należy zachować ostrożność podczas wykonywania operacji na zapytaniach.

Pracuję z bazami danych od bardzo długiego czasu, ale dopiero niedawno odkryłem MongoDB. Jest kilka rzeczy, które chciałbym wiedzieć, zanim zacząłem z tym pracować. Jeśli dana osoba ma już doświadczenie w określonej dziedzinie, ma z góry przyjęte wyobrażenie o tym, czym są bazy danych i do czego służą. W nadziei, że ułatwię innym zrozumienie, przedstawiam listę typowych błędów.

Tworzenie serwera MongoDB bez uwierzytelniania

Niestety MongoDB jest domyślnie instalowany bez uwierzytelniania. W przypadku stacji roboczej dostępnej lokalnie jest to normalne zjawisko. Ponieważ jednak MongoDB to system dla wielu użytkowników, który lubi wykorzystywać duże ilości pamięci, lepiej będzie, jeśli umieścisz go na serwerze z jak największą ilością pamięci RAM, nawet jeśli będziesz go używać tylko do programowania. Instalacja na serwerze poprzez domyślny port może być problematyczna, szczególnie jeśli w żądaniu można wykonać dowolny kod JavaScript (np. $where jako pomysł na zastrzyki).

Istnieje kilka metod uwierzytelniania, ale najłatwiejszym jest ustawienie identyfikatora użytkownika/hasła. Skorzystaj z tego pomysłu, myśląc o wymyślnym uwierzytelnianiu opartym na LDAP. Jeśli chodzi o bezpieczeństwo, MongoDB należy stale aktualizować, a logi należy zawsze sprawdzać pod kątem nieautoryzowanego dostępu. Na przykład lubię wybrać inny port jako port domyślny.

Nie zapomnij powiązać powierzchni ataku z MongoDB

Lista kontrolna bezpieczeństwa MongoDB zawiera dobre wskazówki, jak zmniejszyć ryzyko włamań do sieci i wycieku danych. Łatwo to zlekceważyć i powiedzieć, że serwer deweloperski nie potrzebuje wysokiego poziomu bezpieczeństwa. Nie jest to jednak takie proste i dotyczy to wszystkich serwerów MongoDB. W szczególności, jeśli nie ma istotnego powodu do użycia mapReduce, group lub $gdzie, musisz wyłączyć użycie dowolnego kodu w JavaScript, zapisując go w pliku konfiguracyjnym javascriptEnabled:false. Ponieważ pliki danych nie są szyfrowane w standardowej MongoDB, sensowne jest uruchomienie MongoDB Dedykowany użytkownik, który ma pełny dostęp do plików, z ograniczonym dostępem tylko do nich i możliwością korzystania z własnych kontroli dostępu do plików systemu operacyjnego.

Błąd podczas opracowywania obwodu

MongoDB nie używa schematu. Ale to nie znaczy, że program nie jest potrzebny. Jeśli chcesz po prostu przechowywać dokumenty bez spójnego schematu, przechowywanie ich może być szybkie i łatwe, ale późniejsze ich odzyskanie może być trudne. cholernie trudne.

Klasyczny artykuł”6 praktycznych zasad projektowania schematu MongoDB” Warto przeczytać i takie funkcje jak Eksplorator schematów w zewnętrznym narzędziu Studio 3T warto używać go do regularnych kontroli obwodów.

Nie zapomnij o kolejności sortowania

Zapomnienie o kolejności sortowania może spowodować więcej frustracji i zmarnować więcej czasu niż jakakolwiek inna nieprawidłowa konfiguracja. Domyślnie używa MongoBD sortowanie binarne. Ale jest mało prawdopodobne, aby komukolwiek się to przydało. W latach 80. ubiegłego wieku odmiany rozróżniające wielkość liter, akcenty i binarne były uważane za osobliwe anachronizmy, podobnie jak koraliki, kaftany i kręcone wąsy. Teraz ich użycie jest niewybaczalne. W prawdziwym życiu „motocykl” oznacza to samo, co „motocykl”. A „Wielka Brytania” i „Wielka Brytania” to to samo miejsce. Mała litera jest po prostu wielkim odpowiednikiem dużej litery. I nie każ mi zaczynać od sortowania znaków diakrytycznych. Tworząc bazę danych w MongoDB, użyj sortowania bez uwzględniania akcentów i Zarejestruj się, które odpowiadają językowi i kultura użytkownika systemu. Dzięki temu przeszukiwanie danych łańcuchowych będzie znacznie łatwiejsze.

Twórz kolekcje z dużymi dokumentami

MongoDB z przyjemnością hostuje duże dokumenty do 16 MB w kolekcjach i SiatkaFS Zaprojektowany dla dużych dokumentów większych niż 16 MB. Ale tylko dlatego, że można tam umieścić duże dokumenty, przechowywanie ich w tym miejscu nie jest dobrym pomysłem. MongoDB będzie działać najlepiej, jeśli będziesz przechowywać 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 występ.

Tworzenie dokumentów z dużymi tablicami

Dokumenty mogą zawierać tablice. Najlepiej, jeśli liczba elementów w tablicy jest odległa od liczby czterocyfrowej. Jeśli elementy są często dodawane do tablicy, przerośnie ona zawierający ją dokument i będzie konieczne przenosić, co oznacza, że ​​będzie to konieczne zaktualizuj także indeksy. Podczas ponownego indeksowania dokumentu zawierającego dużą tablicę indeksy często będą nadpisywane, ponieważ istnieje a rekord, który przechowuje swój indeks. To ponowne indeksowanie ma miejsce również podczas wstawiania lub usuwania dokumentu.

MongoDB ma coś, co nazywa się "współczynnik wypełnienia", co zapewnia miejsce na powiększanie się dokumentów, aby zminimalizować ten problem.
Możesz pomyśleć, że możesz obejść się bez indeksowania tablic. Niestety brak indeksów może spowodować inne problemy. Ponieważ dokumenty są skanowane od początku do końca, wyszukiwanie elementów na końcu tablicy będzie trwało dłużej, a większość operacji związanych z takim dokumentem będzie powolny.

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

W systemie baz danych wyposażonym w optymalizator zapytań zapytania, które piszesz, wyjaśniają, co chcesz uzyskać, a nie jak to uzyskać. Mechanizm ten działa analogicznie do składania zamówienia w restauracji: zazwyczaj po prostu zamawiasz danie i nie dajesz kucharzowi szczegółowych instrukcji.

W MongoDB instruujesz kucharza. Na przykład musisz upewnić się, że dane przechodzą reduce tak wcześnie, jak to możliwe, w rurociągu za pomocą $match и $project, a sortowanie następuje dopiero po reducei że wyszukiwanie odbywa się dokładnie w żądanej kolejności. Posiadanie optymalizatora zapytań, który eliminuje niepotrzebną pracę, optymalnie porządkuje kroki i wybiera typy złączeń, może Cię zepsuć. Dzięki MongoDB masz większą kontrolę kosztem wygody.

Narzędzia takie jak Studio 3T uprości konstrukcję zapytań agregujących w MongoDB. Funkcja Edytora agregacji umożliwia stosowanie instrukcji potoku etapowo oraz sprawdzanie danych wejściowych i wyjściowych na każdym etapie w celu uproszczenia debugowania.

Korzystanie z szybkiego nagrywania

Nigdy nie ustawiaj opcji zapisu MongoDB na dużą prędkość, ale niską niezawodność. Ten tryb „zapisz i zapomnij” wydaje się szybkie, ponieważ polecenie jest zwracane przed wystąpieniem zapisu. Jeśli system ulegnie awarii przed zapisaniem danych na dysk, zostaną one utracone i staną się niespójne. Na szczęście 64-bitowa MongoDB ma włączone rejestrowanie.

Aby temu zapobiec, silniki pamięci masowej MMAPv1 i WiredTiger korzystają z rejestrowania, chociaż WiredTiger może odzyskać dane do ostatniego spójnego stanu. punkt kontrolny, jeśli rejestrowanie jest wyłączone.

Kronikowanie zapewnia spójny stan bazy danych po odzyskaniu i zachowanie wszystkich danych do czasu zapisania ich w dzienniku. Częstotliwość nagrań konfiguruje się za pomocą parametru commitIntervalMs.

Aby mieć pewność co do wpisów, upewnij się, że w pliku konfiguracyjnym jest włączone rejestrowanie (storage.journal.enabled), a częstotliwość nagrań odpowiada ilości informacji, na jaką utratę możesz sobie pozwolić.

Sortowanie bez indeksu

Podczas wyszukiwania i agregowania danych często zachodzi potrzeba sortowania danych. Miejmy nadzieję, że zostanie to zrobione na jednym z końcowych etapów, po przefiltrowaniu wyniku w celu zmniejszenia ilości sortowanych danych. I nawet w tym przypadku będziesz potrzebować do sortowania indeks. Można użyć indeksu pojedynczego lub złożonego.

Jeśli nie ma odpowiedniego indeksu, MongoDB obejdzie się bez niego. Całkowity rozmiar wszystkich dokumentów w formacie wynosi 32 MB operacje sortowania, a jeśli MongoDB osiągnie ten limit, zgłosi błąd lub zwróci pusty zestaw rekordów.

Szukaj bez obsługi indeksu

Zapytania wyszukiwania pełnią funkcję podobną do operacji JOIN w języku SQL. Aby działać najlepiej, potrzebują indeksu wartości klucza użytego jako klucz obcy. Nie jest to oczywiste, ponieważ użycie nie jest odzwierciedlone w explain(). Indeksy takie są dodatkiem do indeksu zapisanego explain(), z którego z kolei korzystają operatorzy rurociągów $match и $sort, gdy spotykają się na początku rurociągu. Indeksy mogą teraz obejmować dowolny etap potok agregacyjny.

Rezygnacja z korzystania z wielu aktualizacji

metoda db.collection.update() służy do zmiany części istniejącego dokumentu lub całego dokumentu, aż do całkowitej wymiany, w zależności od określonego przez Ciebie parametru update. Nie jest tak oczywiste, że nie przetworzy wszystkich dokumentów w kolekcji, chyba że ustawisz tę opcję multi zaktualizować wszystkie dokumenty spełniające kryteria żądania.

Nie zapomnij o znaczeniu kolejności kluczy w tabeli skrótów

W formacie JSON obiekt składa się z nieuporządkowanej kolekcji o rozmiarze zero lub większej liczbie par nazwa/wartość, gdzie nazwa jest ciągiem znaków, a wartość jest ciągiem znaków, liczbą, wartością logiczną, wartością null, obiektem lub tablicą.

Niestety BSON przy wyszukiwaniu kładzie duży nacisk na porządek. W MongoDB kolejność kluczy w obiektach wbudowanych sprawytj. { firstname: "Phil", surname: "factor" } - to nie to samo co { { surname: "factor", firstname: "Phil" }. Oznacza to, że musisz zachować kolejność par nazwa/wartość w swoich dokumentach, jeśli chcesz mieć pewność, że je znajdziesz.

Nie myl "Zero" и "nieokreślony"

Wartość "nieokreślony" zgodnie z. nigdy nie był ważny w JSON oficjalna norma JSON (ECMA-404 sekcja 5), ​​mimo że jest używany w JavaScript. Co więcej, w przypadku BSON jest to przestarzałe i zostało przekonwertowane na $null, co nie zawsze jest dobrym rozwiązaniem. Unikaj używania "nieokreślony" w MongoDB.

Używać $limit() без $sort()

Dość często, gdy programujesz w MongoDB, przydatne jest zobaczenie próbki wyniku, który zostanie zwrócony z zapytania lub agregacji. Do tego zadania będziesz potrzebować $limit(), ale nigdy nie powinien znajdować się w ostatecznym kodzie, chyba że użyjesz go wcześniej $sort. Ta mechanika jest konieczna, ponieważ w przeciwnym razie nie można zagwarantować kolejności wyników i nie będzie można wiarygodnie przeglądać danych. Na górze wyniku zobaczysz różne wpisy w zależności od sortowania. Aby zapytania i agregacje działały niezawodnie, muszą być deterministyczne, to znaczy dawać te same wyniki przy każdym wykonaniu. Kod zawierający $limit(), ale nie $sort, nie będzie deterministyczny i może w konsekwencji spowodować błędy trudne do wyśledzenia.

wniosek

Jedynym sposobem, aby rozczarować się MongoDB, jest bezpośrednie porównanie jej z innym typem bazy danych, np. DBMS, lub rozpoczęcie korzystania z niej w oparciu o pewne oczekiwania. To jakby porównać pomarańczę do widelca. Systemy baz danych służą konkretnym celom. Najlepiej po prostu samemu zrozumieć i docenić te różnice. Szkoda byłoby wywierać presję na programistów MongoDB, aby zeszli na ścieżkę DBMS. Chcę zobaczyć nowe i ciekawe sposoby rozwiązywania starych problemów, takie jak zapewnienie integralności danych i tworzenie systemów danych odpornych na awarie i złośliwe ataki.

Wprowadzenie przez MongoDB transakcyjności ACID w wersji 4.0 jest dobrym przykładem wprowadzenia ważnych ulepszeń w innowacyjny sposób. Transakcje obejmujące wiele dokumentów i wielu wyciągów są teraz niepodzielne. Istnieje także możliwość dostosowania czasu wymaganego do uzyskania blokad i zakończenia zablokowanych transakcji, a także zmiany poziomu izolacji.

14 rzeczy, które chciałbym wiedzieć, zanim zacząłem korzystać z MongoDB

Czytaj więcej:

Źródło: www.habr.com

Dodaj komentarz