14 vecí, ktoré by som chcel vedieť predtým, ako som začal s MongoDB

Preklad článku bol pripravený v predstihu pred začiatkom kurzu "Nerelačné databázy".

14 vecí, ktoré by som chcel vedieť predtým, ako som začal s MongoDB

prednosti:

  • Je mimoriadne dôležité vyvinúť schému, aj keď je v MongoDB voliteľná.
  • Podobne aj indexy musia zodpovedať vašej schéme a vzorom prístupu.
  • Vyhnite sa používaniu veľkých objektov a veľkých polí.
  • Buďte opatrní s nastaveniami MongoDB, najmä pokiaľ ide o bezpečnosť a spoľahlivosť.
  • MongoDB nemá optimalizátor dotazov, takže pri vykonávaní operácií dotazov musíte byť opatrní.

S databázami pracujem už veľmi dlho, no len nedávno som objavil MongoDB. Je pár vecí, ktoré by som chcel vedieť skôr, ako som s tým začal pracovať. Keď už má človek skúsenosti v určitej oblasti, má vopred vytvorené predstavy o tom, čo databázy sú a čo robia. V nádeji, že to ostatným uľahčím, uvádzam zoznam bežných chýb.

Vytvorenie servera MongoDB bez autentifikácie

Bohužiaľ, MongoDB je štandardne nainštalovaný bez autentifikácie. Pre pracovnú stanicu s lokálnym prístupom je tento postup normálny. Ale keďže MongoDB je systém pre viacerých používateľov, ktorý rád využíva veľké množstvo pamäte, bude lepšie, ak ho umiestnite na server s čo najväčším množstvom pamäte RAM, aj keď ho budete používať iba na vývoj. Inštalácia na server cez predvolený port môže byť problematická, najmä ak je možné v požiadavke spustiť akýkoľvek javascriptový kód (napr. $where ako nápad na injekcie).

Есть несколько методов аутентификации, но проще всего установить для пользователя ID/пароль. Воспользуйтесь этой идеей, пока будете думать над причудливой аутентификацией на основе LDAP. Pokiaľ ide o bezpečnosť, MongoDB by sa mal neustále aktualizovať a protokoly by sa mali vždy kontrolovať na neoprávnený prístup. Napríklad chcem vybrať iný port ako predvolený port.

Nezabudnite naviazať útočný povrch na MongoDB

Kontrolný zoznam zabezpečenia MongoDB obsahuje dobré tipy na zníženie rizika vniknutia do siete a úniku dát. Je ľahké to oprášiť a povedať, že vývojový server nepotrebuje vysokú úroveň zabezpečenia. Nie je to však také jednoduché a platí to pre všetky servery MongoDB. Najmä vtedy, ak neexistuje žiadny závažný dôvod na použitie mapReduce, group alebo $ kde, musíte zakázať používanie ľubovoľného kódu v JavaScripte zápisom do konfiguračného súboru javascriptEnabled:false. Keďže dátové súbory nie sú šifrované v štandardnom MongoDB, má zmysel spustiť MongoDB Vyhradený používateľ, ktorý má úplný prístup k súborom, s obmedzeným prístupom len k nemu a možnosťou používať vlastné ovládacie prvky operačného systému na prístup k súborom.

Chyba pri vývoji obvodu

MongoDB nepoužíva schému. To však neznamená, že schéma nie je potrebná. Ak chcete iba ukladať dokumenty bez akéhokoľvek konzistentného vzoru, ich ukladanie môže byť rýchle a jednoduché, ale ich neskoršie načítanie môže byť náročné. sakra ťažké.

Klasický článok"6 pravidiel pre palec pre návrh schémy MongoDB" Stojí za prečítanie a funkcie ako Prieskumník schém v nástroji tretej strany Studio 3T sa oplatí používať na pravidelné kontroly obvodov.

Nezabudnite na poradie triedenia

Zabudnutie poradia triedenia môže spôsobiť väčšiu frustráciu a stratu času ako akákoľvek iná nesprávna konfigurácia. Štandardne používa MongoBD binárne triedenie. Ale je nepravdepodobné, že by to bolo pre niekoho užitočné. Binárne druhy rozlišujúce veľké a malé písmená a prízvuk boli považované za zvláštne anachronizmy spolu s korálkami, kaftanmi a kučeravými fúzmi už v 80. rokoch minulého storočia. Teraz je ich použitie neodpustiteľné. V skutočnom živote je „motorka“ to isté ako „motocykel“. A „Británia“ a „Británia“ sú to isté miesto. Malé písmeno je jednoducho ekvivalent veľkého písmena k veľkému písmenu. A nenechajte ma začať s triedením diakritiky. Pri vytváraní databázy v MongoDB použite triedenie bez zvýraznenia a Registrovať, ktoré zodpovedajú jazyku a systémová užívateľská kultúra. To výrazne uľahčí vyhľadávanie údajov reťazca.

