{"id":49453,"date":"2023-03-16T08:48:23","date_gmt":"2023-03-16T07:48:23","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=49453&#038;preview=true&#038;preview_id=49453"},"modified":"2023-08-24T06:32:09","modified_gmt":"2023-08-24T05:32:09","slug":"mongodb-replikasaet","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/","title":{"rendered":"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder)"},"content":{"rendered":"<p>MongoDB er en <a href=\"https:\/\/kinsta.com\/blog\/mongodb-vs-mysql\/\">NoSQL<\/a>-database, der bruger JSON-lignende dokumenter med dynamiske skemaer. N\u00e5r du arbejder med databaser, er det altid godt at have en beredskabsplan, hvis en af dine databaseservere svigter. Sidebar, du kan reducere chancerne for at det sker ved at udnytte et <a href=\"https:\/\/kinsta.com\/dk\/mykinsta\/\">smart administrationsv\u00e6rkt\u00f8j<\/a> til dit WordPress-websted.<\/p>\n<p>Det er derfor, det er nyttigt at have mange kopier af dine data. Det reducerer ogs\u00e5 l\u00e6seventetiderne. Samtidig kan det forbedre databasens skalerbarhed og tilg\u00e6ngelighed. Det er her, at replikering kommer ind i billedet. Det er defineret som praksis med at <a href=\"https:\/\/kinsta.com\/blog\/mysql-backup-database\/\">synkronisere<\/a> data p\u00e5 tv\u00e6rs af flere <a href=\"https:\/\/kinsta.com\/blog\/open-source-database\/\">databaser<\/a>.<\/p>\n<p>I denne artikel vil vi dykke ned i de forskellige fremtr\u00e6dende aspekter af MongoDB replikering, som f.eks. dens funktioner og mekanisme, for blot at n\u00e6vne et par stykker.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Hvad er replikering i MongoDB?<\/h2>\n<p>I MongoDB udf\u00f8rer replikas\u00e6t replikering. Dette er en gruppe af servere, der vedligeholder det samme datas\u00e6t gennem replikering. Du kan endda bruge MongoDB-replikering som en del af belastningsbalancering. Her kan du distribuere skrive- og l\u00e6seoperationer p\u00e5 tv\u00e6rs af alle instanser, baseret p\u00e5 brugssituationen.<\/p>\n\n<h2>Hvad er et MongoDB-replikas\u00e6t?<\/h2>\n<p>Hver instans af <a href=\"https:\/\/kinsta.com\/blog\/what-is-mongodb\/\">MongoDB<\/a>, der er en del af et givet replikas\u00e6t, er et medlem. Hvert replikas\u00e6t skal have et prim\u00e6rt medlem og mindst \u00e9t sekund\u00e6rt medlem.<\/p>\n<p>Det prim\u00e6re medlem er det prim\u00e6re adgangspunkt for transaktioner med replikas\u00e6ttet. Det er ogs\u00e5 det eneste medlem, der kan acceptere skriveoperationer. Replikation kopierer f\u00f8rst den prim\u00e6re oplog (operationslog). Derefter gentages de loggede \u00e6ndringer p\u00e5 de sekund\u00e6re datas\u00e6t i de respektive datas\u00e6t. Derfor kan hvert replikas\u00e6t kun have \u00e9t prim\u00e6rt medlem ad gangen. Forskellige prim\u00e6re, der modtager skriveoperationer, kan for\u00e5rsage datakonflikter.<\/p>\n<p>Normalt foresp\u00f8rger programmerne kun det prim\u00e6re medlem om skrive- og l\u00e6seoperationer. Du kan udforme din ops\u00e6tning til at l\u00e6se fra et eller flere af de sekund\u00e6re medlemmer. Asynkron dataoverf\u00f8rsel kan medf\u00f8re, at sekund\u00e6re noders l\u00e6sning af sekund\u00e6re nodepunkter serverer gamle data. Derfor er et s\u00e5dant arrangement ikke ideelt for alle anvendelsestilf\u00e6lde.<\/p>\n<h3>Funktioner i replikas\u00e6t<\/h3>\n<p>Den automatiske failover-mekanisme adskiller MongoDB&#8217;s replikas\u00e6t fra konkurrenterne. Hvis der ikke er en prim\u00e6r node, v\u00e6lges der en ny prim\u00e6r node ved et automatisk valg blandt de sekund\u00e6re nodepunkter.<\/p>\n<h3>MongoDB Replica Set vs MongoDB Cluster<\/h3>\n<p>Et MongoDB replikas\u00e6t vil oprette forskellige kopier af det samme datas\u00e6t p\u00e5 tv\u00e6rs af replikas\u00e6tnoderne. Det prim\u00e6re form\u00e5l med et replikas\u00e6t er at:<\/p>\n<ul>\n<li>Tilbyde en indbygget backup-l\u00f8sning<\/li>\n<li>\u00d8ge tilg\u00e6ngeligheden af data<\/li>\n<\/ul>\n<p>En MongoDB-klynge er en helt anden boldgade. Den fordeler dataene p\u00e5 mange nodepunkter via en shard-n\u00f8gle. Denne proces fragmenterer dataene i mange stykker, der kaldes shards. Derefter kopieres hver shard til en anden node. En klynge har til form\u00e5l at underst\u00f8tte store datas\u00e6t og operationer med h\u00f8j genneml\u00f8bshastighed. Den opn\u00e5r dette ved at skalere arbejdsbyrden horisontalt.<\/p>\n<p>Her er forskellen mellem et replikas\u00e6t og en klynge i l\u00e6gmandstermer:<\/p>\n<ul>\n<li>En klynge fordeler arbejdsbyrden. Den gemmer ogs\u00e5 datafragmenter (shards) p\u00e5 mange servere.<\/li>\n<li>Et replikas\u00e6t duplikerer datas\u00e6ttet fuldst\u00e6ndigt.<\/li>\n<\/ul>\n<p>MongoDB giver dig mulighed for at kombinere disse funktionaliteter ved at lave en sharded cluster. Her kan du replikere hver shard til en sekund\u00e6r server. Dette g\u00f8r det muligt for en shard at tilbyde h\u00f8j redundans og datatilg\u00e6ngelighed.<\/p>\n<p>Vedligeholdelse og ops\u00e6tning af et replikas\u00e6t kan v\u00e6re teknisk kr\u00e6vende og tidskr\u00e6vende. Og at finde den rigtige hosting-tjeneste? Det er en helt anden hovedpine. Med s\u00e5 mange muligheder derude er det let at spilde timer p\u00e5 at unders\u00f8ge, i stedet for at opbygge din virksomhed.<\/p>\n<p>Lad mig give dig en kort beskrivelse af et v\u00e6rkt\u00f8j, der g\u00f8r alt dette og meget mere, s\u00e5 du kan vende tilbage til at knuse det med din service\/dit produkt.<\/p>\n<p>Kinsta&#8217;s <a href=\"https:\/\/sevalla.com\/application-hosting\/\">Applikation Hosting-l\u00f8sning<\/a>, som er betroet af over 55.000 udviklere, kan du komme i gang med den i kun 3 enkle trin. Hvis det lyder for godt til at v\u00e6re sandt, s\u00e5 er her nogle flere fordele ved at bruge Kinsta:<\/p>\n<ul>\n<li><strong>Nyd bedre ydeevne med Kinstas interne forbindelser<\/strong>: Glem dine problemer med delte databaser. Skift til dedikerede databaser med interne forbindelser, der ikke har nogen begr\u00e6nsninger for antal foresp\u00f8rgsler eller antal r\u00e6kker. Kinsta er hurtigere, mere sikker og vil ikke fakturere dig for intern b\u00e5ndbredde\/trafik.<\/li>\n<li><strong>Et funktionss\u00e6t, der er skr\u00e6ddersyet til udviklere<\/strong>: Skaler din applikation p\u00e5 den robuste platform, der underst\u00f8tter Gmail, YouTube og Google Search. Du kan v\u00e6re sikker p\u00e5, at du er i de sikreste h\u00e6nder her.<\/li>\n<li><strong>Nyd uovertrufne hastigheder med et datacenter efter eget valg<\/strong>: V\u00e6lg den region, der fungerer bedst for dig og dine kunder. Med over 25 datacentre at v\u00e6lge imellem sikrer Kinsta&#8217;s 300 PoP&#8217;er maksimal hastighed og global tilstedev\u00e6relse for dit websted.<\/li>\n<\/ul>\n<p>Pr\u00f8v <a href=\"https:\/\/kinsta.com\/dk\/tilmelding\/?product_type=app-db\">Kinsta&#8217;s applikationshostingl\u00f8sning gratis i dag<\/a>!<\/p>\n<h2>Hvordan fungerer replikering i MongoDB?<\/h2>\n<p>I MongoDB sender du skriveoperationer til den prim\u00e6re server (node). Den prim\u00e6re tildeler operationerne p\u00e5 tv\u00e6rs af sekund\u00e6re servere og replikerer dataene.<\/p>\n<figure id=\"attachment_148331\" aria-describedby=\"caption-attachment-148331\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/MongoDB-Replica-Set-Election.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-148331 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/MongoDB-Replica-Set-Election.png\" alt=\"Dette er et flowdiagram over, hvordan replikering fungerer i MongoDB, for 3 noder (1 prim\u00e6r, 2 sekund\u00e6r)\" width=\"1024\" height=\"763\"><\/a><figcaption id=\"caption-attachment-148331\" class=\"wp-caption-text\">Illustration af MongoDB-replikeringsprocessen (Billedkilde: <a href=\"https:\/\/www.mongodb.com\/basics\/replication\" target=\"_blank\" rel=\"noopener noreferrer\">MongoDB<\/a>)<\/figcaption><\/figure>\n<h3>Tre typer af MongoDB-noder<\/h3>\n<p>Af de tre typer MongoDB-nodes er der to, der er blevet n\u00e6vnt f\u00f8r: prim\u00e6re og sekund\u00e6re nodepunkter. Den tredje type MongoDB-node, der er praktisk under replikering, er en arbiter. Arbiternoden har ikke en kopi af datas\u00e6ttet og kan ikke blive en prim\u00e6r node. N\u00e5r det er sagt, deltager arbiteren dog i valget af prim\u00e6rnoder.<\/p>\n<p>Vi har tidligere n\u00e6vnt, hvad der sker, n\u00e5r den prim\u00e6re node g\u00e5r ned, men hvad nu hvis de sekund\u00e6re nodes bidte i st\u00f8vet? I det scenarie bliver den prim\u00e6re nodes sekund\u00e6r, og databasen bliver utilg\u00e6ngelig.<\/p>\n<h3>Valg af medlemmer<\/h3>\n<p>Valgene kan finde sted i f\u00f8lgende scenarier:<\/p>\n<ul>\n<li>Initialisering af et replikas\u00e6t<\/li>\n<li>Tab af forbindelse til den prim\u00e6re node (som kan registreres ved hj\u00e6lp af hjerteslag)<\/li>\n<li>Vedligeholdelse af et replikas\u00e6t ved hj\u00e6lp af metoderne <code>rs.reconfig<\/code> eller <code>stepDown<\/code><\/li>\n<li>Tilf\u00f8jelse af en ny node til et eksisterende replikas\u00e6t<\/li>\n<\/ul>\n<p>Et replikas\u00e6t kan have op til 50 medlemmer, men kun 7 eller f\u00e6rre kan stemme i et valg.<\/p>\n<p>Den gennemsnitlige tid, f\u00f8r en klynge v\u00e6lger en ny prim\u00e6r v\u00e6lger, b\u00f8r ikke overstige 12 sekunder. Valgalgoritmen vil fors\u00f8ge at have den sekund\u00e6re med den h\u00f8jeste prioritet til r\u00e5dighed. Samtidig kan medlemmer med en prioritetsv\u00e6rdi p\u00e5 0 ikke blive prim\u00e6re og deltager ikke i valget.<\/p>\n<figure id=\"attachment_148334\" aria-describedby=\"caption-attachment-148334\" style=\"width: 900px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Secondary-Node-Becomes-a-Primary-in-MongoDB-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-148334 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Secondary-Node-Becomes-a-Primary-in-MongoDB-2.png\" alt=\"Dette er et diagram, der viser en sekund\u00e6r node, der bliver en prim\u00e6r i MongoDB efter valget.\" width=\"900\" height=\"509\"><\/a><figcaption id=\"caption-attachment-148334\" class=\"wp-caption-text\">Sekund\u00e6r node bliver prim\u00e6r (Billedkilde: <a href=\"https:\/\/medium.com\/condorlabs-engineering\/mongodb-replication-what-you-need-to-know-42a62a98b320\" target=\"_blank\" rel=\"noopener noreferrer\">Medium<\/a>)<\/figcaption><\/figure>\n<h3>Den skriftlige bekymring<\/h3>\n<p>Af hensyn til holdbarheden har skriveoperationer en ramme til at kopiere dataene i et bestemt antal nodes. Du kan endda tilbyde feedback til klienten med dette. Denne ramme er ogs\u00e5 kendt som &#8220;write concern&#8221; Den har datagivende medlemmer, der skal kvittere for en write concern, f\u00f8r operationen vender tilbage som vellykket. Generelt har replikas\u00e6ttene en v\u00e6rdi p\u00e5 1 som en write concern. Det er s\u00e5ledes kun det prim\u00e6re s\u00e6t, der skal bekr\u00e6fte skrivningen, f\u00f8r der returneres en bekr\u00e6ftelse af skrivehensyn.<\/p>\n<p>Du kan endda \u00f8ge antallet af medlemmer, der er n\u00f8dvendige for at bekr\u00e6fte skriveoperationen. Der er ikke noget loft over det antal medlemmer, du kan have. Men hvis antallet er h\u00f8jt, skal du tage h\u00f8jde for en h\u00f8j latenstid. Det skyldes, at klienten skal vente p\u00e5 bekr\u00e6ftelse fra alle medlemmerne. Du kan ogs\u00e5 indstille skrivehensynet for &#8220;flertallet&#8221;. Dette beregner mere end halvdelen af medlemmerne efter at have modtaget deres bekr\u00e6ftelse.<\/p>\n<h3>L\u00e6sepr\u00e6ference<\/h3>\n<p>For l\u00e6seoperationer kan du n\u00e6vne l\u00e6sepr\u00e6ferencen, som beskriver, hvordan databasen dirigerer foresp\u00f8rgslen til medlemmerne af replikas\u00e6ttet. Generelt modtager den prim\u00e6re node l\u00e6seoperationen, men klienten kan angive en l\u00e6sepr\u00e6ference for at sende l\u00e6seoperationer til sekund\u00e6re nodes. Her er mulighederne for l\u00e6sepr\u00e6ferencen:<\/p>\n<ul>\n<li><strong>primaryPreferred<\/strong>: Normalt kommer l\u00e6seoperationerne fra den prim\u00e6re node, men hvis denne ikke er tilg\u00e6ngelig, tr\u00e6kkes dataene fra de sekund\u00e6re nodes.<\/li>\n<li><strong>primary<\/strong>: Alle l\u00e6seoperationer kommer fra den prim\u00e6re node.<\/li>\n<li><strong>secondary<\/strong>: Alle l\u00e6seoperationer udf\u00f8res af de sekund\u00e6re nodepunkter.<\/li>\n<li><strong>n\u00e6rmeste<\/strong>: Her dirigeres l\u00e6seforesp\u00f8rgslerne til den n\u00e6rmeste tilg\u00e6ngelige node, som kan registreres ved at k\u00f8re kommandoen <code>ping<\/code>. Resultatet af l\u00e6seoperationer kan komme fra et hvilket som helst medlem af replikas\u00e6ttet, uanset om det er den prim\u00e6re eller den sekund\u00e6re node.<\/li>\n<li><strong>secondaryPreferred<\/strong>: Her kommer de fleste l\u00e6seoperationer fra de sekund\u00e6re noddepunkter, men hvis ingen af dem er tilg\u00e6ngelige, tages dataene fra den prim\u00e6re noddepunkt.<\/li>\n<\/ul>\n<h3>Datasynkronisering af replikeringss\u00e6t<\/h3>\n<p>For at opretholde ajourf\u00f8rte kopier af det delte datas\u00e6t replikerer eller synkroniserer sekund\u00e6re medlemmer af et replikas\u00e6t data fra andre medlemmer for at opretholde opdaterede kopier af det delte datas\u00e6t.<\/p>\n<p>MongoDB udnytter to former for datasynkronisering. Initial synkronisering for at fylde nye medlemmer med det fulde datas\u00e6t. Replikation for at udf\u00f8re l\u00f8bende \u00e6ndringer i det komplette datas\u00e6t.<\/p>\n<h4>Oprindelig synkronisering<\/h4>\n<p>Under den indledende synkronisering k\u00f8rer en sekund\u00e6r node kommandoen <code> init sync <\/code> for at synkronisere alle data fra den prim\u00e6re node til en anden sekund\u00e6r node, der indeholder de nyeste data. Derfor udnytter den sekund\u00e6re node konsekvent <code> tailable cursor <\/code> -funktionen til at foresp\u00f8rge de seneste oplogposter i local.oplog.rs-samlingen for den prim\u00e6re node og anvender disse operationer i disse oplogposter.<\/p>\n<p>Fra MongoDB 5.2 kan indledende synkroniseringer v\u00e6re baseret p\u00e5 filkopiering eller logiske.<\/p>\n<h5>Logisk synkronisering<\/h5>\n<p>N\u00e5r du udf\u00f8rer en logisk synkronisering, vil MongoDB:<\/p>\n<ol>\n<li>Udvikler alle samlingsindekser, efterh\u00e5nden som dokumenterne kopieres for hver samling.<\/li>\n<li>Duplikerer alle databaser undtagen den lokale database. <code> mongod <\/code> scanner hver samling i alle kildedatabaser og inds\u00e6tter alle data i sine duplikker af disse samlinger.<\/li>\n<li>Udf\u00f8rer alle \u00e6ndringer i datas\u00e6ttet. Ved at udnytte oploggen fra kilden opgraderer <code> mongod <\/code> sit datas\u00e6t til at skildre replikas\u00e6ttets aktuelle tilstand.<\/li>\n<li>Udvinder de nyligt tilf\u00f8jede oplogposter under datakopieringen. S\u00f8rg for, at m\u00e5lmedlemmet har tilstr\u00e6kkelig diskplads i den lokale database til midlertidigt at gemme disse oplogposter i denne datakopieringsfase.<\/li>\n<\/ol>\n<p>N\u00e5r den f\u00f8rste synkronisering er afsluttet, overg\u00e5r medlemmet fra <code> STARTUP2 <\/code> til <code> SECONDARY <\/code>.<\/p>\n<h5>F\u00f8rste synkronisering baseret p\u00e5 filkopiering<\/h5>\n<p>Lige fra starten kan du kun udf\u00f8re dette, hvis du bruger MongoDB Enterprise. Denne proces k\u00f8rer den indledende synkronisering ved at duplikere og flytte filerne p\u00e5 filsystemet. Denne synkroniseringsmetode kan i nogle tilf\u00e6lde v\u00e6re hurtigere end logisk indledende synkronisering. Husk p\u00e5, at filkopibaseret indledende synkronisering kan f\u00f8re til un\u00f8jagtige t\u00e6llinger, hvis du k\u00f8rer count()-metoden uden et foresp\u00f8rgselspr\u00e6dikat.<\/p>\n<p>Men denne metode har ogs\u00e5 sin del af begr\u00e6nsninger:<\/p>\n<ul>\n<li>Under en filkopibaseret indledende synkronisering kan du ikke skrive til den lokale database for det medlem, der synkroniseres. Du kan heller ikke k\u00f8re en sikkerhedskopi p\u00e5 det medlem, der synkroniseres til, eller det medlem, der synkroniseres fra.<\/li>\n<li>N\u00e5r MongoDB udnytter den krypterede lagringsmotor, bruger MongoDB kilden\u00f8glen til at kryptere destinationen.<\/li>\n<li>Du kan kun k\u00f8re en indledende synkronisering fra \u00e9t givet medlem ad gangen.<\/li>\n<\/ul>\n<h4>Replikering<\/h4>\n<p>Sekund\u00e6re medlemmer replikerer data konsekvent efter den f\u00f8rste synkronisering. Sekund\u00e6re medlemmer duplikerer oploggen fra deres synkronisering fra kilden og udf\u00f8rer disse operationer i en asynkron proces.<\/p>\n<p>Sekund\u00e6re medlemmer er i stand til automatisk at \u00e6ndre deres synkronisering fra kilden efter behov p\u00e5 grundlag af \u00e6ndringer i ping-tiden og status for andre medlemmers replikering.<\/p>\n<h5>Streaming-replikation<\/h5>\n<p>Fra MongoDB 4.4 sender synkronisering fra kilder en kontinuerlig str\u00f8m af oplogposter til deres synkroniserende sekund\u00e6re enheder. Streaming replikation reducerer replikationsforsinkelsen i netv\u00e6rk med h\u00f8j belastning og h\u00f8j latenstid. Det kan ogs\u00e5:<\/p>\n<ul>\n<li>Mindske risikoen for at miste skriveoperationer med <code>w:1<\/code> p\u00e5 grund af prim\u00e6r failover.<\/li>\n<li>Mindske stoleness for l\u00e6sninger fra sekund\u00e6re filer.<\/li>\n<li>Reducere ventetiden p\u00e5 skriveoperationer med <code>w:\u201cmajority\u201d<\/code> og <code>w:&gt;1<\/code>. Kort sagt, enhver skriveopgave, der kr\u00e6ver ventetid p\u00e5 replikering.<\/li>\n<\/ul>\n<h5>Multithreaded replikation<\/h5>\n<p>MongoDB plejede at skrive operationer i batches gennem flere tr\u00e5de for at forbedre samtidigheden. MongoDB grupperer batcherne efter dokument-id, mens hver gruppe af operationer anvendes af en anden tr\u00e5d.<\/p>\n<p>MongoDB udf\u00f8rer altid skriveoperationer p\u00e5 et givet dokument i den oprindelige skriveorden. Dette blev \u00e6ndret i MongoDB 4.0.<\/p>\n<p>Fra MongoDB 4.0 vil l\u00e6seoperationer, der var rettet mod sekund\u00e6re filer og er konfigureret med et l\u00e6sesikringsniveau p\u00e5 <code>\u201cmajority\u201d<\/code> eller <code>\u201clocal\u201d<\/code>, nu l\u00e6se fra et WiredTiger-snapshot af dataene, hvis l\u00e6sningen sker p\u00e5 en sekund\u00e6r fil, hvor replikeringssatserne anvendes. L\u00e6sning fra et \u00f8jebliksbillede garanterer en konsistent visning af dataene og g\u00f8r det muligt at l\u00e6se samtidigt med den igangv\u00e6rende replikering uden at have brug for en l\u00e5s.<\/p>\n<p>Derfor beh\u00f8ver sekund\u00e6re l\u00e6sninger, der har brug for disse l\u00e6sesorgensniveauer, ikke l\u00e6ngere at vente p\u00e5, at replikationsbatches anvendes, og kan h\u00e5ndteres, n\u00e5r de modtages.<\/p>\n<h2>S\u00e5dan oprettes et MongoDB-repliks\u00e6t<\/h2>\n<p>Som tidligere n\u00e6vnt h\u00e5ndterer MongoDB replikation gennem replikas\u00e6t. I l\u00f8bet af de n\u00e6ste par afsnit vil vi fremh\u00e6ve et par metoder, som du kan bruge til at oprette replikas\u00e6t til dit brugsscenarie.<\/p>\n<h3>Metode 1: Oprettelse af et nyt MongoDB-repliks\u00e6t p\u00e5 Ubuntu<\/h3>\n<p>F\u00f8r vi g\u00e5r i gang, skal du sikre dig, at du har mindst tre servere, der k\u00f8rer Ubuntu 20.04, med <a href=\"https:\/\/kinsta.com\/blog\/what-is-mongodb\/\">MongoDB<\/a> installeret p\u00e5 hver server.<\/p>\n<p>For at oprette et replikas\u00e6t er det vigtigt at angive en adresse, hvor hvert replikas\u00e6tmedlem kan n\u00e5s af de andre i s\u00e6ttet. I dette tilf\u00e6lde har vi tre medlemmer i s\u00e6ttet. Selv om vi kan bruge <a href=\"https:\/\/kinsta.com\/blog\/static-vs-dynamic-ip\/\">IP-adresser<\/a>, anbefales det ikke, da adresserne kan \u00e6ndres uventet. Et bedre alternativ kan v\u00e6re at bruge de logiske DNS-hostnavne, n\u00e5r replikas\u00e6t konfigureres.<\/p>\n<p>Vi kan g\u00f8re dette ved at konfigurere underdom\u00e6net for hvert replikationsmedlem. Selv om dette kan v\u00e6re ideelt for et produktionsmilj\u00f8, vil dette afsnit skitsere, hvordan man konfigurerer <a href=\"https:\/\/kinsta.com\/dk\/blog\/hvad-er-dns\/\">DNS<\/a>-opl\u00f8sning ved at redigere hver servers respektive hosts-filer. Denne fil giver os mulighed for at tildele l\u00e6sbare v\u00e6rtsnavne til numeriske IP-adresser. Hvis din IP-adresse \u00e6ndres, skal du s\u00e5ledes blot opdatere hosts-filerne p\u00e5 de tre servere i stedet for at omkonfigurere replikas\u00e6ttet fra bunden!<\/p>\n<p>For det meste er <code>hosts<\/code> gemt i mappen <code>\/etc\/<\/code>. Gentag nedenst\u00e5ende kommandoer for hver af dine tre servere:<\/p>\n<pre><code class=\"language-markdown\">sudo nano \/etc\/hosts<\/code><\/pre>\n<p>I ovenst\u00e5ende kommando bruger vi nano som vores teksteditor, men du kan bruge en hvilken som helst teksteditor, som du foretr\u00e6kker. Efter de f\u00f8rste par linjer, som konfigurerer localhost, skal du tilf\u00f8je en post for hvert medlem af replikas\u00e6ttet. Disse poster har form af en IP-adresse efterfulgt af et menneskeligt l\u00e6sbart navn efter eget valg. Du kan navngive dem, som du vil, men s\u00f8rg for at v\u00e6re beskrivende, s\u00e5 du kan skelne mellem hvert enkelt medlem. I denne vejledning vil vi bruge nedenst\u00e5ende hostsnavne:<\/p>\n<ul>\n<li>mongo0.replset.member<\/li>\n<li>mongo1.replset.member<\/li>\n<li>mongo2.replset.member<\/li>\n<\/ul>\n<p>Med disse v\u00e6rtsnavne vil dine \/etc\/hosts-filer ligne f\u00f8lgende markerede linjer:<\/p>\n<figure id=\"attachment_148336\" aria-describedby=\"caption-attachment-148336\" style=\"width: 1222px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Hostnames-Illustration.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-148336 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Hostnames-Illustration.png\" alt=\"Dette er et snapshot af \/etc\/hosts-filerne, der indeholder v\u00e6rtsnavnene sammen med IP-adressen.\" width=\"1222\" height=\"339\"><\/a><figcaption id=\"caption-attachment-148336\" class=\"wp-caption-text\">V\u00e6rtsnavne Illustration<\/figcaption><\/figure>\n<p>Gem og luk filen.<\/p>\n<p>N\u00e5r vi har konfigureret DNS-opl\u00f8sningen for replikas\u00e6ttet, skal vi opdatere firewallreglerne, s\u00e5 de kan kommunikere med hinanden. K\u00f8r f\u00f8lgende <code>ufw<\/code> -kommando p\u00e5 mongo0 for at give mongo1 adgang til port 27017 p\u00e5 mongo0:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo1_server_ip to any port 27017<\/code><\/pre>\n<p>I stedet for parameteren <code>mongo1_server_ip<\/code> skal du indtaste din mongo1-serverens faktiske IP-adresse. Hvis du har opdateret Mongo-instansen p\u00e5 denne server til at bruge en anden port end standardporten, skal du ogs\u00e5 s\u00f8rge for at \u00e6ndre 27017 til at afspejle den port, som din MongoDB-instans bruger.<\/p>\n<p>Tilf\u00f8j nu en anden firewallregel for at give mongo2 adgang til den samme port:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo2_server_ip to any port 27017<\/code><\/pre>\n<p>I stedet for parameteren <code>mongo2_server_ip<\/code> skal du indtaste din mongo2-serverens faktiske IP-adresse. Opdater derefter firewallreglerne for dine to andre servere. K\u00f8r f\u00f8lgende kommandoer p\u00e5 mongo1-serveren, og s\u00f8rg for at \u00e6ndre IP-adresserne i stedet for parameteren server_ip, s\u00e5 de afspejler IP-adresserne for henholdsvis mongo0 og mongo2:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo0_server_ip to any port 27017<\/code><\/pre>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo2_server_ip to any port 27017<\/code><\/pre>\n<p>Til sidst skal du k\u00f8re disse to kommandoer p\u00e5 mongo2. Igen skal du s\u00f8rge for, at du indtaster de korrekte IP-adresser for hver server:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo0_server_ip to any port 27017<\/code><\/pre>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo1_server_ip to any port 27017<\/code><\/pre>\n<p>Dit n\u00e6ste skridt er at opdatere hver MongoDB-instans&#8217; konfigurationsfil for at tillade eksterne forbindelser. For at tillade dette skal du \u00e6ndre konfigurationsfilen p\u00e5 hver server, s\u00e5 den afspejler IP-adressen og angiver replikas\u00e6ttet. Selv om du kan bruge enhver foretrukken teksteditor, bruger vi igen nano teksteditor. Lad os foretage f\u00f8lgende \u00e6ndringer i hver mongod.conf-fil.<\/p>\n<p><strong>P\u00e5 mongo0:<\/strong><\/p>\n<pre><code class=\"language-markdown\"># network interfaces\nnet:\nport: 27017\nbindIp: 127.0.0.1,mongo0.replset.member# replica set\nreplication:\nreplSetName: \"rs0\"<\/code><\/pre>\n<p><strong>P\u00e5 mongo0: P\u00e5 mongo1:<\/strong><\/p>\n<pre><code class=\"language-markdown\"># network interfaces\nnet:\nport: 27017\nbindIp: 127.0.0.1,mongo1.replset.member\nreplication:\nreplSetName: \"rs0\"<\/code><\/pre>\n<p><strong>P\u00e5 mongo2:<\/strong><\/p>\n<pre><code class=\"language-markdown\"># network interfaces\nnet:\nport: 27017\nbindIp: 127.0.0.1,mongo2.replset.member\nreplication:\nreplSetName: \"rs0\"<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Hvis du \u00f8nsker at \u00e6ndre direktivv\u00e6rdien fra rs0, skal du s\u00f8rge for at erstatte den samme i ovenst\u00e5ende kommandoer. Du kan navngive direktivet som du vil, men s\u00f8rg for at det er beskrivende nok. N\u00e5r opdateringerne er afsluttet, skal du genstarte mongod-tjenesten i hver instans for at genindl\u00e6se konfigurationer.<\/p>\n<\/aside>\n\n<pre><code class=\"language-markdown\">sudo systemctl restart mongod<\/code><\/pre>\n<p>Dermed har du aktiveret replikering for hver serveres MongoDB-instans.<\/p>\n<p>Du kan nu initialisere replikas\u00e6ttet ved hj\u00e6lp af metoden <code>rs.initiate()<\/code>. Denne metode skal kun udf\u00f8res p\u00e5 en enkelt MongoDB-instans i replikas\u00e6ttet. S\u00f8rg for, at replikas\u00e6ttets navn og medlem svarer til de konfigurationer, du tidligere har foretaget i hver konfigurationsfil.<\/p>\n<pre><code class=\"language-markdown\">rs.initiate(\n  {\n    _id: \"rs0\",\n    members: [\n      { _id: 0, host: \"mongo0.replset.member\" },\n      { _id: 1, host: \"mongo1.replset.member\" },\n      { _id: 2, host: \"mongo2.replset.member\" }\n    ]\n  }\n)<\/code><\/pre>\n<p>Hvis metoden returnerer &#8220;ok&#8221;: 1 i output, betyder det, at replikas\u00e6ttet blev startet korrekt. Nedenfor er et eksempel p\u00e5, hvordan output skal se ud:<\/p>\n<pre><code class=\"language-markdown\"> \"ok\": 1,\n  \"$clusterTime\": {\n    \"clusterTime\": Timestamp(1612389071, 1),\n    \"signature\": {\n      \"hash\": BinData(0, \"AAAAAAAAAAAAAAAAAAAAAAAAAAA=\"),\n      \"keyId\": NumberLong(0)\n    }\n  },\n  \"operationTime\": Timestamp(1612389071, 1)\n}<\/code><\/pre>\n<h4>Shut Down MongoDB Server<\/h4>\n<p>Du kan lukke en MongoDB-server ned ved at bruge metoden <code>db.shutdownServer()<\/code>. Nedenfor er syntaksen for det samme. B\u00e5de <code>force<\/code> og <code>timeoutsecs<\/code> er <a href=\"https:\/\/www.mongodb.com\/docs\/v5.0\/reference\/method\/db.shutdownServer\/#mongodb-method-db.shutdownServer\" target=\"_blank\" rel=\"noopener noreferrer\">valgfrie parametre<\/a>.<\/p>\n<pre><code class=\"language-markdown\">db.shutdownServer({\n  force: &lt;boolean&gt;,\n  timeoutSecs: &lt;int&gt;\n})<\/code><\/pre>\n<p>Denne metode kan mislykkes, hvis mongod-replikas\u00e6tmedlemmet k\u00f8rer visse operationer som indeksopbygninger. For at afbryde operationerne og tvinge medlemmet til at lukke ned, kan du indtaste den boolske parameter <code> force <\/code> til true.<\/p>\n<h4>Genstart MongoDB med &#8211;replSet<\/h4>\n<p>For at nulstille konfigurationen skal du s\u00f8rge for, at alle ndoes i dit replikas\u00e6t er stoppet. Slet derefter den lokale database for hver node. Start den igen med flaget <code>\u2013replSet<\/code>, og k\u00f8r <code>rs.initiate()<\/code> p\u00e5 kun \u00e9n mongod-instans for replikas\u00e6ttet.<\/p>\n<pre><code class=\"language-markdown\">mongod --replSet \"rs0\"<\/code><\/pre>\n<p><code>rs.initiate()<\/code> kan tage et valgfrit replikas\u00e6tkonfigurationsdokument, nemlig:<\/p>\n<ul>\n<li>Indstillingen <code>Replication.replSetName<\/code> eller <code>\u2014replSet<\/code> til at angive replikas\u00e6tnavnet i feltet <code>_id<\/code>.<\/li>\n<li>Arrayet &#8220;members&#8221;, som indeholder et dokument for hvert replikas\u00e6tmedlem.<\/li>\n<\/ul>\n<p>Metoden <code>rs.initiate()<\/code> udl\u00f8ser et valg og v\u00e6lger et af medlemmerne til at v\u00e6re det prim\u00e6re.<\/p>\n<h4>Tilf\u00f8j medlemmer til replikas\u00e6ttet<\/h4>\n<p>Hvis du vil tilf\u00f8je medlemmer til s\u00e6ttet, skal du starte mongod-instanser p\u00e5 forskellige maskiner. Start derefter en mongo-klient og brug kommandoen <code>rs.add()<\/code>.<\/p>\n<p>Kommandoen <code>rs.add()<\/code> har f\u00f8lgende grundl\u00e6ggende syntaks:<\/p>\n<pre><code class=\"language-markdown\">rs.add(HOST_NAME:PORT)<\/code><\/pre>\n<p>For eksempel,<\/p>\n<p>Antag, at mongo1 er din mongod-instans, og at den lytter p\u00e5 port 27017. Brug Mongo-klientkommandoen <code>rs.add()<\/code> til at tilf\u00f8je denne instans til replikas\u00e6ttet.<\/p>\n<pre><code class=\"language-markdown\">rs.add(\"mongo1:27017\")<\/code><\/pre>\n<p>F\u00f8rst n\u00e5r du har forbindelse til den prim\u00e6re node, kan du tilf\u00f8je en mongod-instans til replikas\u00e6ttet. Du kan kontrollere, om du har forbindelse til den prim\u00e6re, ved at bruge kommandoen <code>db.isMaster()<\/code>.<\/p>\n<h4>Fjern medlemmer<\/h4>\n<p>For at fjerne et medlem kan vi bruge <code>rs.remove()<\/code><\/p>\n<p>For at g\u00f8re det skal du f\u00f8rst lukke den mongod-instans, du \u00f8nsker at fjerne, ned ved hj\u00e6lp af den <code>db.shutdownServer()<\/code> metode, som vi diskuterede ovenfor.<\/p>\n<p>Derefter skal du oprette forbindelse til replikas\u00e6ttets nuv\u00e6rende prim\u00e6re. For at bestemme den aktuelle prim\u00e6re skal du bruge <code>db.hello()<\/code>, mens du har forbindelse til et medlem af replikas\u00e6ttet. N\u00e5r du har fundet den prim\u00e6re, skal du k\u00f8re en af f\u00f8lgende kommandoer:<\/p>\n<pre><code class=\"language-markdown\">rs.remove(\"mongodb-node-04:27017\")\nrs.remove(\"mongodb-node-04\")<\/code><\/pre>\n<figure id=\"attachment_148339\" aria-describedby=\"caption-attachment-148339\" style=\"width: 900px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Code-Snippet-for-Node-Removal-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-148339\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Code-Snippet-for-Node-Removal-1.png\" alt=\"This is a snapshot of the output after carrying out the rs.remove() command.\" width=\"900\" height=\"267\"><\/a><figcaption id=\"caption-attachment-148339\" class=\"wp-caption-text\">Ovenst\u00e5ende billede viser, at node er blevet fjernet fra replikas\u00e6ttet med succes. (Billedkilde: <a href=\"https:\/\/www.bmc.com\/blogs\/mongodb-replication\/\" target=\"_blank\" rel=\"noopener noreferrer\">Bmc<\/a>)<\/figcaption><\/figure>\n<p>Hvis replikas\u00e6ttet skal v\u00e6lge en ny prim\u00e6r, kan MongoDB afbryde shell&#8217;en kortvarigt. I dette scenarie vil den automatisk genforbinde igen. Den kan ogs\u00e5 vise en fejl <code>DBClientCursor::init call()<\/code> failed error, selv om kommandoen lykkes.<\/p>\n<h3>Metode 2: Konfigurering af et MongoDB-repliks\u00e6t til implementering og test<\/h3>\n<p>Generelt kan du konfigurere replikas\u00e6t til testning enten med RBAC aktiveret eller deaktiveret. I denne metode vil vi ops\u00e6tte replikas\u00e6t med adgangskontrol deaktiveret for at <a href=\"https:\/\/kinsta.com\/blog\/what-is-a-full-stack-developer\/\">distribuere<\/a> det i et testmilj\u00f8.<\/p>\n<p>F\u00f8rst skal du oprette mapper for alle de instanser, der er en del af replikas\u00e6ttet, ved hj\u00e6lp af f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-markdown\">mkdir -p \/srv\/mongodb\/replicaset0-0  \/srv\/mongodb\/replicaset0-1 \/srv\/mongodb\/replicaset0-2<\/code><\/pre>\n<p>Denne kommando vil oprette mapper for tre MongoDB-instanser replicaset0-0, replicaset0-1 og replicaset0-2. Start nu MongoDB-instanserne for hver af dem ved hj\u00e6lp af f\u00f8lgende s\u00e6t kommandoer:<\/p>\n<p><strong>For Server 1:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongod --replSet replicaset --port 27017 --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt; --dbpath \/srv\/mongodb\/replicaset0-0  --oplogSize 128<\/code><\/pre>\n<p><strong>For Server 2: For Server 1: For Server 2:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongod --replSet replicaset --port 27018 --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt; --dbpath \/srv\/mongodb\/replicaset0-0  --oplogSize 128<\/code><\/pre>\n<p><strong>For Server 3:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongod --replSet replicaset --port 27019 --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt; --dbpath \/srv\/mongodb\/replicaset0-0  --oplogSize 128<\/code><\/pre>\n<p>Parameteren <code>\u2013oplogSize<\/code> bruges til at forhindre, at maskinen bliver overbelastet i testfasen. Den er med til at reducere den m\u00e6ngde diskplads, som hver disk bruger.<\/p>\n<p>Opret nu forbindelse til en af instanserne ved hj\u00e6lp af Mongo-skallen ved at oprette forbindelse ved hj\u00e6lp af nedenst\u00e5ende portnummer.<\/p>\n<pre><code class=\"language-markdown\">mongo --port 27017<\/code><\/pre>\n<p>Vi kan bruge kommandoen <code>rs.initiate()<\/code> til at starte replikeringsprocessen. Du skal erstatte parameteren <code>hostname<\/code> med dit systemnavn.<\/p>\n<pre><code class=\"language-markdown\">rs conf = {\n\n  _id: \"replicaset0\",\n\n  members: [\n\n    {  _id: 0,  host: \"&lt;hostname&gt;:27017},\n\n    {  _id: 1,  host: \"&lt;hostname&gt;:27018\"},\n\n    {  _id: 2,  host: \"&lt;hostname&gt;:27019\"}\n\n   ] }<\/code><\/pre>\n<p>Du kan nu sende konfigurationsobjektfilen som parameter for initiate-kommandoen og bruge den p\u00e5 f\u00f8lgende m\u00e5de:<\/p>\n<pre><code class=\"language-markdown\">rs.initiate(rsconf)<\/code><\/pre>\n<p>Og der har du det! Du har med succes oprettet et MongoDB-repliks\u00e6t til <a href=\"https:\/\/kinsta.com\/blog\/backend-developer\/\">udviklings-<\/a> og testform\u00e5l.<\/p>\n<h3>Metode 3: Omdannelse af en standalone-instans til et MongoDB-repliks\u00e6t<\/h3>\n<p>MongoDB giver sine brugere mulighed for at omdanne deres standalone-instanser til replikas\u00e6t. Mens standalone-instanser for det meste bruges til test- og udviklingsfasen, er replikas\u00e6t en del af produktionsmilj\u00f8et.<\/p>\n<p>For at komme i gang, skal vi lukke vores mongod-instans ned med f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-markdown\">db.adminCommand({\"shutdown\":\"1\"})<\/code><\/pre>\n<p>Genstart din instans ved at bruge parameteren <code>\u2013repelSet<\/code> i din kommando til at angive det replikas\u00e6t, du vil bruge:<\/p>\n<pre><code class=\"language-markdown\">mongod --port 27017 \u2013 dbpath \/var\/lib\/mongodb  --replSet replicaSet1 --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt;<\/code><\/pre>\n<p>Du skal angive navnet p\u00e5 din server sammen med den unikke adresse i kommandoen.<\/p>\n<p>Opret forbindelse til shell&#8217;en med din MongoDB-instans, og brug initiate-kommandoen til at starte replikeringsprocessen og konvertere instansen til et replikas\u00e6t med succes. Du kan udf\u00f8re alle de grundl\u00e6ggende operationer som f.eks. tilf\u00f8jelse eller fjernelse af en instans ved hj\u00e6lp af f\u00f8lgende kommandoer:<\/p>\n<pre><code class=\"language-markdown\">rs.add(\u201c&lt;host_name:port&gt;\u201d)<\/code><\/pre>\n<pre><code class=\"language-markdown\">rs.remove(\u201chost-name\u201d)<\/code><\/pre>\n<p>Du kan desuden kontrollere status for dit MongoDB-repliks\u00e6t ved hj\u00e6lp af kommandoerne <code>rs.status()<\/code> og <code>rs.conf()<\/code>.<\/p>\n<h3>Metode 4: MongoDB Atlas &#8211; et enklere alternativ<\/h3>\n<p>Replikering og <a href=\"https:\/\/kinsta.com\/blog\/mongodb-sharding\/\">sharding<\/a> kan arbejde sammen for at danne noget, der kaldes en sharded cluster. Mens ops\u00e6tning og konfiguration kan v\u00e6re ret tidskr\u00e6vende, om end ukompliceret, er MongoDB Atlas et bedre alternativ end de f\u00f8rn\u00e6vnte metoder.<\/p>\n<p>Det automatiserer dine replikas\u00e6t, hvilket g\u00f8r processen nem at implementere. Den kan implementere globalt shardede replikas\u00e6t med f\u00e5 klik, hvilket muligg\u00f8r disaster recovery, nemmere <a href=\"https:\/\/kinsta.com\/dk\/blog\/adminer\/\">administration<\/a>, datalokalitet og multiregionale implementeringer.<\/p>\n<p>I MongoDB Atlas skal vi oprette klynger &#8211; de kan enten v\u00e6re et replikas\u00e6t eller en sharded klynge. For et bestemt projekt er antallet af nodes i en klynge i andre regioner begr\u00e6nset til i alt 40 nodes.<\/p>\n<p>Dette udelukker de gratis eller delte klynger og Google cloud-regionerne, der kommunikerer med hinanden. Det samlede antal nodes mellem to regioner skal overholde denne begr\u00e6nsning. Hvis der f.eks. er et projekt, hvor f.eks:<\/p>\n<ul>\n<li>Region A har 15 nodepunkter.<\/li>\n<li>Region B har 25 nodes<\/li>\n<li>Region C har 10 nodes<\/li>\n<\/ul>\n<p>Vi kan kun tildele 5 nodes mere til region C, da,<\/p>\n<ol>\n<li>Region A+ Region B = 40; opfylder begr\u00e6nsningen om, at 40 er det maksimalt tilladte antal nodes.<\/li>\n<li>Region B+ Region C = 25+10+5 (yderligere nodes tildelt C) = 40; opfylder begr\u00e6nsningen om, at 40 er det maksimalt tilladte antal nodes.<\/li>\n<li>Region A+ Region C = 15+10+5 (yderligere nodes tildelt C) = 30; opfylder begr\u00e6nsningen om, at 40 er det maksimalt tilladte antal nodes.<\/li>\n<\/ol>\n<p>Hvis vi tildeler 10 nodes mere til region C, s\u00e5 region C f\u00e5r 20 nodes, er region B + region C = 45 nodess. Dette ville overskride den givne begr\u00e6nsning, s\u00e5 du kan muligvis ikke oprette en klynge med flere regioner.<\/p>\n<p>N\u00e5r du opretter en klynge, opretter Atlas en netv\u00e6rkscontainer i projektet for cloududbyderen, hvis den ikke var der tidligere. Hvis du vil oprette en replikas\u00e6tklynge i MongoDB Atlas, skal du k\u00f8re f\u00f8lgende kommando i Atlas CLI:<\/p>\n<pre><code class=\"language-markdown\">atlas clusters create [name] [options]<\/code><\/pre>\n<p>S\u00f8rg for at angive et beskrivende klyngenavn, da det ikke kan \u00e6ndres, efter at klyngen er oprettet. Argumentet kan indeholde ASCII-bogstaver, tal og bindestreger.<\/p>\n<p>Der er <a href=\"https:\/\/www.mongodb.com\/docs\/atlas\/cli\/stable\/command\/atlas-clusters-create\/\" target=\"_blank\" rel=\"noopener noreferrer\">flere<\/a> muligheder for klyngeoprettelse i MongoDB baseret p\u00e5 dine krav. Hvis du f.eks. \u00f8nsker kontinuerlig cloud-backup for din klynge, skal du indstille <code>--backup<\/code> til true.<\/p>\n<h2>H\u00e5ndtering af replikeringsforsinkelse<\/h2>\n<p>Replikeringsforsinkelse kan v\u00e6re ret afskr\u00e6kkende. Det er en forsinkelse mellem en operation p\u00e5 den prim\u00e6re og anvendelsen af denne operation fra oplog til den sekund\u00e6re. Hvis din virksomhed besk\u00e6ftiger sig med store datas\u00e6t, forventes en forsinkelse inden for en vis t\u00e6rskel. Nogle gange kan eksterne faktorer dog ogs\u00e5 bidrage og \u00f8ge forsinkelsen. For at f\u00e5 gavn af en opdateret replikering skal du sikre dig, at:<\/p>\n<ol>\n<li>Du dirigerer din netv\u00e6rkstrafik i en stabil og tilstr\u00e6kkelig b\u00e5ndbredde. Netv\u00e6rkslatens spiller en stor rolle i forhold til at p\u00e5virke din replikation, og hvis netv\u00e6rket ikke er tilstr\u00e6kkeligt til at im\u00f8dekomme replikationsprocessens behov, vil der opst\u00e5 forsinkelser i replikationen af data i hele replikas\u00e6ttet.<\/li>\n<li>Du har en tilstr\u00e6kkelig diskgennemstr\u00f8mning. Hvis filsystemet og diskenheden p\u00e5 den sekund\u00e6re ikke er i stand til at skylle data til disken lige s\u00e5 hurtigt som den prim\u00e6re, vil den sekund\u00e6re have sv\u00e6rt ved at f\u00f8lge med. Derfor behandler de sekund\u00e6re nodes skriveforesp\u00f8rgsler langsommere end den prim\u00e6re node. Dette er et almindeligt problem i de fleste systemer med flere lejere, herunder virtualiserede instanser og implementeringer i stor skala.<\/li>\n<li>Du anmoder om en skrivebekr\u00e6ftelse skrivebekr\u00e6ftelse efter et interval for at give sekund\u00e6re nodepunkter mulighed for at indhente den prim\u00e6re, is\u00e6r n\u00e5r du \u00f8nsker at udf\u00f8re en bulk load-operation eller dataindl\u00e6sning, der kr\u00e6ver et stort antal skrivninger til den prim\u00e6re nodepunkt. De sekund\u00e6re enheder vil ikke v\u00e6re i stand til at l\u00e6se uploggen hurtigt nok til at f\u00f8lge med i \u00e6ndringerne; is\u00e6r ikke med ubekr\u00e6ftede skriveinteresser.<\/li>\n<li>Du identificerer de k\u00f8rende baggrundsopgaver. Visse opgaver som f.eks. cronjobs, serveropdateringer og sikkerhedskontroller kan have uventede virkninger p\u00e5 netv\u00e6rks- eller diskforbruget og for\u00e5rsage forsinkelser i replikeringsprocessen.<\/li>\n<\/ol>\n<p>Hvis du er usikker p\u00e5, om der er en replikeringsforsinkelse i dit program, skal du ikke bekymre dig &#8211; i n\u00e6ste afsnit diskuteres fejlfindingsstrategier!<\/p>\n<h2>Fejlfinding af MongoDB replikas\u00e6t<\/h2>\n<p>Du har opsat dine replikas\u00e6t med succes, men du bem\u00e6rker, at dine data er inkonsistente p\u00e5 tv\u00e6rs af serverne. Dette er st\u00e6rkt alarmerende for store virksomheder, men med hurtige <a href=\"https:\/\/kinsta.com\/dk\/blog\/reparerer-wordpress-database\/\">fejlfindingsmetoder <\/a>kan du finde \u00e5rsagen eller endda rette op p\u00e5 problemet! Nedenfor er angivet nogle almindelige strategier til fejlfinding af replikas\u00e6t-implementeringer, som kan v\u00e6re nyttige:<\/p>\n<h3>Kontroller replikatstatus<\/h3>\n<p>Vi kan kontrollere replikas\u00e6ttets aktuelle status og status for hvert medlem ved at k\u00f8re f\u00f8lgende kommando i en mongosh-session, der er forbundet med et replikas\u00e6tets prim\u00e6re.<\/p>\n<pre><code class=\"language-markdown\"> rs.status()<\/code><\/pre>\n<h3>Kontroller replikationsforsinkelsen<\/h3>\n<p>Som tidligere omtalt kan replikationsforsinkelse v\u00e6re et alvorligt problem, da det g\u00f8r &#8220;forsinkede&#8221; medlemmer uegnet til hurtigt at blive prim\u00e6re og \u00f8ger muligheden for, at distribuerede l\u00e6seoperationer vil v\u00e6re inkonsistente. Vi kan kontrollere den aktuelle l\u00e6ngde af replikationsloggen ved at bruge f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-markdown\">rs.printSecondaryReplicationInfo()<\/code><\/pre>\n<p>Dette returnerer v\u00e6rdien <code>syncedTo<\/code>, som er det tidspunkt, hvor den sidste oplogpost blev skrevet til den sekund\u00e6re for hvert medlem. Her er et eksempel til at demonstrere det samme:<\/p>\n<pre><code class=\"language-markdown\">source: m1.example.net:27017\n    syncedTo: Mon Oct 10 2022 10:19:35 GMT-0400 (EDT)\n    0 secs (0 hrs) behind the primary\nsource: m2.example.net:27017\n    syncedTo: Mon Oct 10 2022 10:19:35 GMT-0400 (EDT)\n    0 secs (0 hrs) behind the primary<\/code><\/pre>\n<p>Et forsinket medlem kan vises som 0 sekunder bagud i forhold til det prim\u00e6re, n\u00e5r inaktivitetsperioden p\u00e5 det prim\u00e6re er st\u00f8rre end <code> members[n].secondaryDelaySecs<\/code> -v\u00e6rdien.<\/p>\n<h3>Test af forbindelserne mellem alle medlemmer<\/h3>\n<p>Hvert medlem af et replikas\u00e6t skal kunne oprette forbindelse med alle andre medlemmer. S\u00f8rg altid for at verificere forbindelserne i begge retninger. For det meste forhindrer firewallkonfigurationer eller netv\u00e6rkstopologier normale og n\u00f8dvendige forbindelser, hvilket kan blokere replikering.<\/p>\n<p>Lad os f.eks. antage, at mongod-instansen binder sig til b\u00e5de localhost og hostname &#8220;ExampleHostname&#8221;, som er forbundet med IP-adressen 198.41.110.1:<\/p>\n<pre><code class=\"language-markdown\">mongod --bind_ip localhost, ExampleHostname<\/code><\/pre>\n<p>For at oprette forbindelse til denne instans skal fjernklienter angive v\u00e6rtsnavnet eller IP-adressen for at oprette forbindelse til denne instans:<\/p>\n<pre><code class=\"language-markdown\">mongosh --host ExampleHostname\nmongosh --host 198.41.110.1<\/code><\/pre>\n<p>Hvis et replikas\u00e6t best\u00e5r af tre medlemmer, m1, m2 og m3, der bruger standardport 27017, skal du teste forbindelsen som nedenfor:<\/p>\n<p><strong>P\u00e5 m1:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongosh --host m2 --port 27017\nmongosh --host m3 --port 27017<\/code><\/pre>\n<p><strong>P\u00e5 m2:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongosh --host m1 --port 27017\nmongosh --host m3 --port 27017<\/code><\/pre>\n<p><strong>P\u00e5 m3:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongosh --host m1 --port 27017\nmongosh --host m2 --port 27017<\/code><\/pre>\n<p>Hvis en forbindelse i en hvilken som helst retning mislykkes, skal du kontrollere din <a href=\"https:\/\/kinsta.com\/blog\/what-is-a-firewall\/\">firewallkonfiguration<\/a> og omkonfigurere den, s\u00e5 den tillader forbindelserne.<\/p>\n<h2>Sikring af sikker kommunikation med n\u00f8glefilgodkendelse<\/h2>\n<p>Som standard er n\u00f8glefilsautentificering i MongoDB baseret p\u00e5 den saltet udfordringssvarsautentificeringsmekanisme (SCRAM). For at g\u00f8re dette skal MongoDB l\u00e6se og validere brugerens angivne legitimationsoplysninger, der omfatter en kombination af brugernavn, adgangskode og den godkendelsesdatabase, som den specifikke MongoDB-instans er bekendt med. Dette er den n\u00f8jagtige mekanisme, der bruges til at autentificere brugere, der angiver en adgangskode, n\u00e5r de opretter forbindelse til databasen.<\/p>\n<p>N\u00e5r du aktiverer autentificering i MongoDB, aktiveres RBAC (Role-Based Access Control) automatisk for replikas\u00e6ttet, og brugeren tildeles en eller flere roller, som bestemmer deres adgang til databasens ressourcer. N\u00e5r RBAC er aktiveret, betyder det, at kun den gyldige autentificerede Mongo-bruger med de relevante rettigheder vil kunne f\u00e5 adgang til ressourcerne p\u00e5 systemet.<\/p>\n<p>N\u00f8glefilen fungerer som en delt adgangskode for hvert medlem i klyngen. Dette g\u00f8r det muligt for hver mongod-instans i replikas\u00e6ttet at bruge indholdet af n\u00f8glefilen som den delte adgangskode til at autentificere andre medlemmer i implementeringen.<\/p>\n<p>Kun de mongod-instanser, der har den korrekte n\u00f8glefil, kan deltage i replikas\u00e6ttet. En n\u00f8gles l\u00e6ngde skal v\u00e6re mellem 6 og 1024 tegn og m\u00e5 kun indeholde tegn i base64-s\u00e6ttet. Bem\u00e6rk, at MongoDB fjerner whitespace-tegn, n\u00e5r n\u00f8gler l\u00e6ses.<\/p>\n<p>Du kan <strong>generere en n\u00f8glefil<\/strong> ved hj\u00e6lp af forskellige metoder. I denne vejledning bruger vi <code>openssl <\/code> til at generere en kompleks 1024-vilk\u00e5rlig tegnstreng til brug som en delt adgangskode. Derefter bruges <code>chmod<\/code> til at \u00e6ndre filtilladelser til kun at give l\u00e6setilladelser til filens ejer. Undg\u00e5 at gemme n\u00f8glefilen p\u00e5 lagringsmedier, der let kan afbrydes fra den hardware, der er host for mongod-instanserne, f.eks. et USB-drev eller en netv\u00e6rkstilsluttet lagerenhed. Nedenfor er kommandoen til at generere en n\u00f8glefil:<\/p>\n<pre><code class=\"language-markdown\">openssl rand -base64 756 &gt; &lt;path-to-keyfile&gt;\nchmod 400 &lt;path-to-keyfile&gt;<\/code><\/pre>\n<p>Derefter <strong>kopieres n\u00f8glefilen til hvert replikas\u00e6tmedlem<\/strong>. S\u00f8rg for, at den bruger, der k\u00f8rer mongod-instanserne, er ejer af filen og kan f\u00e5 adgang til n\u00f8glefilen. N\u00e5r du har gjort ovenst\u00e5ende, skal du <strong>lukke alle medlemmer af replikas\u00e6ttet ned<\/strong>, begyndende med de sekund\u00e6re. N\u00e5r alle sekund\u00e6re enheder er offline, kan du g\u00e5 videre og lukke den prim\u00e6re ned. Det er vigtigt at f\u00f8lge denne r\u00e6kkef\u00f8lge for at forhindre potentielle rollbacks. Luk nu mongod-instansen ned ved at k\u00f8re f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-markdown\">use admin\ndb.shutdownServer()<\/code><\/pre>\n<p>N\u00e5r kommandoen er k\u00f8rt, vil alle medlemmer af replikas\u00e6ttet v\u00e6re offline.<strong> Genstart<\/strong> nu<strong> hvert medlem af replikas\u00e6ttet med adgangskontrol aktiveret<\/strong>.<\/p>\n<p>For hvert medlem af replikas\u00e6ttet skal du starte mongod-instansen med enten konfigurationsfilen <code>security.keyFile<\/code> eller kommandolinjeindstillingen <code>--keyFile<\/code>.<\/p>\n<p>Hvis du bruger en konfigurationsfil, skal du indstille<\/p>\n<ul>\n<li>security.keyFile til n\u00f8glefilens sti, og<\/li>\n<li>replication.replSetName til replikas\u00e6ttets navn.<\/li>\n<\/ul>\n<pre><code class=\"language-markdown\">security:\n  keyFile: &lt;path-to-keyfile&gt;\nreplication:\n  replSetName: &lt;replicaSetName&gt;\nnet:\n   bindIp: localhost,&lt;hostname(s)|ip address(es)&gt;<\/code><\/pre>\n<p>Start mongod-instansen ved hj\u00e6lp af konfigurationsfilen:<\/p>\n<pre><code class=\"language-markdown\">mongod --config &lt;path-to-config-file&gt;<\/code><\/pre>\n<p>Hvis du bruger kommandolinjeindstillingerne, skal du starte mongod-instansen med f\u00f8lgende indstillinger:<\/p>\n<ul>\n<li>&#8211;keyFile indstillet til stien til n\u00f8glefilen, og<\/li>\n<li>&#8211;replSet indstillet til navnet p\u00e5 replikas\u00e6ttet.<\/li>\n<\/ul>\n<pre><code class=\"language-markdown\">mongod --keyFile &lt;path-to-keyfile&gt; --replSet &lt;replicaSetName&gt; --bind_ip localhost,&lt;hostname(s)|ip address(es)&gt;<\/code><\/pre>\n<p>Du kan inkludere yderligere indstillinger, hvis det er n\u00f8dvendigt for din konfiguration. Hvis du f.eks. \u00f8nsker, at fjernklienter skal oprette forbindelse til din implementering, eller hvis dine implementeringsmedlemmer k\u00f8rer p\u00e5 forskellige v\u00e6rter, skal du angive &#8211;bind_ip. Du kan finde flere oplysninger under <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/release-notes\/3.6-compatibility\/#std-label-3.6-bind_ip-compatibility\" target=\"_blank\" rel=\"noopener noreferrer\">\u00c6ndringer af kompatibilitetskompatibiliteten for bindinger til lokale hosts<\/a>.<\/p>\n<p>Derefter skal du oprette <strong>forbindelse til et medlem af replikas\u00e6ttet via localhost-gr\u00e6nsefladen<\/strong>. Du skal k\u00f8re mongosh p\u00e5 den samme fysiske maskine som mongod-instansen. Denne gr\u00e6nseflade er kun tilg\u00e6ngelig, n\u00e5r der ikke er oprettet nogen brugere til implementeringen, og den lukker automatisk efter oprettelsen af den f\u00f8rste bruger.<\/p>\n<p>Vi starter derefter replikas\u00e6ttet. Fra mongosh skal du k\u00f8re metoden <code>rs.initiate()<\/code>:<\/p>\n<pre><code class=\"language-markdown\">rs.initiate(\n  {\n    _id: \"myReplSet\",\n    members: [\n      { _id: 0, host: \"mongo1:27017\" },\n      { _id: 1, host: \"mongo2:27017\" },\n      { _id: 2, host: \"mongo3:27017\" }\n    ]\n  }\n)<\/code><\/pre>\n<p>Som tidligere n\u00e6vnt v\u00e6lger denne metode et af medlemmerne til at v\u00e6re det prim\u00e6re medlem af replikas\u00e6ttet. For at finde det prim\u00e6re medlem skal du bruge <code>rs.status()<\/code>. Opret forbindelse til det prim\u00e6re medlem, f\u00f8r du forts\u00e6tter.<\/p>\n<p><strong>Opret<\/strong> <strong>nu<\/strong> <strong>brugeren administrator<\/strong>. Du kan tilf\u00f8je en bruger ved hj\u00e6lp af metoden <code>db.createUser()<\/code>. S\u00f8rg for, at brugeren som minimum skal have rollen <code>userAdminAnyDatabase<\/code> p\u00e5 admin-databasen.<\/p>\n<p>F\u00f8lgende eksempel opretter brugeren &#8220;batman&#8221; med rollen <code>userAdminAnyDatabase<\/code> p\u00e5 administratordatabasen:<\/p>\n<pre><code class=\"language-markdown\">admin = db.getSiblingDB(\"admin\")\nadmin.createUser(\n  {\n    user: \"batman\",\n    pwd: passwordPrompt(), \/\/ or cleartext password\n    roles: [ { role: \"userAdminAnyDatabase\", db: \"admin\" } ]\n  }\n)<\/code><\/pre>\n<p>Indtast den adgangskode, der blev oprettet tidligere, n\u00e5r du bliver bedt om det.<\/p>\n<p>Dern\u00e6st skal du <strong>godkende dig som brugeradministrator<\/strong>. Det skal du g\u00f8re ved at bruge <code>db.auth()<\/code> til at godkende. For eksempel:<\/p>\n<p>db.getSiblingDB(&#8220;admin&#8221;).auth(&#8220;batman&#8221;, passwordPrompt()) \/\/ eller en klartekstadgangskode<\/p>\n<p>Alternativt kan du forbinde en ny mongosh-instans til det prim\u00e6re replikas\u00e6tmedlem ved hj\u00e6lp af parametrene <code>-u &lt;username&gt;<\/code>,<code> -p &lt;password&gt;<\/code> og <code>--authenticationDatabase<\/code>.<\/p>\n<pre><code class=\"language-markdown\">mongosh -u \"batman\" -p  --authenticationDatabase \"admin\"<\/code><\/pre>\n<p>Selv hvis du ikke angiver adgangskoden i kommandolinjefeltet <code>-p<\/code>, beder mongosh om adgangskoden.<\/p>\n<p>Til sidst skal du <strong>oprette klyngeadministratoren<\/strong>. Rollen <code>clusterAdmin<\/code> giver adgang til replikationsoperationer, f.eks. konfiguration af replikas\u00e6ttet.<\/p>\n<p>Lad os oprette en klyngeadministratorbruger og tildele rollen <code>clusterAdmin<\/code> i admin-databasen:<\/p>\n<pre><code class=\"language-markdown\">db.getSiblingDB(\"admin\").createUser(\n  {\n    \"user\": \"robin\",\n    \"pwd\": passwordPrompt(),     \/\/ or cleartext password\n    roles: [ { \"role\" : \"clusterAdmin\", \"db\" : \"admin\" } ]\n  }\n)<\/code><\/pre>\n<p>Indtast adgangskoden, n\u00e5r du bliver bedt om det.<\/p>\n<p>Hvis du \u00f8nsker det, kan du oprette yderligere brugere for at tillade klienter og interagere med replikas\u00e6ttet.<\/p>\n<p>Og voila! Du har aktiveret n\u00f8glefilsautentifikation med succes!<\/p>\n\n<h2>Oversigt<\/h2>\n<p>Replikering har v\u00e6ret et vigtigt krav, n\u00e5r det g\u00e6lder databaser, is\u00e6r i takt med at flere virksomheder skalerer op. Det forbedrer i h\u00f8j grad systemets <a href=\"https:\/\/kinsta.com\/blog\/apm-tools\/\">ydeevne<\/a>, datasikkerhed og tilg\u00e6ngelighed. N\u00e5r vi taler om ydeevne, er det centralt for din WordPress-database at overv\u00e5ge ydeevneproblemer og rette dem i tide og utide, for eksempel med <a href=\"https:\/\/kinsta.com\/dk\/apm-tool\/\">Kinsta APM<\/a>, Jetpack og Freshping for at n\u00e6vne nogle f\u00e5.<\/p>\n<p>Replikering hj\u00e6lper med at sikre databeskyttelse p\u00e5 tv\u00e6rs af flere servere og forhindrer dine servere i at lide under tunge nedetider(eller endnu v\u00e6rre &#8211; at miste dine data helt). I denne artikel d\u00e6kkede vi oprettelsen af et replikas\u00e6t og nogle tips til fejlfinding sammen med vigtigheden af replikering. Bruger du MongoDB-replikering til din virksomhed, og har det vist sig at v\u00e6re nyttigt for dig? Lad os vide det i kommentarfeltet nedenfor!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MongoDB er en NoSQL-database, der bruger JSON-lignende dokumenter med dynamiske skemaer. N\u00e5r du arbejder med databaser, er det altid godt at have en beredskabsplan, hvis en &#8230;<\/p>\n","protected":false},"author":199,"featured_media":49454,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[746],"class_list":["post-49453","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-web-udviklingsvaerktoejer"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder) - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"MongoDB replikas\u00e6t er en gruppe af sammenkoblede MongoDB-instanser, der giver redundans og h\u00f8j tilg\u00e6ngelighed. Implementer replikas\u00e6t og beskyt dine data!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder)\" \/>\n<meta property=\"og:description\" content=\"MongoDB replikas\u00e6t er en gruppe af sammenkoblede MongoDB-instanser, der giver redundans og h\u00f8j tilg\u00e6ngelighed. Implementer replikas\u00e6t og beskyt dine data!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-16T07:48:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T05:32:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jeremy Holcombe\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"MongoDB replikas\u00e6t er en gruppe af sammenkoblede MongoDB-instanser, der giver redundans og h\u00f8j tilg\u00e6ngelighed. Implementer replikas\u00e6t og beskyt dine data!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Holcombe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/\"},\"author\":{\"name\":\"Jeremy Holcombe\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\"},\"headline\":\"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder)\",\"datePublished\":\"2023-03-16T07:48:23+00:00\",\"dateModified\":\"2023-08-24T05:32:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/\"},\"wordCount\":5797,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg\",\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/\",\"name\":\"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder) - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg\",\"datePublished\":\"2023-03-16T07:48:23+00:00\",\"dateModified\":\"2023-08-24T05:32:09+00:00\",\"description\":\"MongoDB replikas\u00e6t er en gruppe af sammenkoblede MongoDB-instanser, der giver redundans og h\u00f8j tilg\u00e6ngelighed. Implementer replikas\u00e6t og beskyt dine data!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webudviklingsv\u00e6rkt\u00f8jer\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/web-udviklingsvaerktoejer\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\",\"name\":\"Jeremy Holcombe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"caption\":\"Jeremy Holcombe\"},\"description\":\"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jeremyholcombe\/\"],\"url\":\"https:\/\/kinsta.com\/dk\/blog\/author\/jeremyholcombe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder) - Kinsta\u00ae","description":"MongoDB replikas\u00e6t er en gruppe af sammenkoblede MongoDB-instanser, der giver redundans og h\u00f8j tilg\u00e6ngelighed. Implementer replikas\u00e6t og beskyt dine data!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/","og_locale":"da_DK","og_type":"article","og_title":"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder)","og_description":"MongoDB replikas\u00e6t er en gruppe af sammenkoblede MongoDB-instanser, der giver redundans og h\u00f8j tilg\u00e6ngelighed. Implementer replikas\u00e6t og beskyt dine data!","og_url":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2023-03-16T07:48:23+00:00","article_modified_time":"2023-08-24T05:32:09+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg","type":"image\/jpeg"}],"author":"Jeremy Holcombe","twitter_card":"summary_large_image","twitter_description":"MongoDB replikas\u00e6t er en gruppe af sammenkoblede MongoDB-instanser, der giver redundans og h\u00f8j tilg\u00e6ngelighed. Implementer replikas\u00e6t og beskyt dine data!","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg","twitter_creator":"@kinsta_dk","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Jeremy Holcombe","Estimeret l\u00e6setid":"26 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/"},"author":{"name":"Jeremy Holcombe","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21"},"headline":"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder)","datePublished":"2023-03-16T07:48:23+00:00","dateModified":"2023-08-24T05:32:09+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/"},"wordCount":5797,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg","inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/","url":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/","name":"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder) - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg","datePublished":"2023-03-16T07:48:23+00:00","dateModified":"2023-08-24T05:32:09+00:00","description":"MongoDB replikas\u00e6t er en gruppe af sammenkoblede MongoDB-instanser, der giver redundans og h\u00f8j tilg\u00e6ngelighed. Implementer replikas\u00e6t og beskyt dine data!","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/mongodb-replica-set.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-replikasaet\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"Webudviklingsv\u00e6rkt\u00f8jer","item":"https:\/\/kinsta.com\/dk\/emner\/web-udviklingsvaerktoejer\/"},{"@type":"ListItem","position":3,"name":"Opbyg et robust MongoDB-replikas\u00e6t p\u00e5 rekordtid (4 metoder)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21","name":"Jeremy Holcombe","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","caption":"Jeremy Holcombe"},"description":"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.","sameAs":["https:\/\/www.linkedin.com\/in\/jeremyholcombe\/"],"url":"https:\/\/kinsta.com\/dk\/blog\/author\/jeremyholcombe\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/49453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=49453"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/49453\/revisions"}],"predecessor-version":[{"id":52309,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/49453\/revisions\/52309"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/translations\/dk"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49453\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/49454"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=49453"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=49453"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=49453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}