sql >> Database teknologi >  >> NoSQL >> MongoDB

Udbedring af sidefejl i MongoDB

Sidefejl er en udbredt fejl, der for det meste opstår i en stor applikation, der involverer store data. Det finder sted, når MongoDB-databasen læser data fra fysisk hukommelse i stedet for fra virtuel hukommelse. Sidefejl opstår i det øjeblik, MongoDB ønsker at få data, der ikke er tilgængelige i databasens aktive hukommelse, og derfor tvunget til at læse fra disken. Dette skaber en stor forsinkelse for gennemstrømningsoperationer, hvilket får forespørgsler til at se ud som om de halter.

Justering af ydeevnen af ​​MongoDB ved tuning er en vital komponent, der optimerer udførelsen af ​​en applikation. Databaser er forbedret til at arbejde med information, der opbevares på disken, men det plejer at cache store mængder data i RAM'en i et forsøg på at få adgang til disken. Det er dyrt at gemme og tilgå data fra databasen, derfor skal informationen først gemmes på disken, før applikationer får adgang til den. På grund af det faktum, at diske er langsommere sammenlignet med RAM-datacache, bruger processen derfor en betydelig mængde tid. Derfor er MongoDB designet til at rapportere forekomst af sidefejl som en oversigt over alle hændelser på et sekund

Databevægelsestopologien i MongoDB

Data fra klienten flyttes til den virtuelle hukommelse, hvor sidecachen læser det, mens det skrives, data gemmes derefter på disken som vist i diagrammet nedenfor.

Sådan finder du MongoDB-sidefejl

Sidefejl kan detekteres gennem låseydelse, der sikrer datakonsistens i MongoDB. Når en given operation står i kø eller kører i lang tid, forringes MongoDB-ydeevnen, og operationen bliver langsommere, mens den venter på låsning. Dette fører til en opbremsning, da låserelaterede forsinkelser er sporadiske og nogle gange påvirker applikationens ydeevne. Lås påvirker ydeevnen af ​​en applikation, når låse er opdelt (locks.timeAcquiringMicros af locks.acquireWaitCount), dette giver den gennemsnitlige tid til at vente på en given låsetilstand. Locks.deadLockCount giver summen af ​​alle de oplevede låseopkøb. Da globalLock.totalTime er harmonisk høj, er der talrige anmodninger, der forventer en lås. Efterhånden som flere anmodninger venter på låsning, forbruges mere RAM, og dette fører til sidefejl.

Du kan også bruge mem.mapped, som gør det muligt for udviklere at undersøge den samlede hukommelse, som mongod bruger. Mem.mapped er en serveroperatør til at kontrollere mængden af ​​hukommelse i megabyte (MB) i en MMAPv1-lagringsmotor. Hvis mem.mapped-operatoren viser en værdi, der er større end den samlede mængde systemhukommelse, vil der opstå en sidefejl, fordi en så stor mængde hukommelsesforbrug vil føre til en sidefejl i databasen.

Hvordan sidefejl opstår i MongoDB

Indlæsning af sider i MongoDB afhænger af tilgængeligheden af ​​ledig hukommelse, i tilfælde af at den mangler ledig hukommelse, skal operativsystemet:

  1. Se efter en side, som databasen er holdt op med at bruge, og skriv siden på hukommelsesdisken.
  2. Indlæs den anmodede side i hukommelsen efter at have læst den fra disken.

Disse to aktiviteter finder sted, når sider indlæses og bruger derfor meget tid sammenlignet med læsning i en aktiv hukommelse, hvilket fører til sidefejl.

Løsning af MongoDB-sidefejl

