14 lietas, ko es vēlos zināt pirms darba sākÅ”anas ar MongoDB

Raksta tulkojums tika sagatavots kursu sākuma priekŔvakarā "Nerelāciju datu bāzes".

14 lietas, ko es vēlos zināt pirms darba sākÅ”anas ar MongoDB

Uzsver:

  • Ir ārkārtÄ«gi svarÄ«gi izstrādāt shēmu, lai gan MongoDB tā nav obligāta.
  • Tāpat indeksiem ir jāatbilst jÅ«su shēmai un piekļuves modeļiem.
  • Izvairieties no lielu objektu un lielu masÄ«vu izmantoÅ”anas.
  • Esiet piesardzÄ«gs ar MongoDB iestatÄ«jumiem, Ä«paÅ”i, ja runa ir par droŔību un uzticamÄ«bu.
  • MongoDB nav vaicājumu optimizētāja, tāpēc jums jābÅ«t uzmanÄ«giem, veicot vaicājuma darbÄ«bas.

Es ļoti ilgu laiku strādāju ar datu bāzēm, bet tikai nesen atklāju MongoDB. Ir dažas lietas, ko vēlos zināt, pirms sāku ar to strādāt. Kad cilvēkam jau ir pieredze noteiktā jomā, viņam ir priekÅ”stats par to, kas ir datu bāzes un ar ko viņi nodarbojas. Cerot, ka citiem bÅ«tu vieglāk saprast, es piedāvāju biežāk pieļauto kļūdu sarakstu.

MongoDB servera izveide bez autentifikācijas

Diemžēl MongoDB pēc noklusējuma ir instalēts bez autentifikācijas. Darbstacijām, kurām piekļūst lokāli, Ŕī prakse ir normāla. Bet, tā kā MongoDB ir daudzlietotāju sistēma, kurai patÄ«k izmantot lielus atmiņas apjomus, bÅ«s labāk, ja ievietosit to serverÄ« ar pēc iespējas vairāk RAM, pat ja to izmantosit tikai izstrādei. InstalÄ“Å”ana serverÄ«, izmantojot noklusējuma portu, var bÅ«t problemātiska, it Ä«paÅ”i, ja pieprasÄ«jumā var izpildÄ«t jebkuru javascript kodu (piemēram, $where kā ideja priekÅ” injekcijas).

Ir vairākas autentifikācijas metodes, taču vienkārŔākais ir iestatÄ«t lietotāja ID/paroli. Izmantojiet Å”o ideju, domājot par izdomātu autentifikāciju, kuras pamatā ir LDAP. Runājot par droŔību, MongoDB ir pastāvÄ«gi jāatjaunina, un žurnāli vienmēr ir jāpārbauda, ā€‹ā€‹ā€‹ā€‹vai nav nesankcionētas piekļuves. Piemēram, man patÄ«k kā noklusējuma portu izvēlēties citu portu.

Neaizmirstiet saistīt savu uzbrukuma virsmu ar MongoDB

MongoDB droŔības kontrolsaraksts satur labus padomus, kā samazināt tÄ«kla ielauÅ”anās un datu noplÅ«des risku. Ir viegli to novērst un teikt, ka izstrādes serverim nav nepiecieÅ”ams augsts droŔības lÄ«menis. Tomēr tas nav tik vienkārÅ”i, un tas attiecas uz visiem MongoDB serveriem. Jo Ä«paÅ”i, ja nav pārliecinoÅ”a iemesla lietoÅ”anai mapReduce, group vai $kur, jums ir jāatspējo patvaļīga koda izmantoÅ”ana JavaScript, ierakstot konfigurācijas failā javascriptEnabled:false. Tā kā datu faili standarta MongoDB nav Å”ifrēti, ir lietderÄ«gi palaist MongoDB ar ÄŖpaÅ”s lietotājs, kurai ir pilna piekļuve failiem, ar ierobežotu piekļuvi tikai tai un iespēju izmantot paÅ”as operētājsistēmas failu piekļuves vadÄ«klas.

Izstrādājot ķēdi, radās kļūda

MongoDB neizmanto shēmu. Bet tas nenozÄ«mē, ka shēma nav vajadzÄ«ga. Ja vēlaties vienkārÅ”i saglabāt dokumentus bez konsekventa parauga, to saglabāŔana var bÅ«t ātra un vienkārÅ”a, taču vēlāk to izgÅ«Å”ana var bÅ«t sarežģīta. sasodÄ«ti grÅ«ti.

