Moderne databaser skal have kapacitet til at fange og reagere på data, mens de flyder i realtid. Dette forklarer, hvorfor MongoDB har en funktion kaldet MongoDB Change Streams, der er ansvarlig for at fange og reagere på data i realtid. Change Streams er en funktion introduceret til at streame information fra applikationen til databasen i realtid. Den er baseret på en aggregeringsramme, der overvåger samlinger og tillader ændringer i databasen og databasesamlingen. Derudover kan MongoDB Change Stream fange data fra IOT-sensorer og opdatere rapporter som f.eks. ændringer i driftsdata i en virksomhed. Denne blog vil åbne diskurs om MongoDB Change Stream og ændre anbefalinger i produktionen.
MongoDB ændre streams og droppe samling
Omdøbning eller sletning af en database eller samling vil føre til markørens lukning, hvis der var en åben ændringsstrøm, der modarbejdede den droppede samling. Omdøbning eller sletning af en samling gør, at markøren med FullDocument:updateLookup returnerer null på et givet opslagsdokument. Der opstår en fejl, hvis man forsøger at genoptage efter at have droppet en database med en kørende ændringsstrøm.
Derudover går alle ændringer i data, der er foretaget før omdøbning af en samling med en ændringsstrøm, der kører imod, tabt. Dokumentgrænsen for Change stream er stadig 16 MB BSON; derfor accepteres dokumenter større end 16MB ikke. Hvis man forsøger at arbejde med et dokument, der er større end 16 MB, mislykkes meddelelsen, og dokumentet erstattes med et andet dokument, der opfylder den fastsatte grænse.
Når en samling eller database med ændringsstrømme, der er åbnet imod den, slettes eller omdøbes, har ændringsstrømsmarkørerne en tendens til at lukke, når de går videre til det punkt i oploggen. Hvis du ændrer stream-markørerne med det fulde dokument, kan updateLookup-indstillingen returnere null til søgedokumentet.
Derfor vil et forsøg på at genoptage ændring af streams mod en samling, der er blevet slettet, resultere i en fejl. Enhver forekomst af dataændringer i indsamlingen mellem den sidste hændelse af ændringsstrømmen, der blev registreret, og hændelsen for indsamlingsfald går tabt.
Ændring af stream-svardokumenter skal overholde grænsen på 16 MB BSON-dokument. Afhængigt af størrelsen af dokumenterne i den samling, som du åbner ændringsstrømmen mod, kan meddelelser mislykkes, hvis det resulterende meddelelsesdokument er mere end 16 MB. Et godt eksempel er opdateringsoperationerne på ændringsstrømmene, der er sat op til at returnere et fuldt opdateret dokument eller erstatte/indsætte processer med dokumentet på grænsen eller lidt under grænsen.
MongoDB Skift stream og replikasæt
Et MongoDB Replica Set er en samling af processer i MongoDB, hvis datasæt ikke ændres; det vil sige, at datasættet forbliver det samme. I tilfælde af replikasæt med arbitermedlemmer, vil ændringsstrømme sandsynligvis forblive inaktive, hvis tilstrækkelige medlemmer, der bærer dataene, ikke er tilgængelige, så flertallet ikke kan udføre operationerne. For eksempel kan vi overveje et replikasæt med tre medlemmer med to databærende noder ved siden af en arbiter. I tilfælde af at den sekundære tilfældigvis er nede, f.eks. som følge af fejl eller opgradering eller vedligeholdelse, vil det være umuligt for skriveoperationerne at være flertalsforpligtet. Ændringsstrømmen forbliver åben, men sender ingen meddelelser. I det aktuelle scenarie kan applikationen indhente alle operationer, der har fundet sted i nedetidsperioden, så længe den sidste operation modtaget af applikationen stadig er i oploggen for det pågældende replikasæt. Derudover bruges kommandoen rs.printReplicationInfo() til at hente data fra oplog; hentede data inkluderer en række operationer og størrelsen af oplog.
Hvis nedetiden er væsentligt estimeret, for eksempel for at udføre en opgradering eller i tilfælde af en katastrofe, vil en forøgelse af oplog-størrelsen være den bedste mulighed for at bevare driften i en periode, der er længere end den omtrentlige nedetid. For at hente oplog-statusoplysninger er den anvendte kommando printReplicationInfo(). Kommandoen henter ikke kun oplog-statusinformationen, men også oplog-størrelsen og tidsintervallet for operationerne.
MongoDB Change Streams tilgængelighed
MongoDB-ændringsstrømme er tilgængelige for replikasæt og sharded clusters:Læs bekymring "majority" Enablement, Storage Engine og Replica Set Protocol Version. Aktivering af læst bekymring "majority":Fra og med MongoDB version 4.2 og nyere er ændringsstrømme tilgængelige på trods af de fremherskende omstændigheder i "majority" read concern support, hvilket betyder, at read concern majoritetsstøtte kan aktiveres eller deaktiveres. I MongoDB version 4.0 og ældre versioner, Change-streams er kun tilgængelige, hvis støtten til "flertals"-læsning er aktiveret.
- Lagringsmotor:WiredTiger-lagringsmotor er lagermotortypen, der bruges af replikasættene og de sønderdelte klynger.
- Replikasætprotokolversion:Replikasæt og sharded clusters skal altid bruge version 1 af replikasætprotokollen (pv1).
MongoDB Sharded Clusters
Shardede klynger i MongoDB består af shards, mongo'er og konfigurationsservere. Et shard består af en delmængde af sharded data. I tilfælde af MongoDB 3.6 bruges shards som et replikasæt. Mongos giver en grænseflade mellem sharded clusters og klientapplikationer; mongos spiller rollen som en forespørgselsrouter. Fra MongoDB version 4.4 og nyere understøtter mongos sikrede læsninger for at nedbringe forsinkelser. Konfigurationsservere er lagerplaceringer for klyngekonfigurationsindstillinger og metadata.
Change-streams bruger et globalt logisk ur til at give en global rækkefølge af ændringer på tværs af shards. MongoDB sikrer, at rækkefølgen af ændringer opretholdes, og at ændringsstrømmens meddelelser kan fortolkes sikkert i den rækkefølge, de blev modtaget. For eksempel returnerer ændringsstrømmens markør åbnet mod en 3-shard-klynge ændringens meddelelser vedrørende den samlede rækkefølge af ændringerne på tværs af de tre shards.
For at sikre den samlede rækkefølge af ændringer, tjekker Mongos med hver shard for at se, om den har set nyere ændringer for hver ændringsmeddelelse. Splittede klynger med en til flere skår med ringe eller ingen indsamlingsaktivitet eller er "kolde" vil sandsynligvis have negative effekter på ændringsstrømmens responstid, da mongoerne stadig skal tjekke med disse kolde skår for at sikre den samlede rækkefølge af ændringerne. Denne effekt kan være mere tydelig, når shards er geografisk fordelt, eller når arbejdsbelastninger med de fleste af operationerne forekommer på en undergruppe af shards i en klynge. Hvis den shardede samling har et højt aktivitetsniveau, kan mongoerne muligvis ikke holde styr på ændringerne på tværs af alle shards. Overvej at bruge notifikationsfiltre til denne form for indsamling, for eksempel at passere $match-pipelinen, som er konfigureret til kun at filtrere indsætningsoperationerne.
I tilfælde af opdelte samlinger vil flere:korrekte opdateringshandlinger sandsynligvis forårsage, at ændringsstrømme, der åbnes mod samlingen, sender meddelelser om forældreløse dokumenter. Fra det tidspunkt, hvor en ikke-shard samling sønderdeles, indtil det tidspunkt, hvor ændringsstrømmen kommer til den første migreringsdel, inkluderer documentKey i meddelelsesdokumentet om ændringsstrøm kun dokument-id'et og ikke den fulde shard-nøgle.
Konklusion
Formålet med ændringsstrømmene er at gøre det muligt for applikationens dataændringer i realtid, uden risiko for at forfølge oploggen og uden spor af kompleksitet. MongoDB-applikationer bruger ændringsstrømme til at logge på dataændringer på en database, en samling eller implementeringen og reagerer straks på dem. Da ændringsstrømme gør brug af aggregeringsrammerne, kan applikationer filtrere de specifikke ændringer og konvertere meddelelser på sig selv.