14 dingen die ik wou dat ik wist voordat ik aan de slag ging met MongoDB

De vertaling van het artikel is gemaakt aan de vooravond van de start van de cursus "Niet-relationele databases".

14 dingen die ik wou dat ik wist voordat ik aan de slag ging met MongoDB

Hoogtepunten:

  • Het is uiterst belangrijk om een ​​schema te ontwikkelen, ook al is dit optioneel in MongoDB.
  • Op dezelfde manier moeten indexen overeenkomen met uw schema en toegangspatronen.
  • Vermijd het gebruik van grote objecten en grote arrays.
  • Wees voorzichtig met MongoDB-instellingen, vooral als het gaat om beveiliging en betrouwbaarheid.
  • MongoDB beschikt niet over een query-optimalisatieprogramma, dus u moet voorzichtig zijn bij het uitvoeren van querybewerkingen.

Ik werk al heel lang met databases, maar heb MongoDB pas onlangs ontdekt. Er zijn een paar dingen die ik wou dat ik wist voordat ik ermee begon te werken. Wanneer iemand al ervaring heeft op een bepaald gebied, heeft hij vooroordelen over wat databases zijn en wat ze doen. In de hoop het voor anderen gemakkelijker te maken het te begrijpen, presenteer ik een lijst met veelgemaakte fouten.

Een MongoDB-server maken zonder authenticatie

Helaas wordt MongoDB standaard zonder authenticatie geïnstalleerd. Voor een lokaal toegankelijk werkstation is deze praktijk normaal. Maar aangezien MongoDB een systeem voor meerdere gebruikers is dat graag grote hoeveelheden geheugen gebruikt, is het beter als u het op een server met zoveel mogelijk RAM plaatst, zelfs als u het alleen voor ontwikkeling gaat gebruiken. Installeren op de server via de standaardpoort kan problematisch zijn, vooral als er javascript-code kan worden uitgevoerd in het verzoek (bijvoorbeeld $where als idee voor injectie).

Er zijn verschillende authenticatiemethoden, maar de eenvoudigste is het instellen van een gebruikers-ID/wachtwoord. Gebruik dit idee terwijl u nadenkt over mooie authenticatie op basis van LDAP. Als het om beveiliging gaat, moet MongoDB voortdurend worden bijgewerkt en moeten logboeken altijd worden gecontroleerd op ongeautoriseerde toegang. Ik selecteer bijvoorbeeld graag een andere poort als standaardpoort.

Vergeet niet het aanvalsoppervlak aan MongoDB te binden

MongoDB-beveiligingschecklist bevat goede tips om het risico op netwerkinbraak en datalekken te verminderen. Het is gemakkelijk om het van tafel te vegen en te zeggen dat een ontwikkelserver geen hoog beveiligingsniveau nodig heeft. Zo eenvoudig is het echter niet en dit geldt voor alle MongoDB-servers. In het bijzonder als er geen dwingende reden is om het te gebruiken mapReduce, group of $waar, moet u het gebruik van willekeurige code in JavaScript uitschakelen door in het configuratiebestand te schrijven javascriptEnabled:false. Omdat gegevensbestanden niet worden gecodeerd in standaard MongoDB, is het logisch om MongoDB mee uit te voeren Toegewijde gebruiker, dat volledige toegang heeft tot bestanden, met beperkte toegang daartoe en de mogelijkheid om de eigen bestandstoegangscontroles van het besturingssysteem te gebruiken.

Fout bij het ontwikkelen van het circuit

MongoDB maakt geen gebruik van een schema. Maar dit betekent niet dat het plan niet nodig is. Als u alleen documenten wilt opslaan zonder een consistent patroon, kan het opslaan ervan snel en eenvoudig zijn, maar het later terugvinden ervan kan moeilijk zijn. verdomd moeilijk.

Klassiek artikel "6 vuistregels voor MongoDB-schemaontwerp" Het is het lezen waard, en functies zoals Schemaverkenner in de tool Studio 3T van derden is het de moeite waard om te gebruiken voor regelmatige controles van circuits.

Vergeet de sorteervolgorde niet

Het vergeten van de sorteervolgorde kan meer frustratie veroorzaken en meer tijd verspillen dan elke andere onjuiste configuratie. Standaard gebruikt MongoBD binaire sortering. Maar het is onwaarschijnlijk dat het voor iemand nuttig zal zijn. Hoofdlettergevoelige, accentgevoelige, binaire soorten werden in de jaren 80 van de vorige eeuw, samen met kralen, kaftans en gekrulde snorren, beschouwd als merkwaardige anachronismen. Nu is het gebruik ervan onvergeeflijk. In het echte leven is 'motorfiets' hetzelfde als 'motorfiets'. En ‘Groot-Brittannië’ en ‘Groot-Brittannië’ zijn dezelfde plaats. Een kleine letter is eenvoudigweg het hoofdletterequivalent van een hoofdletter. En laat me niet beginnen over het sorteren van diakritische tekens. Gebruik bij het maken van een database in MongoDB accent-ongevoelige sortering en register, die overeenkomen met de taal en systeemgebruikerscultuur. Dit maakt het zoeken door stringgegevens veel eenvoudiger.