Følgende er nogle måder, hvorpå man kan løse sidefejl: 

  1. Skalering lodret til enheder med tilstrækkelig RAM eller skalering horisontalt: Når der ikke er tilstrækkelig RAM til et givent datasæt, er den korrekte tilgang at øge RAM-hukommelsen ved at skalere lodret til enheder med mere RAM for at tilføje flere ressourcer til serveren. Vertikal skalering er en af ​​de bedste og ubesværede måder at øge MongoDB-ydeevnen på ved ikke at sprede belastningen mellem flere servere. For så vidt som lodret skalering tilføjer mere RAM, muliggør skalering vandret tilføjelse af flere shards til en sharded klynge. Kort sagt er horisontal skalering, hvor databasen er opdelt i forskellige bidder og gemt på flere servere. Horisontal skalering gør det muligt for udvikleren at tilføje flere servere til flyet, og dette øger databasens ydeevne meget, da det ikke medfører nul nedetid. Vertikal skalering og horisontal skalering reducerer løse forekomsten af ​​sidefejl ved at øge den hukommelse, som man arbejder med, mens man arbejder med databasen.
  2. Indeks data korrekt: Brug af passende indekser for at sikre, at der er effektive forespørgsler, der ikke forårsager indsamlingsscanninger. Korrekt indeksering sikrer, at databasen ikke itererer over hvert dokument i en samling og dermed løser mulig forekomst af sidefejl. Samlingsscanning forårsager en sidefejlfejl, fordi hele samlingen inspiceres af forespørgselsmotoren, når den læses ind i RAM'en. De fleste af dokumenterne i samlingsscanningen returneres ikke i appen og forårsager dermed unødvendige sidefejl for hver efterfølgende forespørgsel, som ikke er let at undgå. Derudover kan overskydende indekser også føre til ineffektiv brug af RAM, dette kan føre til sidefejl. Derfor er korrekt indeksering altafgørende, hvis en udvikler har til hensigt at løse sidefejl. MongoDB tilbyder hjælp til at bestemme de indekser, man skal implementere, når man bruger databasen. De tilbyder både Slow Query Analyzer, der giver nødvendige oplysninger om, hvordan man indekserer for brugere og delte brugere.
  3. Migrering til den seneste version af MongoDB og flyt derefter applikationen til WiredTiger. Dette er nødvendigt, hvis du har til hensigt at undgå at opleve sidefejl, da sidefejl kun er almindelige i MMAPv1-lagringsmotorer i modsætning til nyere versioner og WiredTiger. MMAPv1-lagringsmotoren er blevet forældet, og MongoDB understøtter den ikke længere. WiredTiger er den nuværende standardlagringsmotor i MongoDB, og den har MultiVersion Concurrency Control, som gør den meget bedre sammenlignet med MMAPv1-lagringsmotoren. Med WiredTiger kan MongoDB bruge både filsystemcache og WiredTiger intern cache, som har en meget stor størrelse på enten 1GB (50% 0f (RAM - 1GB)) eller 256 MB.
  4. Hold styr på den samlede RAM, der er tilgængelig til brug i dit system. Dette kan gøres ved at bruge tjenester som New Relic overvågning Google Cloud Monitoring. Desuden kan BindPlane udnyttes med de nævnte cloud-overvågningstjenester. Brug af et overvågningssystem er en proaktiv foranstaltning, der gør det muligt at imødegå sidefejl, før de opstår, i stedet for at reagere på opståede sidefejl. BindPlane giver monitoren mulighed for at opsætte konstante alarmer for forekomst af sidefejl, advarslerne gør også opmærksom på antallet af indekser, indeksstørrelse og filstørrelse.
  5. Sikre, at data er konfigureret i det gældende arbejdssæt og ikke vil bruge mere RAM end det anbefalede. MongoDB er et databasesystem, der fungerer bedst, når hyppigt tilgåede data og indekser kan passe perfekt i den tildelte hukommelse. RAM-størrelse er et vigtigt aspekt ved optimering af databasens ydeevne, derfor skal man sikre sig, at der altid er nok RAM-hukommelse, før man implementerer appen.
  6. Fordeling af belastning mellem mongod-instanser ved at tilføje shards eller implementere en sharded cluster. Det er af afgørende betydning at muliggøre skygge, hvor den målrettede samling er placeret. Først skal du oprette forbindelse til mongoer i mongo-skallen og bruge nedenstående metode.
    1. sh.shardCollection()

      Opret derefter et indeks ved hjælp af denne metode.

      ​db.collection.createIndex(keys, options)
      Det oprettede indeks understøtter shard-nøglen, det vil sige, hvis den oprettede samling allerede havde modtaget eller gemt nogle data. Men hvis samlingen ikke har nogen data (tomme), skal du bruge metoden nedenfor til at indeksere den som en del af ssh.shardCollection: sh.shardCollection()
    2. Dette efterfølges af en af ​​de to strategier leveret af mongoDB.
      1. Hashed shading 
        sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
      2. Rangebaseret skyggelægning 
        sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

Sådan forhindrer du MongoDB-sidefejl

  1. Tilføj shards eller implementer sharded cluster for at fordele belastningen
  2. Har nok RAM til din applikation, før du implementerer den
  3. Flyt til MongoDB nyere versioner og fortsæt derefter til WiredTiger
  4. Skaler lodret eller vandret for en enhed med mere RAM 
  5. Brug anbefalet RAM og hold styr på brugt RAM-plads

Konklusion 

Et par antal sidefejl (alene) tager kort tid, men i en situation, hvor der er talrige sidefejl (samlet), er det en indikation af, at databasen læser et stort antal data i disken. Når sammenlægning sker, vil der være flere MongoBD læselåse, der vil føre til en sidefejl.

Når du bruger MongoDB, kan størrelsen af ​​RAM for systemet og antallet af forespørgsler i høj grad påvirke applikationens ydeevne. Ydeevnen af ​​en applikation i MongoDB afhænger i høj grad af tilgængelig RAM på den fysiske hukommelse, hvilket påvirker den tid, det tager for applikationen at lave en enkelt forespørgsel. Med tilstrækkelig RAM reduceres forekomsten af ​​sidefejl, og applikationsydelsen forbedres.


  1. Sådan laver du GROUP BY i Redis

  2. Sum i indlejret dokument MongoDB

  3. Hvad er konsekvenserne af at deaktivere sladder, mingle og hjerteslag for selleriarbejdere?

  4. Mongo Giver 'duplicate key error' på ikke-unikke felter