Med MMAPv1-lagringsmotoren fremhæves opdateringer på stedet ofte som en optimeringsstrategi, fordi indekser for et dokument peger direkte på filplaceringer og forskydninger. Flytning af et dokument til en ny lagerplacering (især hvis der er mange indeksposter at opdatere) har mere overhead for MMAPv1 end en in-place opdatering, som kun skal opdatere de ændrede felter. Se:Optegnelseskarakteristika i MMAPv1.
WiredTiger understøtter ikke opdateringer på stedet, fordi den internt bruger MVCC (Multiversion concurrency control), som almindeligvis bruges af databasestyringssystemer. Dette er en væsentlig teknisk forbedring i forhold til den forenklede visning i MMAP og giver mulighed for at bygge mere avancerede funktioner som isolationsniveauer og transaktioner. WiredTigers indekser har et indirekte niveau (der henviser til et internt RecordID i stedet for filplacering og offset), så dokumentbevægelser på lagerniveau er ikke et væsentligt smertepunkt.
Denne artikel siger dog også, at "Selvom [WiredTiger] ikke tillader opdateringer på stedet, kan den stadig yde bedre end MMAP for mange arbejdsbelastninger".
Det betyder, at selvom MMAPv1 kan have en mere effektiv vej til opdateringer på stedet, har WiredTiger andre fordele såsom komprimering og forbedret samtidighedskontrol. Du kunne måske konstruere en arbejdsbyrde, der kun består af opdateringer på stedet til nogle få dokumenter, som muligvis fungerer bedre i MMAPv1, men de faktiske arbejdsbyrder er typisk mere varierede. Den eneste måde at bekræfte påvirkningen for en given arbejdsbyrde ville være at teste i et repræsentativt miljø.
Det generelle valg af MMAPv1 vs WiredTiger er dog uklart, hvis du vil planlægge for fremtiden:WiredTiger har været standardlagermotoren siden MongoDB 3.2, og nogle nyere produktfunktioner understøttes ikke af MMAPv1. For eksempel understøtter MMAPv1 ikke Majority Read Concern, hvilket igen betyder, at det ikke kan bruges til Replica Set Config Servers (påkrævet til sharding i MongoDB 3.4+) eller Change Streams (MongoDB 3.6+). MMAPv1 vil blive udfaset i den næste store udgivelse af MongoDB (4.0) og er i øjeblikket planlagt til at blive fjernet i MongoDB 4.2.
Hvad er de nøjagtige implikationer, som jeg skal være opmærksom på, når jeg bruger WiredTiger? For eksempel vil databasestørrelsen vokse hurtigt uden opdateringer på stedet?
Lagerresultater afhænger af flere faktorer, herunder dit skemadesign, arbejdsbelastning, konfiguration og version af MongoDB-serveren. MMAPv1 og WiredTiger bruger forskellige rekordallokeringsstrategier, men begge vil forsøge at bruge forudtildelt plads, der er markeret som gratis/genanvendelig. Generelt er WiredTiger mere effektiv med brug af lagerplads, og den har også fordelen af komprimering af data og indekser. MMAPv1 tildeler ekstra lagerplads for at forsøge at optimere til opdateringer på stedet og undgå dokumentflytninger, selvom du kan vælge en "no padding"-strategi for samlinger, hvor arbejdsbyrden ikke ændrer dokumentstørrelsen over tid.
Der har været betydelige investeringer i at forbedre og tune WiredTiger til forskellige arbejdsbelastninger, siden den først blev introduceret i MongoDB 3.0, så jeg vil kraftigt opfordre til at teste med den seneste produktionsudgivelsesserie for det bedste resultat. Hvis du har et specifikt spørgsmål om skemadesign og lagervækst, vil jeg foreslå, at du poster detaljer på DBA StackExchange til diskussion.
Jeg lærte også, at WiredTiger i MongoDB 3.6 tilføjede muligheden for at gemme deltaer i stedet for at omskrive hele dokumentet (https://jira.mongodb.org/browse/DOCS-11416). Hvad betyder det helt præcist?
Dette er en implementeringsdetalje, der forbedrer WiredTigers interne datastrukturer i nogle tilfælde. Især WiredTiger i MongoDB 3.6+ kan være mere effektivt med at arbejde med små ændringer i store dokumenter (sammenlignet med tidligere udgivelser). WiredTiger-cachen skal kunne returnere flere versioner af dokumenter, så længe de bruges af åbne interne sessioner (MVCC, som nævnt tidligere), så for store dokumenter med små opdateringer kunne det være mere effektivt at gemme en liste over deltaer. Men hvis der akkumuleres for mange deltaer (eller deltaerne ændrer de fleste felter i et dokument), kan denne fremgangsmåde være mindre effektiv end at vedligeholde flere kopier af det fulde dokument.
Når data er forpligtet til disk via et kontrolpunkt, skal en fuld version af dokumentet stadig skrives. Hvis du vil lære mere om nogle af de interne funktioner, er der en MongoDB Path To Transactions-serie af videoer, der følger udviklingen af funktioner til understøttelse af multidokumenttransaktioner i MongoDB 4.0.
Også hvad jeg ikke forstår er, at nu til dags har de fleste (hvis ikke alle) harddiske en sektorstørrelse på 4096 bytes, så du kan ikke skrive til harddisken kun 4 bytes (for eksempel), men skal i stedet skrive hele blokken på 4096 bytes (så læs det først, opdater de 4 bytes i det og skriv det derefter). Da de fleste dokumenter ofte er <4096 bytes, betyder det, at det er nødvendigt at omskrive hele dokumentet under alle omstændigheder (selv med MMAP). Hvad gik jeg glip af?
Uden at gå for langt ind i implementeringsdetaljerne og forsøge at forklare alle de involverede bevægelige dele, skal du overveje, hvordan de forskellige tilgange gælder for arbejdsbelastninger, hvor mange dokumenter bliver opdateret (i stedet for på enkeltdokumentniveau) samt indvirkningen på hukommelsesforbrug (før dokumenter skrives til disk). Afhængigt af faktorer som dokumentstørrelse og komprimering kan en enkelt blok af I/O repræsentere alt fra en brøkdel af et dokument (maks. størrelse 16 MB) til flere dokumenter.
I MongoDB er det generelle flow, at dokumenter opdateres i en hukommelsesvisning (f.eks. WiredTiger-cachen) med ændringer, der forbliver på disken i et hurtigt journalformat, der kun kan tilføjes, før de periodisk tømmes til datafilerne. Hvis O/S'et kun skal skrive datablokke, der er ændret, kræver berøring af færre datablokke mindre samlet I/O.