Creëer collecties met grote documenten

MongoDB host graag grote documenten tot 16 MB in collecties, en GridFS Ontworpen voor grote documenten groter dan 16 MB. Maar alleen omdat daar grote documenten kunnen worden geplaatst, is het geen goed idee om ze daar op te slaan. MongoDB werkt het beste als u individuele documenten opslaat die een paar kilobytes groot zijn, en ze meer als rijen in een brede SQL-tabel behandelt. Grote documenten zullen een bron van problemen zijn productiviteit.

Documenten maken met grote arrays

Documenten kunnen arrays bevatten. Het is het beste als het aantal elementen in de array verre van vier cijfers is. Als er regelmatig elementen aan een array worden toegevoegd, zal deze het document dat de array bevat ontgroeien en dat zal ook nodig zijn beweging, wat betekent dat het nodig zal zijn indexen ook bijwerken. Bij het opnieuw indexeren van een document met een grote array worden de indexen vaak overschreven, omdat er een record, waarin de index wordt opgeslagen. Deze herindexering vindt ook plaats wanneer een document wordt ingevoegd of verwijderd.

MongoDB heeft iets genaamd "vulfactor", wat ruimte biedt voor de groei van documenten om dit probleem te minimaliseren.
Je zou kunnen denken dat je het zonder array-indexering kunt doen. Helaas kan het ontbreken van indexen ertoe leiden dat u andere problemen ondervindt. Omdat documenten van begin tot eind worden gescand, zal het zoeken naar elementen aan het einde van de array langer duren, en zullen de meeste bewerkingen die aan een dergelijk document zijn gekoppeld, langer duren. traag.

Vergeet niet dat de volgorde van de fasen in een aggregatie van belang is

In een databasesysteem met een query-optimalisatiefunctie zijn de query's die u schrijft een verklaring van wat u wilt verkrijgen, en niet hoe u dit kunt verkrijgen. Dit mechanisme werkt analoog aan het bestellen in een restaurant: meestal bestel je gewoon een gerecht en geef je geen gedetailleerde instructies aan de kok.

In MongoDB instrueer je de kok. U moet er bijvoorbeeld voor zorgen dat de gegevens worden doorgegeven reduce zo vroeg mogelijk in de pijplijn gebruiken $match и $project, en sorteren vindt pas daarna plaats reduceen dat de zoekopdracht precies in de gewenste volgorde plaatsvindt. Het hebben van een query-optimalisatieprogramma dat onnodig werk elimineert, stappen optimaal opeenvolgt en join-typen selecteert, kan u verwennen. Met MongoDB heeft u meer controle, maar dit gaat ten koste van uw gemak.

Gereedschappen zoals Studio 3T zal de constructie van aggregatiequery's vereenvoudigen MongoDB. Met de functie Aggregatie-editor kunt u pijplijninstructies stap voor stap toepassen en invoer- en uitvoergegevens in elke fase inspecteren om het opsporen van fouten te vereenvoudigen.

Snelle opname gebruiken

Stel MongoDB-schrijfopties nooit in op hoge snelheid maar lage betrouwbaarheid. Deze modus "bestand-en-vergeten" lijkt snel omdat de opdracht wordt geretourneerd voordat het schrijven plaatsvindt. Als het systeem crasht voordat de gegevens naar de schijf zijn geschreven, gaan deze verloren en komen ze in een inconsistente toestand terecht. Gelukkig heeft 64-bit MongoDB logboekregistratie ingeschakeld.

De MMAPv1- en WiredTiger-opslagengines gebruiken logboekregistratie om dit te voorkomen, hoewel WiredTiger kan herstellen tot de laatste consistente controle punt, als loggen is uitgeschakeld.

Journaling zorgt ervoor dat de database na herstel in een consistente staat verkeert en dat alle gegevens bewaard blijven totdat deze naar het logboek worden geschreven. De frequentie van de opnames wordt geconfigureerd met behulp van de parameter commitIntervalMs.

Om zeker te zijn van de gegevens, zorgt u ervoor dat logboekregistratie is ingeschakeld in het configuratiebestand (storage.journal.enabled)en de frequentie van de opnames komt overeen met de hoeveelheid informatie die u zich kunt veroorloven te verliezen.

Sorteren zonder index

Bij het zoeken en aggregeren is het vaak nodig om gegevens te sorteren. Laten we hopen dat dit in een van de laatste fasen gebeurt, na het filteren van het resultaat om de hoeveelheid gegevens die wordt gesorteerd te verminderen. En zelfs in dit geval heb je voor het sorteren nodig inhoudsopgave. U kunt een enkele of samengestelde index gebruiken.