Klasisks raksts "6 MongoDB shēmas izstrādes noteikumi" To ir vērts izlasÄ«t, un tajā ir lÄ«dzÄ«gas funkcijas Shēmas pārlÅ«ks treŔās puses rÄ«kā Studio 3T ir vērts to izmantot regulārām ķēžu pārbaudēm.

Neaizmirstiet ŔķiroŔanas secību

Å Ä·iroÅ”anas secÄ«bas aizmirstÄ«ba var izraisÄ«t vairāk neapmierinātÄ«bas un tērēt vairāk laika nekā jebkura cita nepareiza konfigurācija. Pēc noklusējuma MongoBD izmanto binārā kārtoÅ”ana. Bet diez vai tas kādam noderēs. PagājuŔā gadsimta 80. gados reÄ£istrjutÄ«gi, uzsvaru jutÄ«gi, binārie veidi tika uzskatÄ«ti par dÄ«vainiem anahronismiem kopā ar krellēm, kaftāniem un sprogainām Å«sām. Tagad to izmantoÅ”ana ir nepiedodama. Reālajā dzÄ«vē "motocikls" ir tas pats, kas "motocikls". Un ā€œLielbritānijaā€ un ā€œLielbritānijaā€ ir viena un tā pati vieta. Mazais burts ir vienkārÅ”i lielā burta ekvivalents ar lielo burtu. Un nelieciet man sākt kārtot diakritiskās zÄ«mes. Veidojot datu bāzi MongoDB, izmantojiet pret akcentiem nejutÄ«gu salÄ«dzināŔanu un reÄ£istrēties, kas atbilst valodai un sistēmas lietotāju kultÅ«ra. Tas ievērojami atvieglos meklÄ“Å”anu virkņu datos.

Izveidojiet kolekcijas ar lieliem dokumentiem

MongoDB labprāt mitinās lielus dokumentus lÄ«dz 16 MB kolekcijās un GridFS Paredzēts lieliem dokumentiem, kas lielāki par 16 MB. Bet tikai tāpēc, ka tur var ievietot lielus dokumentus, to glabāŔana tur nav laba ideja. MongoDB darbosies vislabāk, ja glabāsit atseviŔķus dažus kilobaitus lielus dokumentus, uzskatot tos vairāk kā rindas plaŔā SQL tabulā. Lieli dokumenti radÄ«s problēmas ar produktivitāte.

Dokumentu veidoŔana ar lieliem masīviem

Dokumenti var saturēt masÄ«vus. Vislabāk, ja elementu skaits masÄ«vā ir tālu no četrciparu skaitļa. Ja elementi masÄ«vam tiek pievienoti bieži, tas pārsniegs dokumentu, kurā tas ir, un tam bÅ«s jābÅ«t pārvietot, kas nozÄ«mē, ka tas bÅ«s nepiecieÅ”ams atjaunināt arÄ« indeksus. Pārindeksējot dokumentu ar lielu masÄ«vu, indeksi bieži tiek pārrakstÄ«ti, jo pastāv ieraksts, kas saglabā savu indeksu. Å Ä« atkārtota indeksÄ“Å”ana notiek arÄ« tad, kad tiek ievietots vai dzēsts dokuments.

MongoDB ir kaut kas nosaukts "aizpildÄ«juma koeficients", kas nodroÅ”ina iespēju dokumentiem paplaÅ”ināties, lai mazinātu Å”o problēmu.
Varētu domāt, ka var iztikt bez masÄ«vu indeksÄ“Å”anas. Diemžēl indeksu trÅ«kums var radÄ«t citas problēmas. Tā kā dokumenti tiek skenēti no sākuma lÄ«dz beigām, elementu meklÄ“Å”ana masÄ«va beigās prasÄ«s ilgāku laiku, un lielākā daļa ar Ŕādu dokumentu saistÄ«to darbÄ«bu tiks lēns.

Neaizmirstiet, ka summēŔanas posmu secībai ir nozīme

Datu bāzes sistēmā ar vaicājumu optimizētāju jÅ«su rakstÄ«tie vaicājumi ir paskaidrojumi par to, ko vēlaties iegÅ«t, nevis kā to iegÅ«t. Å is mehānisms darbojas pēc analoÄ£ijas ar pasÅ«tÄ«Å”anu restorānā: parasti jÅ«s vienkārÅ”i pasÅ«tāt ēdienu un nesniedzat pavāram detalizētus norādÄ«jumus.