Vytvárajte zbierky s veľkými dokumentmi

MongoDB s radosťou hosťuje veľké dokumenty až do 16 MB v zbierkach a GridFS Navrhnuté pre veľké dokumenty väčšie ako 16 MB. Ale práve preto, že sa tam dajú umiestniť veľké dokumenty, ich ukladanie tam nie je dobrý nápad. MongoDB bude fungovať najlepšie, ak uložíte jednotlivé dokumenty s veľkosťou niekoľkých kilobajtov a budete s nimi zaobchádzať skôr ako s riadkami v širokej tabuľke SQL. Veľké dokumenty budú zdrojom problémov produktivitu.

Vytváranie dokumentov s veľkými poľami

Dokumenty môžu obsahovať polia. Najlepšie je, ak je počet prvkov v poli ďaleko od štvormiestneho čísla. Ak sa prvky pridávajú do poľa často, prerastie dokument, ktorý ho obsahuje, a bude potrebné sťahovať, čo znamená, že to bude potrebné aktualizovať aj indexy. Pri opätovnom indexovaní dokumentu s veľkým poľom sa indexy často prepíšu, pretože existuje a záznam, ktorý ukladá jeho index. K tomuto opätovnému indexovaniu dochádza aj pri vložení alebo odstránení dokumentu.

MongoDB má niečo tzv "faktor plnenia", ktorá poskytuje priestor pre rast dokumentov, aby sa tento problém minimalizoval.
Možno si myslíte, že sa zaobídete bez indexovania poľa. Bohužiaľ, nedostatok indexov môže spôsobiť ďalšie problémy. Keďže dokumenty sa skenujú od začiatku do konca, vyhľadávanie prvkov na konci poľa bude trvať dlhšie a väčšina operácií spojených s takýmto dokumentom bude pomaly.

Nezabudnite, že na poradí fáz v agregácii záleží

V databázovom systéme s optimalizátorom dotazov sú dotazy, ktoré píšete, vysvetleniami toho, čo chcete získať, nie ako to získať. Tento mechanizmus funguje analogicky s objednávaním v reštaurácii: zvyčajne si jednoducho objednáte jedlo a kuchárovi nedávate podrobné pokyny.

V MongoDB dávate pokyn kuchárovi. Musíte sa napríklad uistiť, že údaje prechádzajú reduce čo najskôr v potrubí pomocou $match и $projecta triedenie sa uskutoční až po reducea že vyhľadávanie prebieha presne v požadovanom poradí. Mať optimalizátor dotazov, ktorý eliminuje zbytočnú prácu, optimálne sekvenuje kroky a vyberá typy spojení, vás môže pokaziť. S MongoDB máte väčšiu kontrolu za cenu pohodlia.

Nástroje ako Štúdio 3T zjednoduší konštrukciu agregačných dopytov v MongoDB. Funkcia agregačného editora vám umožňuje aplikovať príkazy potrubia po jednej fáze a kontrolovať vstupné a výstupné údaje v každej fáze, aby sa zjednodušilo ladenie.

Používanie rýchleho nahrávania

Nikdy nenastavujte možnosti zápisu MongoDB tak, aby mali vysokú rýchlosť, ale nízku spoľahlivosť. Tento režim "zapíš a zabudni" sa zdá byť rýchly, pretože príkaz sa vráti skôr, ako dôjde k zápisu. Ak systém zlyhá pred zápisom údajov na disk, stratí sa a skončí v nekonzistentnom stave. Našťastie 64-bitový MongoDB má povolené protokolovanie.

Úložné motory MMAPv1 a WiredTiger používajú protokolovanie, aby tomu zabránili, hoci WiredTiger sa dokáže obnoviť do posledného konzistentného kontrolný bod, ak je protokolovanie zakázané.

Žurnálovanie zaisťuje, že databáza je po obnove v konzistentnom stave a uchováva všetky údaje, kým nie sú zapísané do žurnálu. Frekvencia nahrávania sa konfiguruje pomocou parametra commitIntervalMs.

Aby ste si boli istí položkami, skontrolujte, či je v konfiguračnom súbore povolené protokolovanie (storage.journal.enabled)a frekvencia nahrávania zodpovedá množstvu informácií, ktoré si môžete dovoliť stratiť.

Triedenie bez indexu

Pri vyhľadávaní a agregovaní často vzniká potreba triediť dáta. Dúfajme, že sa tak stane v jednej z posledných fáz, po filtrovaní výsledku, aby sa znížilo množstvo triedených údajov. A aj v tomto prípade budete na triedenie potrebovať index. Môžete použiť jednoduchý alebo zložený index.