Als er geen geschikte index is, zal MongoDB het zonder doen. Er geldt een geheugenlimiet van 32 MB voor de totale grootte van alle documenten in sorteerwerkzaamheden, en als MongoDB deze limiet bereikt, zal het een fout genereren of terugkeren lege recordset.

Zoeken zonder indexondersteuning

Zoekopdrachten voeren een functie uit die vergelijkbaar is met de JOIN-bewerking in SQL. Om het beste te kunnen werken, hebben ze de index nodig van de waarde van de sleutel die als externe sleutel wordt gebruikt. Dit is niet vanzelfsprekend omdat het gebruik er niet in terugkomt explain(). Dergelijke indices vormen een aanvulling op de index die erin is geschreven explain(), dat op zijn beurt wordt gebruikt door pijpleidingbeheerders $match и $sort, wanneer ze elkaar ontmoeten aan het begin van de pijplijn. Indexen kunnen nu elk stadium bestrijken aggregatiepijplijn.

Afmelden voor het gebruik van multi-updates

werkwijze db.collection.update() gebruikt om een ​​deel van een bestaand document of het hele document te wijzigen, tot een volledige vervanging, afhankelijk van de parameter die u opgeeft update. Wat niet zo voor de hand liggend is, is dat niet alle documenten in de collectie worden verwerkt, tenzij u de optie instelt multi om alle documenten bij te werken die aan de aanvraagcriteria voldoen.

Vergeet het belang van de volgorde van de sleutels in een hashtabel niet

In JSON bestaat een object uit een ongeordende verzameling van grootte nul of meer naam/waarde-paren, waarbij naam een ​​tekenreeks is en waarde een tekenreeks, getal, boolean, null, object of array.

Helaas legt BSON bij het zoeken veel nadruk op volgorde. In MongoDB de volgorde van sleutels binnen ingebouwde objecten heeft de betekenis, Ie { firstname: "Phil", surname: "factor" } - dit is niet hetzelfde als { { surname: "factor", firstname: "Phil" }. Dat wil zeggen dat u de volgorde van naam/waarde-paren in uw documenten moet opslaan als u er zeker van wilt zijn dat u ze kunt vinden.

Verwar niet "Nul" и "ongedefinieerd"

Waarde "ongedefinieerd" was volgens. nooit geldig in JSON officiële standaard JSON (ECMA-404 Sectie 5), ook al wordt het gebruikt in JavaScript. Bovendien is het voor BSON verouderd en wordt het omgezet naar $null, wat niet altijd een goede oplossing is. Vermijd te gebruiken "ongedefinieerd" in MongoDB.

Gebruiken $limit() без $sort()

Als u in MongoDB ontwikkelt, is het vaak handig om slechts een voorbeeld te zien van het resultaat dat wordt geretourneerd uit een query of aggregatie. Voor deze taak heb je nodig $limit(), maar het mag nooit in de definitieve code voorkomen, tenzij u het eerder gebruikt $sort. Deze monteur is nodig omdat je anders de volgorde van de uitslag niet kunt garanderen en de gegevens niet betrouwbaar kunt inzien. Bovenaan het resultaat krijgt u verschillende vermeldingen, afhankelijk van de sortering. Om betrouwbaar te kunnen werken, moeten query's en aggregaties deterministisch zijn, dat wil zeggen dat ze elke keer dat ze worden uitgevoerd dezelfde resultaten opleveren. Code die bevat $limit(), maar nee $sort, zal niet deterministisch zijn en kan vervolgens fouten veroorzaken die moeilijk op te sporen zijn.

Conclusie

De enige manier om teleurgesteld te worden over MongoDB is door het rechtstreeks te vergelijken met een ander type database, zoals een DBMS, of door het te gaan gebruiken op basis van bepaalde verwachtingen. Het is alsof je een sinaasappel met een vork vergelijkt. Databasesystemen dienen specifieke doeleinden. Het is het beste om deze verschillen eenvoudig zelf te begrijpen en te waarderen. Het zou zonde zijn om de MongoDB-ontwikkelaars onder druk te zetten over een pad dat hen op het DBMS-pad dwong. Ik wil nieuwe en interessante manieren zien om oude problemen op te lossen, zoals het waarborgen van data-integriteit en het creëren van datasystemen die bestand zijn tegen mislukkingen en kwaadaardige aanvallen.

MongoDB's introductie van ACID transactionaliteit in versie 4.0 is een goed voorbeeld van het op een innovatieve manier introduceren van belangrijke verbeteringen. Transacties met meerdere documenten en meerdere afschriften zijn nu atomair. Het is ook mogelijk om de tijd aan te passen die nodig is om vergrendelingen te verwerven en vastgelopen transacties te beëindigen, en om het isolatieniveau te wijzigen.

14 dingen die ik wou dat ik wist voordat ik aan de slag ging met MongoDB

Lees verder:

Bron: www.habr.com

Voeg een reactie