Vietnē MongoDB jÅ«s instruējat pavāru. Piemēram, jums ir jāpārliecinās, ka dati tiek nosÅ«tÄ«ti cauri reduce pēc iespējas agrāk, izmantojot cauruļvadu $match Šø $project, un ŔķiroÅ”ana notiek tikai pēc tam reduce, un meklÄ“Å”ana notiek tieÅ”i vēlamajā secÄ«bā. Vaicājumu optimizētājs, kas novērÅ” nevajadzÄ«gu darbu, optimāli sakārto darbÄ«bas un atlasa savienojuma veidus, var jÅ«s sabojāt. Izmantojot MongoDB, jums ir lielāka kontrole uz ērtÄ«bas rēķina.

Tādi rÄ«ki kā Studija 3T vienkārÅ”os apkopoÅ”anas vaicājumu izveidi MongoDB. ApkopoÅ”anas redaktora lÄ«dzeklis ļauj lietot konveijera paziņojumus pa vienam posmam un katrā posmā pārbaudÄ«t ievades un izvades datus, lai vienkārÅ”otu atkļūdoÅ”anu.

Ātrās ierakstÄ«Å”anas izmantoÅ”ana

Nekad neiestatiet MongoDB rakstÄ«Å”anas opcijām lielu ātrumu, bet zemu uzticamÄ«bu. Å is režīms "fails un aizmirst" Ŕķiet ātri, jo komanda tiek atgriezta pirms rakstÄ«Å”anas. Ja sistēma avarē pirms datu ierakstÄ«Å”anas diskā, tā tiks zaudēta un nonāks nekonsekventā stāvoklÄ«. Par laimi, 64 bitu MongoDB ir iespējota reÄ£istrÄ“Å”ana.

MMAPv1 un WiredTiger krātuves dzinēji izmanto reÄ£istrÄ“Å”anu, lai to novērstu, lai gan WiredTiger var atjaunoties lÄ«dz pēdējai konsekventai kontroles punkts, ja reÄ£istrÄ“Å”ana ir atspējota.

Žurnālu veidoÅ”ana nodroÅ”ina, ka datubāze pēc atkopÅ”anas ir konsekventā stāvoklÄ« un saglabā visus datus, lÄ«dz tie tiek ierakstÄ«ti žurnālā. Ierakstu biežums tiek konfigurēts, izmantojot parametru commitIntervalMs.

Lai pārliecinātos par ierakstiem, pārliecinieties, vai konfigurācijas failā ir iespējota reÄ£istrÄ“Å”ana (storage.journal.enabled), un ierakstu biežums atbilst informācijas apjomam, ko varat atļauties zaudēt.

KārtoŔana bez indeksa

Meklējot un apkopojot, bieži vien ir nepiecieÅ”ams kārtot datus. Cerēsim, ka tas tiks izdarÄ«ts kādā no pēdējiem posmiem pēc rezultāta filtrÄ“Å”anas, lai samazinātu kārtojamo datu apjomu. Un pat Å”ajā gadÄ«jumā ŔķiroÅ”anai jums bÅ«s nepiecieÅ”ams indekss. Varat izmantot vienu vai saliktu indeksu.

Ja nav piemērota indeksa, MongoDB iztiks bez tā. Visu ievietoto dokumentu kopējā izmēra atmiņas ierobežojums ir 32 MB ŔķiroÅ”anas operācijas, un, ja MongoDB sasniegs Å”o ierobežojumu, tas vai nu radÄ«s kļūdu, vai atgriezÄ«sies tukÅ”a ierakstu kopa.

Meklēt bez indeksa atbalsta

MeklÄ“Å”anas vaicājumi veic funkciju, kas ir lÄ«dzÄ«ga darbÄ«bai JOIN SQL. Lai tie darbotos vislabāk, tiem ir nepiecieÅ”ams kā ārējās atslēgas izmantotās atslēgas vērtÄ«bas indekss. Tas nav acÄ«mredzams, jo izmantoÅ”ana nav atspoguļota explain(). Šādi indeksi ir papildus ierakstÄ«tajam indeksam explain(), ko savukārt izmanto cauruļvadu operatori $match Šø $sort, kad tie satiekas cauruļvada sākumā. Tagad indeksi var aptvert jebkuru posmu agregācijas cauruļvads.

AtteikŔanās no vairāku atjauninājumu izmantoŔanas

Metode db.collection.update() izmanto, lai mainÄ«tu esoŔā dokumenta daļu vai visu dokumentu, lÄ«dz pat pilnÄ«gai nomaiņai atkarÄ«bā no jÅ«su norādÄ«tā parametra update. Nav tik acÄ«mredzams, ka tas neapstrādās visus kolekcijas dokumentus, ja vien neiestatÄ«sit Å”o opciju multi atjaunināt visus dokumentus, kas atbilst pieprasÄ«juma kritērijiem.