Ak neexistuje vhodný index, MongoDB sa bez neho zaobíde. Celková veľkosť všetkých dokumentov v pamäti je obmedzená na 32 MB triediace operáciea ak MongoDB dosiahne tento limit, potom buď vyhodí chybu, alebo sa vráti prázdna sada záznamov.

Vyhľadávanie bez podpory indexu

Vyhľadávacie dotazy vykonávajú funkciu podobnú operácii JOIN v SQL. Aby fungovali čo najlepšie, potrebujú index hodnoty kľúča použitého ako cudzí kľúč. To nie je zrejmé, pretože použitie sa neodráža v explain(). Takéto indexy sú navyše k indexu zapísané v explain(), ktorý zase využívajú prevádzkovatelia potrubí $match и $sort, keď sa stretnú na začiatku potrubia. Indexy teraz môžu pokrývať akúkoľvek fázu agregačný kanál.

Zrušenie používania viacerých aktualizácií

metóda db.collection.update() slúži na zmenu časti existujúceho dokladu alebo celého dokladu až po úplnú výmenu v závislosti od zadaného parametra update. Čo nie je také zrejmé je, že nespracuje všetky dokumenty v kolekcii, pokiaľ túto možnosť nenastavíte multi aktualizovať všetky dokumenty, ktoré spĺňajú kritériá žiadosti.

Nezabudnite na dôležitosť poradia kľúčov v hašovacej tabuľke

V JSON objekt pozostáva z neusporiadanej kolekcie veľkosti nula alebo viacerých párov názov/hodnota, kde názov je reťazec a hodnota je reťazec, číslo, boolean, null, objekt alebo pole.

Bohužiaľ, BSON kladie veľký dôraz na poriadok pri hľadaní. V MongoDB poradie kľúčov v rámci vstavaných objektov záležitosti, t.j. { firstname: "Phil", surname: "factor" } - to nie je to isté ako { { surname: "factor", firstname: "Phil" }. To znamená, že ak chcete mať istotu pri ich nájdení, musíte si v dokumentoch uložiť poradie párov názov/hodnota.

Nenechajte sa zmiasť "Nulový" и "nedefinované"

Hodnota "nedefinované" nebol nikdy platný v JSON, podľa oficiálny štandard JSON (ECMA-404, sekcia 5), ​​aj keď sa používa v JavaScripte. Navyše pre BSON je zastaraný a je prevedený na $null, čo nie je vždy dobré riešenie. Vyhnite sa používaniu "nedefinované" v MongoDB.

Použitie $limit() bez $sort()

Pomerne často, keď vyvíjate v MongoDB, je užitočné vidieť len vzorku výsledku, ktorý sa vráti z dotazu alebo agregácie. Pre túto úlohu budete potrebovať $limit(), ale nikdy by nemal byť v konečnom kóde, pokiaľ ho predtým nepoužijete $sort. Táto mechanika je potrebná, pretože inak nemôžete zaručiť poradie výsledku a nebudete môcť spoľahlivo zobraziť údaje. V hornej časti výsledku sa zobrazia rôzne položky v závislosti od zoradenia. Aby dotazy a agregácie fungovali spoľahlivo, musia byť deterministické, to znamená, že pri každom vykonaní musia produkovať rovnaké výsledky. Kód, ktorý obsahuje $limit(), ale nie $sort, nebude deterministický a môže následne spôsobiť chyby, ktoré bude ťažké vystopovať.

Záver

Jediný spôsob, ako byť sklamaný z MongoDB, je porovnať ho priamo s iným typom databázy, ako je DBMS, alebo ju začať používať na základe určitých očakávaní. Je to ako porovnávať pomaranč s vidličkou. Databázové systémy slúžia na špecifické účely. Najlepšie je jednoducho pochopiť a oceniť tieto rozdiely pre seba. Bola by škoda tlačiť na vývojárov MongoDB cez cestu, ktorá ich prinútila ísť cestou DBMS. Chcem vidieť nové a zaujímavé spôsoby riešenia starých problémov, ako je zabezpečenie integrity údajov a vytváranie systémov údajov, ktoré sú odolné voči zlyhaniu a škodlivým útokom.

Zavedenie transakcie ACID od MongoDB vo verzii 4.0 je dobrým príkladom zavádzania dôležitých vylepšení inovatívnym spôsobom. Transakcie s viacerými dokumentmi a viacerými výpismi sú teraz atomické. Je tiež možné upraviť čas potrebný na získanie zámkov a ukončenie zaseknutých transakcií, ako aj zmeniť úroveň izolácie.

14 vecí, ktoré by som chcel vedieť predtým, ako som začal s MongoDB

Čítaj viac:

Zdroj: hab.com

Pridať komentár