Neaizmirstiet, cik svarīga ir atslēgu secība hash tabulā

Sistēmā JSON objekts sastāv no nesakārtotas kolekcijas ar nulles lielumu vai vairākiem nosaukuma/vērtības pāriem, kur nosaukums ir virkne, bet vērtība ir virkne, skaitlis, Būla vērtība, nulle, objekts vai masīvs.

Diemžēl BSON, veicot meklÄ“Å”anu, lielu uzsvaru liek uz kārtÄ«bu. MongoDB atslēgu secÄ«ba iebÅ«vētajos objektos jautājumiemt.i. { firstname: "Phil", surname: "factor" } - tas nav tas pats, kas { { surname: "factor", firstname: "Phil" }. Tas nozÄ«mē, ka dokumentos ir jāsaglabā vārdu/vērtÄ«bu pāru secÄ«ba, ja vēlaties tos atrast.

Nejauciet "Nulle" Šø "nenoteikts"

VērtÄ«ba "nenoteikts" saskaņā ar to nekad nebija derÄ«ga JSON oficiālais standarts JSON (ECMA-404 5. sadaļa), lai gan tas tiek izmantots JavaScript. Turklāt BSON tas ir novecojis un tiek pārveidots par $null, kas ne vienmēr ir labs risinājums. Izvairieties no lietoÅ”anas "nenoteikts" MongoDB.

Izmantot $limit() bez $sort()

Diezgan bieži, izstrādājot MongoDB, ir lietderÄ«gi vienkārÅ”i redzēt rezultāta paraugu, kas tiks atgriezts no vaicājuma vai apkopojuma. Å im uzdevumam jums bÅ«s nepiecieÅ”ams $limit(), taču tam nekad nevajadzētu bÅ«t galÄ«gajā kodā, ja vien to iepriekÅ” neizmantojat $sort. Å is mehāniÄ·is ir nepiecieÅ”ams, jo pretējā gadÄ«jumā jÅ«s nevarat garantēt rezultāta secÄ«bu un nevarēsit ticami apskatÄ«t datus. Rezultāta augÅ”daļā jÅ«s saņemsiet dažādus ierakstus atkarÄ«bā no ŔķiroÅ”anas. Lai vaicājumi un apkopojumi darbotos uzticami, tiem ir jābÅ«t deterministiskiem, tas ir, jārada vienādi rezultāti katru reizi, kad tie tiek izpildÄ«ti. Kods, kas satur $limit(), bet nē $sort, nebÅ«s noteicoÅ”s un pēc tam var izraisÄ«t kļūdas, kuras bÅ«s grÅ«ti izsekot.

Secinājums

VienÄ«gais veids, kā bÅ«t vÄ«lies ar MongoDB, ir to tieÅ”i salÄ«dzināt ar cita veida datubāzi, piemēram, DBVS, vai sākt to izmantot, pamatojoties uz noteiktām cerÄ«bām. Tas ir tāpat kā salÄ«dzināt apelsÄ«nu ar dakÅ”iņu. Datu bāzes sistēmas kalpo Ä«paÅ”iem mērÄ·iem. Vislabāk ir vienkārÅ”i saprast un novērtēt Ŕīs atŔķirÄ«bas paÅ”am. BÅ«tu kauns izdarÄ«t spiedienu uz MongoDB izstrādātājiem par ceļu, kas viņus piespieda izmantot DBVS ceļu. Es vēlos redzēt jaunus un interesantus veidus, kā atrisināt vecas problēmas, piemēram, nodroÅ”ināt datu integritāti un izveidot datu sistēmas, kas ir izturÄ«gas pret neveiksmēm un ļaunprātÄ«giem uzbrukumiem.

MongoDB ACID transakciju ievieÅ”ana versijā 4.0 ir labs piemērs svarÄ«gu uzlabojumu ievieÅ”anai novatoriskā veidā. Vairāku dokumentu un vairāku paziņojumu darÄ«jumi tagad ir nozÄ«mÄ«gi. Tāpat iespējams regulēt laiku, kas nepiecieÅ”ams slēdzeņu iegÅ«Å”anai un iestrēguÅ”o darÄ«jumu pārtraukÅ”anai, kā arÄ« mainÄ«t izolācijas lÄ«meni.

14 lietas, ko es vēlos zināt pirms darba sākÅ”anas ar MongoDB

Lasīt vairāk:

Avots: www.habr.com

Pievieno komentāru