{"id":51077,"date":"2023-03-16T08:45:29","date_gmt":"2023-03-16T07:45:29","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=51077&#038;preview=true&#038;preview_id=51077"},"modified":"2023-08-24T07:32:12","modified_gmt":"2023-08-24T05:32:12","slug":"mongodb-replicaset","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/","title":{"rendered":"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden)"},"content":{"rendered":"<p>MongoDB is een <a href=\"https:\/\/kinsta.com\/blog\/mongodb-vs-mysql\/\">NoSQL<\/a> database die gebruik maakt van JSON-achtige documenten met dynamische schema&#8217;s. Als je met databases werkt, is het altijd goed om een noodplan te hebben voor het geval een van je databaseservers uitvalt. Je kunt de kans hierop verkleinen door gebruik te maken van een <a href=\"https:\/\/kinsta.com\/nl\/mykinsta\/\">handige beheertool<\/a> voor je WordPress site.<\/p>\n<p>Daarom is het handig om veel kopie\u00ebn van je gegevens te hebben, wat meteen ook vertragingen met lezen vermindert. Tegelijkertijd kan het de schaalbaarheid en beschikbaarheid van de database verbeteren. Dit is waar replicatie je kan helpen. Het wordt gedefinieerd als het <a href=\"https:\/\/kinsta.com\/nl\/blog\/mysql-backup-database\/\">synchroniseren<\/a> van gegevens over meerdere <a href=\"https:\/\/kinsta.com\/nl\/blog\/open-source-database\/\">databases<\/a>.<\/p>\n<p>In dit artikel duiken we in de verschillende opvallende aspecten van MongoDB replicatie, zoals de mogelijkheden en het mechanisme, om er een paar te noemen.<\/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>Wat is replicatie in MongoDB?<\/h2>\n<p>In MongoDB voeren replicaset de replicaties uit. Dit is een groep servers die door middel van replicatie dezelfde dataset onderhouden. Je kunt MongoDB replicatie zelfs gebruiken als onderdeel van load balancing. Hier kun je de schrijf- en leesbewerkingen verdelen over alle instanties, gebaseerd op de use case.<\/p>\n\n<h2>Wat is een MongoDB replicaset?<\/h2>\n<p>Elke instantie van <a href=\"https:\/\/kinsta.com\/blog\/what-is-mongodb\/\">MongoDB<\/a> die deel uitmaakt van een bepaalde replicaset is een member. Elke replicaset moet een primaire member hebben en tenminste \u00e9\u00e9n secundaire member.<\/p>\n<p>De primaire member is het primaire toegangspunt voor transacties met de replicaset. Deze is ook de enige member die schrijfoperaties kan accepteren. Replicatie kopieert eerst het oplog (operations log) van de primaire member. Vervolgens herhaalt het de gelogde veranderingen op de respectieve datasets van de secondaries. Elke replicaset kan dus maar \u00e9\u00e9n primaire member tegelijk hebben, omdat verschillende primaries die schrijfoperaties ontvangen gegevensconflicten kunnen veroorzaken.<\/p>\n<p>Gewoonlijk bevragen de applicaties alleen de primaire member voor schrijf- en leesbewerkingen. Je kunt je opstelling zo ontwerpen dat er van \u00e9\u00e9n of meer secundaire members wordt gelezen. Asynchrone gegevensoverdracht kan ertoe leiden dat de leesbewerkingen van de secundaire nodes oude gegevens leveren. Zo&#8217;n opstelling is dus niet ideaal voor elk gebruik.<\/p>\n<h3>Replicaset features<\/h3>\n<p>Het automatische failovermechanisme onderscheidt de replicasets van MongoDB van de concurrentie. Bij het ontbreken van een primary kiest een geautomatiseerde verkiezing onder de secundaire nodes een nieuwe primary.<\/p>\n<h3>MongoDB replicaset vs MongoDB cluster<\/h3>\n<p>Een MongoDB replicaset maakt verschillende kopie\u00ebn van dezelfde dataset over de replicaset nodes. Het primaire doel van een replica set is:<\/p>\n<ul>\n<li>Een ingebouwde backupoplossing te bieden<\/li>\n<li>De beschikbaarheid van gegevens vergroten<\/li>\n<\/ul>\n<p>Een MongoDB cluster is helemaal anders. Het verdeelt de gegevens over vele nodes via een shardsleutel. Dit proces fragmenteert de gegevens in vele stukken, shards genaamd. Vervolgens kopieert het elke shard naar een andere node. Een cluster is bedoeld om grote gegevenssets en operaties met hoge doorvoer te ondersteunen. Dit wordt bereikt door de workload horizontaal te schalen.<\/p>\n<p>Dit is het verschil tussen een replicaset en een cluster, in makkelijk te begrijpen taal:<\/p>\n<ul>\n<li>Een cluster verdeelt de workload en slaat fragmenten van gegevens (shards) op over vele servers.<\/li>\n<li>Een replicaset dupliceert de gegevensset volledig.<\/li>\n<\/ul>\n<p>Met MongoDB kun je deze functionaliteiten combineren door een sharded cluster te maken. Hier kun je elke shard repliceren naar een secundaire server. Hierdoor kan een shard een hoge redundantie en gegevensbeschikbaarheid bieden.<\/p>\n<p>Het onderhouden en opzetten van een replicaset kan technisch belastend en tijdrovend zijn. En het vinden van de juiste hostingdienst? Misschien nog wel lastiger! Met zoveel potenti\u00eble kandidaten, is het gemakkelijk om uren kwijt te zijn aan onderzoek, in plaats van je bedrijf op te bouwen.<\/p>\n<p>Laat me je kort informeren over een tool dat dit alles en nog veel meer doet, zodat jij weer verder kunt met je dienst\/product.<\/p>\n<p>De <a href=\"https:\/\/sevalla.com\/application-hosting\/\">Applicatie Hosting<\/a> oplossing van Kinsta, waarop al meer dan 55.000 developers vertrouwen, kun je in slechts 3 eenvoudige stappen gebruiken. Als dat te mooi klinkt om waar te zijn, zijn hier nog enkele voordelen van het gebruik van Kinsta:<\/p>\n<ul>\n<li><strong>Geniet van betere prestaties met Kinsta&#8217;s interne verbindingen<\/strong>: Vergeet je struggles met gedeelde databases. Stap over op dedicated databases met interne verbindingen die geen limieten hebben op aantal query&#8217;s of rijen. Kinsta is sneller, veiliger en brengt je niet in rekening voor interne bandbreedte\/verkeer.<\/li>\n<li><strong>Een featureset op maat gemaakt voor developers<\/strong>: Schaal je applicatie op het robuuste platform dat Gmail, YouTube en Google Search ondersteunt. Wees gerust, je bent hier in de veiligste handen.<\/li>\n<li><strong>Profiteer van onge\u00ebvenaarde snelheden met een datacenter naar keuze<\/strong>: Kies de regio die het beste werkt voor jou en je klanten. Met meer dan 25 datacenters om uit te kiezen, zorgen Kinsta&#8217;s 300 PoP&#8217;s zorgen voor maximale snelheid en een wereldwijde aanwezigheid voor je website.<\/li>\n<\/ul>\n<p>Probeer <a href=\"https:\/\/kinsta.com\/nl\/registreren\/?product_type=app-db\">Kinsta&#8217;s Applicatie Hosting oplossing vandaag nog gratis<\/a> uit!<\/p>\n<h2>Hoe werkt replicatie in MongoDB?<\/h2>\n<p>In MongoDB stuur je schrijfoperaties naar de primaire server (node). De primary (primaire server) wijst de operaties toe aan secundaire servers, waardoor de gegevens worden gerepliceerd.<\/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=\"Dit is een stroomschema van hoe replicatie werkt in MongoDB, voor 3 nodes (1 primary, 2 secundair)\" width=\"1024\" height=\"763\"><\/a><figcaption id=\"caption-attachment-148331\" class=\"wp-caption-text\">MongoDB replicatieproces illustratie (Afbeelding Bron: <a href=\"https:\/\/www.mongodb.com\/basics\/replication\" target=\"_blank\" rel=\"noopener noreferrer\">MongoDB<\/a>)<\/figcaption><\/figure>\n<h3>Drie soorten MongoDB nodes<\/h3>\n<p>Van de drie typen MongoDB nodes zijn er twee al eerder naar voren gekomen: primaire en secundaire nodes. Het derde type MongoDB node dat van pas komt bij replicatie is een arbiter. De arbiter node heeft geen kopie van de gegevensset en kan ook geen primary worden. De arbiter neemt echter wel deel aan verkiezingen voor de primary.<\/p>\n<p>We hebben eerder vermeld wat er gebeurt als de primaire node uitvalt, maar wat als de secundaire nodes weg zijn? In dat scenario wordt de primaire node secundair en wordt de database onbereikbaar.<\/p>\n<h3>Verkiezing van members<\/h3>\n<p>De verkiezingen kunnen plaatsvinden in de volgende scenario&#8217;s:<\/p>\n<ul>\n<li>Initialiseren van een replicaset<\/li>\n<li>Verlies van connectiviteit met het primaire node (dat kan worden gedetecteerd door heartbeats)<\/li>\n<li>Onderhoud van een replicaset met behulp van <code>rs.reconfig<\/code> of <code>stepDown<\/code> methoden<\/li>\n<li>Toevoegen van een nieuw node aan een bestaande replicaset<\/li>\n<\/ul>\n<p>Een verzameling replica&#8217;s kan maximaal 50 members hebben, maar slechts 7 of minder kunnen stemmen in een verkiezing.<\/p>\n<p>De gemiddelde tijd voordat een cluster een nieuwe primary kiest mag niet langer zijn dan 12 seconden. Het verkiezingsalgoritme zal proberen de secundaire met de hoogste prioriteit beschikbaar te stellen. Tegelijkertijd kunnen de members met een prioriteitswaarde van 0 geen primary worden en doen ze niet mee aan de verkiezing.<\/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=\"Dit is een diagram dat een secundair node weergeeft dat na de verkiezing een primair node wordt in MongoDB.\" width=\"900\" height=\"509\"><\/a><figcaption id=\"caption-attachment-148334\" class=\"wp-caption-text\">Secundaire node die primair wordt (Beeldbron: <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>De write concern<\/h3>\n<p>Voor duurzaamheidsdoeleinden hebben schrijfoperaties een framework om de gegevens in een bepaald aantal nodes te kopi\u00ebren. Je kunt hiermee zelfs feedback bieden aan de cli\u00ebnt. Dit framework staat ook bekend als de &#8220;write concern.&#8221; Het bevat gegevensdragende members die een write concern moeten bevestigen voordat de operatie als geslaagd terugkeert. In het algemeen hebben de replicasets een waarde van 1 als write concern. Dus alleen de primaire moet het schrijven bevestigen voordat de write concern bevestiging terugkomt.<\/p>\n<p>Je kunt zelfs het aantal members verhogen dat nodig is om de schrijfoperatie te bevestigen. Er is geen maximum aan het aantal members dat je kunt hebben. Maar als het aantal hoog is, moet je rekening houden met een hoge vertraging. Dit komt doordat de client moet wachten op bevestiging van alle members. Ook kun je de write concern van de &#8220;majority&#8221; instellen.&#8221; Dit zorgt voor goedkeuring nadat meer dan de helft van de members hebben bevestigd.<\/p>\n<h3>Leesvoorkeur<\/h3>\n<p>Voor de leesoperaties kun je de leesvoorkeur opgeven die beschrijft hoe de database de query naar de members van de replicaset stuurt. In het algemeen ontvangt de primaire node de leesoperatie, maar de client kan een leesvoorkeur opgeven om de leesoperaties naar secundaire nodes te sturen. Hieronder staan de opties voor de leesvoorkeur:<\/p>\n<ul>\n<li><strong>primaryPreferred<\/strong>: Gewoonlijk komen de leesbewerkingen van de primaire node, maar als dit niet beschikbaar is worden de gegevens van de secundaire nodes gehaald.<\/li>\n<li><strong>primary<\/strong>: Alle leesbewerkingen komen van de primaire node.<\/li>\n<li><strong>secundary<\/strong>: Alle leesbewerkingen worden uitgevoerd door de secundaire nodes.<\/li>\n<li><strong>nearest<\/strong>: Hier worden de leesverzoeken gerouteerd naar de dichtstbijzijnde bereikbare node, dat kan worden gedetecteerd door het commando <code>ping<\/code> uit te voeren. Het resultaat van leesbewerkingen kan van elk member van de replicaset komen, ongeacht of het de primaire of de secundaire is.<\/li>\n<li><strong>secondaryPreferred<\/strong>: Hier komen de meeste leesbewerkingen van de secundaire nodes, maar als geen van hen beschikbaar is, worden de gegevens van de primaire node gehaald.<\/li>\n<\/ul>\n<h3>Replicatieset datasynchronisatie<\/h3>\n<p>Om actuele kopie\u00ebn van de gedeelde gegevensset te onderhouden, repliceren of synchroniseren secundaire members van een replicaset gegevens van andere members.<\/p>\n<p>MongoDB maakt gebruik van twee vormen van datasynchronisatie. Initi\u00eble synchronisatie om nieuwe members te vullen met de volledige dataset en replicatie om lopende wijzigingen in de volledige dataset uit te voeren.<\/p>\n<h4>Initi\u00eble synchronisatie<\/h4>\n<p>Tijdens de initi\u00eble synchronisatie voert een secundaire node het commando <code> init sync <\/code> uit om alle gegevens van de primaire node te synchroniseren met een andere secundair node dat de meest recente gegevens bevat. Daarom gebruikt de secundaire node consequent de functie <code> tailable cursor <\/code> om de nieuwste oplogs binnen de verzameling local.oplog.rs van het primaire node op te vragen en past deze bewerkingen toe binnen deze oplogs.<\/p>\n<p>Vanaf MongoDB 5.2 kunnen initi\u00eble synchronisaties gebaseerd zijn op bestandskopie\u00ebn of logisch.<\/p>\n<h5>Logische synchronisatie<\/h5>\n<p>Wanneer je een logische sync uitvoert, doet MongoDB het volgende:<\/p>\n<ol>\n<li>Ontwikkelt alle collectie-indexen terwijl de documenten voor elke collectie worden gekopieerd.<\/li>\n<li>Dupliceert alle databases behalve de local database. <code> mongod <\/code> scant elke collectie in alle sourcedatabases en voegt alle gegevens in de duplicaten van deze collecties in.<\/li>\n<li>Voert alle wijzigingen op de gegevensverzameling uit. Door gebruik te maken van de oplog van de source, werkt de <code> mongod <\/code> zijn gegevensset bij om de huidige state van de replicaset weer te geven.<\/li>\n<li>Haalt nieuw toegevoegde oplog records op tijdens het kopi\u00ebren van gegevens. Zorg ervoor dat de targetmember voldoende schijfruimte heeft in de lokale database om deze oplog records voorlopig op te slaan voor de duur van deze gegevenskopiefase.<\/li>\n<\/ol>\n<p>Wanneer de initi\u00eble synchronisatie voltooid is, gaat de member over van <code> STARTUP2 <\/code> naar <code> SECONDARY <\/code>.<\/p>\n<h5>Op bestandskopie gebaseerde initi\u00eble synchronisatie<\/h5>\n<p>Je kunt dit alleen uitvoeren als je MongoDB Enterprise gebruikt. Dit proces voert de initi\u00eble sync uit door de bestanden op het bestandssysteem te dupliceren en te verplaatsen. Deze synchronisatiemethode kan in sommige gevallen sneller zijn dan een logische initi\u00eble synchronisatie. Houd in gedachten dat op bestandskopie gebaseerde initi\u00eble sync kan leiden tot onnauwkeurige tellingen als je de count() methode uitvoert zonder een query predicaat.<\/p>\n<p>Maar ook deze methode heeft zijn beperkingen:<\/p>\n<ul>\n<li>Tijdens een initi\u00eble synchronisatie op basis van bestandskopie\u00ebn kun je niet schrijven naar de lokale database van de member die gesynchroniseerd wordt. Je kunt ook geen backup maken van het member waarnaar gesynchroniseerd wordt of van het member waarvan gesynchroniseerd wordt.<\/li>\n<li>Bij het gebruik van de versleutelde storage engine gebruikt MongoDB de bronsleutel om de bestemming te versleutelen.<\/li>\n<li>Je kunt alleen een initi\u00eble synchronisatie uitvoeren vanaf \u00e9\u00e9n bepaalde member tegelijk.<\/li>\n<\/ul>\n<h4>Replicatie<\/h4>\n<p>Secundaire members repliceren gegevens consistent na de initi\u00eble synchronisatie. Secundaire members dupliceren de oplog van hun sync van de bron en voeren deze operaties uit in een asynchroon proces.<\/p>\n<p>Secundaire members zijn in staat hun sync van de bron automatisch aan te passen als dat nodig is, gebaseerd op de veranderingen in de pingtijd en de state van de replicatie van andere members.<\/p>\n<h5>Streamingreplicatie<\/h5>\n<p>Vanaf MongoDB 4.4 stuurt sync van bronnen een continue stroom oplog entries naar hun synchroniserende secondaries. Streamingreplicatie vermindert de replicatievertraging in netwerken met hoge belasting en hoge latency. Het kan verder:<\/p>\n<ul>\n<li>Het risico verkleinen dat schrijfoperaties met <code>w:1<\/code> verloren gaan door primaire failover.<\/li>\n<li>De staleness voor reads van secondaries verminderen.<\/li>\n<li>De latency op schrijfoperaties verminderen met <code>w:\u201cmajority\u201d<\/code> en <code>w:&gt;1<\/code>. Elke write concern die moet wachten op replicatie.<\/li>\n<\/ul>\n<h5>Multithreaded replicatie<\/h5>\n<p>MongoDB gebruikte operaties om in batches door meerdere threads te laten lopen om de concurrency te verbeteren. MongoDB groepeert de batches op document ID en geeft elke groepoperatie een andere thread.<\/p>\n<p>MongoDB voert schrijfoperaties op een bepaald document altijd uit in de oorspronkelijke schrijfvolgorde. Dit is veranderd in MongoDB 4.0.<\/p>\n<p>Vanaf MongoDB 4.0 zullen leesbewerkingen die gericht zijn op secondaries en geconfigureerd zijn met een lees concern level van <code>\u201cmajority\u201d<\/code> of <code>\u201clocal\u201d<\/code> lezen van een WiredTiger snapshot van de gegevens als het lezen plaatsvindt op een secondary waar de replicatiebatches worden toegepast. Lezen van een snapshot garandeert een consistent beeld van de gegevens, en laat het lezen gelijktijdig plaatsvinden met de lopende replicatie zonder dat een lock nodig is.<\/p>\n<p>Daarom hoeven secundaire reads die deze lees concern niveau nodig hebben niet langer te wachten tot de replicatiebatches worden toegepast en kunnen ze worden afgehandeld wanneer ze worden ontvangen.<\/p>\n<h2>Zo maak je een MongoDB replicaset<\/h2>\n<p>Zoals eerder vermeld, handelt MongoDB replicatie af door middel van replicasets. In de volgende paragrafen belichten we een paar methoden die je kunt gebruiken om replicasets aan te maken voor jouw applicatie.<\/p>\n<h3>Methode 1: Aanmaken van een nieuwe MongoDB replicaset op Ubuntu<\/h3>\n<p>Voordat we beginnen, moet je ervoor zorgen dat je tenminste drie servers hebt waarop Ubuntu 20.04 draait en waarop <a href=\"https:\/\/kinsta.com\/blog\/what-is-mongodb\/\">MongoDB<\/a> is ge\u00efnstalleerd.<\/p>\n<p>Om een replicaset op te zetten is het essentieel om een adres op te geven waar elk member van de replicaset kan worden bereikt door anderen in de set. In dit geval houden we drie members in de set. We kunnen weliswaar <a href=\"https:\/\/kinsta.com\/nl\/blog\/statische-en-dynamische-ip\/\">IP adressen<\/a> gebruiken, maar dat is niet aan te raden omdat de adressen onverwacht kunnen veranderen. Een beter alternatief kan het gebruik van de logische DNS hostnamen zijn bij het configureren van replicasets.<\/p>\n<p>We kunnen dit doen door voor elk replicatiemember het subdomein te configureren. Hoewel dit ideaal kan zijn voor een productieomgeving, wordt in deze sectie uitgelegd hoe we <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-dns\/\">DNS<\/a> resolutie kunnen configureren door de respectievelijke hostsbestanden van elke server te bewerken. Dit bestand staat ons toe leesbare hostnamen toe te wijzen aan numerieke IP adressen. Dus als je IP adres ooit verandert, hoef je alleen maar de hostsbestanden op de drie servers bij te werken in plaats van de replicaset helemaal opnieuw te configureren!<\/p>\n<p>Meestal wordt <code>hosts<\/code> opgeslagen in de map <code>\/etc\/<\/code>. Herhaal de onderstaande commando&#8217;s voor elk van je drie servers:<\/p>\n<pre><code class=\"language-markdown\">sudo nano \/etc\/hosts<\/code><\/pre>\n<p>In het bovenstaande commando gebruiken we nano als onze teksteditor, je kunt echter elke teksteditor gebruiken die je wil. Voeg na de eerste paar regels, die de localhost configureren, een regel toe voor elk member van de replicaset. Deze regels hebben de vorm van een IP adres gevolgd door een menselijk leesbare naam naar keuze. Je kunt ze noemen wat je wilt, maar zorg ervoor dat ze beschrijvend zijn, zodat je elk member kunt onderscheiden. Voor deze tutorial gebruiken we de onderstaande hostnamen:<\/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>Met deze hostnamen zouden je \/etc\/hosts bestanden er ongeveer zo uitzien als de volgende gemarkeerde regels:<\/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=\"Dit is een momentopname van de \/etc\/hostsbestanden die de hostnamen samen met het IP adres bevatten.\" width=\"1222\" height=\"339\"><\/a><figcaption id=\"caption-attachment-148336\" class=\"wp-caption-text\">Hostnamen illustratie<\/figcaption><\/figure>\n<p>Sla het bestand op en sluit het.<\/p>\n<p>Na het configureren van de DNS resolutie voor de replicaset, moeten we de firewallregels bijwerken zodat ze met elkaar kunnen communiceren. Voer het volgende <code>ufw<\/code> commando uit op mongo0 om mongo1 toegang te geven tot poort 27017 op mongo0:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo1_server_ip to any port 27017<\/code><\/pre>\n<p>Voer in plaats van de parameter <code>mongo1_server_ip<\/code> het werkelijke IP adres van je mongo1 server in. Als je de Mongo instantie op deze server hebt bijgewerkt om een niet-standaard poort te gebruiken, moet je 27017 aanpassen aan de poort die je MongoDB instantie gebruikt.<\/p>\n<p>Voeg nu een andere firewall regel toe om mongo2 toegang te geven tot dezelfde poort:<\/p>\n<pre><code class=\"language-markdown\">sudo ufw allow from mongo2_server_ip to any port 27017<\/code><\/pre>\n<p>Voer in plaats van de parameter <code>mongo2_server_ip<\/code> het werkelijke IP adres van je mongo2 server in. Werk dan de firewall regels voor je andere twee servers bij. Voer de volgende commando&#8217;s uit op de mongo1 server en zorg ervoor dat je de IP adressen in plaats van de server_ip parameter aanpast aan die van respectievelijk mongo0 en 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>Voer tot slot deze twee commando&#8217;s uit op mongo2. Let er opnieuw op dat je voor elke server de juiste IP adressen invoert:<\/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>Je volgende stap is om het configuratiebestand van elke MongoDB instantie bij te werken om externe verbindingen toe te staan. Om dit toe te staan moet je het configuratiebestand in elke server aanpassen om het IP adres weer te geven en de replicaset aan te geven. Hoewel je elke gewenste teksteditor kunt gebruiken, gebruiken wij opnieuw de nano teksteditor. Laten we de volgende wijzigingen aanbrengen in elk mongod.conf bestand.<\/p>\n<p><strong>Op 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>Op 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>Op 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>Als je de richtlijnwaarde van rs0 wilt veranderen, moet je die in bovenstaande commando&#8217;s vervangen. Je kunt de richtlijn noemen zoals je wilt, maar zorg ervoor dat hij beschrijvend genoeg is. Nadat de updates zijn voltooid, herstart je de mongod service in elke instantie om de configuraties opnieuw te laden.<\/p>\n<\/aside>\n\n<pre><code class=\"language-markdown\">sudo systemctl restart mongod<\/code><\/pre>\n<p>Hiermee heb je replicatie ingeschakeld voor de MongoDBn instantie van elke server.<\/p>\n<p>Je kunt nu de replicaset initialiseren met de methode <code>rs.initiate()<\/code>. Deze methode hoeft maar op \u00e9\u00e9n MongoDB instantie in de replicaset te worden uitgevoerd. Zorg ervoor dat de naam en het member van de replicaset overeenkomen met de configuraties die je eerder in elk configuratiebestand hebt gemaakt.<\/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>Als de methode &#8220;ok&#8221;: 1 retourneert in de uitvoer, betekent dit dat de replicaset correct is gestart. Hieronder staat een voorbeeld van hoe de uitvoer er uit zou moeten zien:<\/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>MongoDB server afsluiten<\/h4>\n<p>Je kunt een MongoDB server afsluiten met de methode <code>db.shutdownServer()<\/code>. Hieronder staat de syntaxis voor hetzelfde. Zowel <code>force<\/code> als <code>timeoutsecs<\/code> zijn <a href=\"https:\/\/www.mongodb.com\/docs\/v5.0\/reference\/method\/db.shutdownServer\/#mongodb-method-db.shutdownServer\" target=\"_blank\" rel=\"noopener noreferrer\">optionele parameters<\/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>Deze methode kan mislukken als het mongod replicasetmember bepaalde operaties uitvoert als index builds. Om de bewerkingen te onderbreken en het member te dwingen af te sluiten, kun je de booleaanse parameter <code> force <\/code> invoeren op true.<\/p>\n<h4>MongoDB opnieuw opstarten met &#8211;replSet<\/h4>\n<p>Om de configuratie opnieuw in te stellen, zorg je ervoor dat elke node in je replicaset is gestopt. Verwijder dan de lokale database voor elk node. Start hem opnieuw met de <code>\u2013replSet<\/code>vlag en voer <code>rs.initiate()<\/code> uit op slechts \u00e9\u00e9n mongod instantie voor de replicaset.<\/p>\n<pre><code class=\"language-markdown\">mongod --replSet \"rs0\"<\/code><\/pre>\n<p><code>rs.initiate()<\/code> kan een optioneel replicaset configuratiedocument nemen, namelijk:<\/p>\n<ul>\n<li>De optie <code>Replication.replSetName<\/code> of de optie <code>\u2014replSet<\/code> om de naam van de replicaset te specificeren in het veld <code>_id<\/code>.<\/li>\n<li>De array van members, die een document bevat voor elk member van de replicaset.<\/li>\n<\/ul>\n<p>De methode <code>rs.initiate()<\/code> brengt een verkiezing op gang en kiest een van de members tot de primaire.<\/p>\n<h4>Members toevoegen aan replicaset<\/h4>\n<p>Om members aan de set toe te voegen, start je mongo instanties op verschillende machines. Start vervolgens een mongo client en gebruik het commando <code>rs.add()<\/code>.<\/p>\n<p>Het <code>rs.add()<\/code> commando heeft de volgende basissyntaxis:<\/p>\n<pre><code class=\"language-markdown\">rs.add(HOST_NAME:PORT)<\/code><\/pre>\n<p>Bijvoorbeeld,<\/p>\n<p>Stel dat mongo1 je Mongo instantie is, en dat deze luistert op poort 27017. Gebruik het Mongo client commando <code>rs.add()<\/code> om deze instantie toe te voegen aan de replicaset.<\/p>\n<pre><code class=\"language-markdown\">rs.add(\"mongo1:27017\")<\/code><\/pre>\n<p>Pas als je verbonden bent met het primaire node kun je een mongo instantie toevoegen aan de replicaset. Om te controleren of je verbonden bent met de primaire, gebruik je het commando <code>db.isMaster()<\/code>.<\/p>\n<h4>Members te verwijderen<\/h4>\n<p>Om een member te verwijderen kunnen we <code>rs.remove()<\/code> gebruiken<\/p>\n<p>Om dit te doen, sluit je eerst de mongod instantie die je wilt verwijderen af met de hierboven besproken methode <code>db.shutdownServer()<\/code>.<\/p>\n<p>Maak vervolgens verbinding met de huidige primaire replicaset. Om de huidige primary te bepalen gebruik je <code>db.hello()<\/code> terwijl je verbonden bent met een member van de replicaset. Zodra je de primary hebt bepaald, voer je een van de volgende commando&#8217;s uit:<\/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=\"wp-image-148339 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/Code-Snippet-for-Node-Removal-1.png\" alt=\"Dit is een snapshot van de uitvoer na het uitvoeren van de opdracht rs.remove().\" width=\"900\" height=\"267\"><\/a><figcaption id=\"caption-attachment-148339\" class=\"wp-caption-text\">De bovenstaande afbeelding laat zien dat het node met succes uit de replicaset is verwijderd. (Beeldbron: <a href=\"https:\/\/www.bmc.com\/blogs\/mongodb-replication\/\" target=\"_blank\" rel=\"noopener noreferrer\">Bmc<\/a>)<\/figcaption><\/figure>\n<p>Als de replicaset een nieuwe primary moet kiezen, kan MongoDB de verbinding met de shell kort verbreken. In dit scenario zal het automatisch weer verbinding maken. Ook kan het een <code>DBClientCursor::init call()<\/code> failed error weergeven, ook al slaagt het commando.<\/p>\n<h3>Methode 2: Een MongoDB replicaset instellen voor deployment en testen<\/h3>\n<p>In het algemeen kun je replicasets voor testen instellen met RBAC ingeschakeld of uitgeschakeld. In deze methode stellen we replicasets in met de toegangscontrole uitgeschakeld om ze in een testomgeving te <a href=\"https:\/\/kinsta.com\/blog\/what-is-a-full-stack-developer\/\">deployen<\/a>.<\/p>\n<p>Maak eerst mappen aan voor alle instanties die deel uitmaken van de replicaset met het volgende commando:<\/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>Dit commando maakt mappen aan voor drie MongoDB instanties replicaset0-0, replicaset0-1, en replicaset0-2. Start nu de MongoDB instanties voor elk van hen met de volgende reeks commando&#8217;s:<\/p>\n<p><strong>Voor 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>Voor 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>Voor 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>De parameter <code>\u2013oplogSize<\/code> wordt gebruikt om te voorkomen dat de machine tijdens de testfase overbelast raakt. Hij helpt de hoeveelheid schijfruimte die elke schijf inneemt te beperken.<\/p>\n<p>Maak nu verbinding met een van de instanties met de Mongo shell door verbinding te maken met het onderstaande poortnummer.<\/p>\n<pre><code class=\"language-markdown\">mongo --port 27017<\/code><\/pre>\n<p>We kunnen het commando <code>rs.initiate()<\/code> gebruiken om het replicatieproces te starten. Je moet de parameter <code>hostname<\/code> vervangen door de naam van je systeem.<\/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>Je kunt nu het configuratieobjectbestand doorgeven als parameter voor het initiate commando en het als volgt gebruiken:<\/p>\n<pre><code class=\"language-markdown\">rs.initiate(rsconf)<\/code><\/pre>\n<p>En dat is alles! Je hebt met succes een MongoDB replicaset gemaakt voor <a href=\"https:\/\/kinsta.com\/blog\/backend-developer\/\">ontwikkelings<\/a>&#8211; en testdoeleinden.<\/p>\n<h3>Methode 3: Een standalone instantie transformeren naar een MongoDB replicaset<\/h3>\n<p>MongoDB staat zijn gebruikers toe om hun standalone instanties om te zetten in replicasets. Terwijl standalone instanties meestal worden gebruikt voor de test- en ontwikkelingsfase, maken replicasets deel uit van de productieomgeving.<\/p>\n<p>Om te beginnen sluiten we onze mongod instantie af met het volgende commando:<\/p>\n<pre><code class=\"language-markdown\">db.adminCommand({\"shutdown\":\"1\"})<\/code><\/pre>\n<p>Start je instantie opnieuw op door de parameter <code>\u2013repelSet<\/code> in je commando te gebruiken om de replicaset die je gaat gebruiken te specificeren:<\/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>Je moet de naam van je server opgeven samen met het unieke adres in het commando.<\/p>\n<p>Verbind de shell met je MongoDB instantie en gebruik het initiate commando om het replicatieproces te starten en de instantie met succes om te zetten naar een replicaset. Je kunt alle basisbewerkingen zoals het toevoegen of verwijderen van een instantie uitvoeren met de volgende commando&#8217;s:<\/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>Daarnaast kun je de status van je MongoDB replicaset controleren met de commando&#8217;s <code>rs.status()<\/code> en <code>rs.conf()<\/code>.<\/p>\n<h3>Methode 4: MongoDB Atlas &#8211; een eenvoudiger alternatief<\/h3>\n<p>Replicatie en <a href=\"https:\/\/kinsta.com\/nl\/blog\/mongodb-sharding\/\">sharding<\/a> kunnen samenwerken om een zogenaamd sharded cluster te vormen. Hoewel het opzetten en configureren nogal tijdrovend kan zijn, is MongoDB Atlas een beter alternatief dan de eerder genoemde methoden.<\/p>\n<p>Het automatiseert je replicasets, waardoor het proces eenvoudig te implementeren is. Het kan globale sharded replicasets implementeren met een paar klikken, waardoor disaster recovery, eenvoudiger <a href=\"https:\/\/kinsta.com\/nl\/blog\/adminer\/\">beheer<\/a>, datalokalisatie en multi-regio deployments mogelijk worden.<\/p>\n<p>In MongoDB Atlas moeten we clusters maken &#8211; dat kan een replicaset zijn, of een sharded cluster. Voor een bepaald project is het aantal nodes in een cluster in andere regio&#8217;s beperkt tot een totaal van 40.<\/p>\n<p>Dit is exclusief de vrije of gedeelde clusters en de Google cloudregio&#8217;s die met elkaar communiceren. Het totale aantal nodes tussen twee willekeurige regio&#8217;s moet aan deze beperking voldoen. Als er bijvoorbeeld een project is waarin:<\/p>\n<ul>\n<li>Regio A 15 nodes heeft .<\/li>\n<li>Regio B 25 nodes heeft<\/li>\n<li>Regio C 10 nodes heeft<\/li>\n<\/ul>\n<p>We kunnen slechts 5 extra nodes aan regio C toewijzen als,<\/p>\n<ol>\n<li>Regio A+ Regio B = 40; voldoet aan de beperking dat 40 het maximaal toegestane aantal nodes is.<\/li>\n<li>Regio B+ Regio C = 25+10+5 (Extra nodes toegewezen aan C) = 40; voldoet aan de beperking dat 40 het maximum aantal toegestane nodes is.<\/li>\n<li>Regio A+ Regio C =15+10+5 (Extra nodes toegewezen aan C) = 30; voldoet aan de beperking dat 40 het maximum aantal toegestane nodes is.<\/li>\n<\/ol>\n<p>Als we 10 extra nodes aan regio C toekennen, zodat regio C 20 nodes heeft, dan zijn Regio B + Regio C = 45 nodes. Dit zou de gegeven beperking overschrijden, zodat je mogelijk geen multi-regio cluster kunt maken.<\/p>\n<p>Als je een cluster aanmaakt, maakt Atlas een netwerkcontainer in het project voor de cloudprovider als die er eerder nog niet was. Om een replicasetcluster in MongoDB Atlas aan te maken, voer je het volgende commando uit in Atlas CLI:<\/p>\n<pre><code class=\"language-markdown\">atlas clusters create [name] [options]<\/code><\/pre>\n<p>Zorg ervoor dat je een beschrijvende clusternaam opgeeft, want die kan niet meer veranderd worden nadat het cluster is aangemaakt. Het argument kan ASCII letters, cijfers en koppeltekens bevatten.<\/p>\n<p>Er zijn <a href=\"https:\/\/www.mongodb.com\/docs\/atlas\/cli\/stable\/command\/atlas-clusters-create\/\" target=\"_blank\" rel=\"noopener noreferrer\">verschillende<\/a> opties beschikbaar voor het aanmaken van clusters in MongoDB, gebaseerd op je eisen. Als je bijvoorbeeld een continue cloudbackup voor je cluster wilt, stel dan <code>--backup<\/code> in op true.<\/p>\n<h2>Omgaan met replicatievertraging<\/h2>\n<p>Replicatievertraging kan behoorlijk vervelend zijn. Het is een vertraging tussen een bewerking op de primary en de applicatie van die bewerking van de oplog op de secondary. Als je bedrijf te maken heeft met grote gegevensverzamelingen, is een vertraging binnen een bepaalde drempel te verwachten. Soms kunnen echter ook externe factoren bijdragen en de vertraging vergroten. Om te profiteren van een snelle replicatie moet je ervoor zorgen dat:<\/p>\n<ol>\n<li>Je je netwerkverkeer in een stabiele en voldoende bandbreedte routeert. Netwerklatency speelt een grote rol bij het be\u00efnvloeden van je replicatie, en als het netwerk onvoldoende is om aan de behoeften van het replicatieproces te voldoen, zullen er vertragingen optreden bij het repliceren van gegevens in de hele replicaset.<\/li>\n<li>Je hebt voldoende schijfdoorvoer. Als het bestandssysteem en het schijfapparaat op de secondary niet in staat zijn om gegevens zo snel naar de schijf te flushen als de primary, dan zal de secondary moeite hebben om het bij te houden. Daarom verwerken de secundaire nodes de schrijfverzoeken langzamer dan het primaire node. Dit is een veel voorkomend probleem in de meeste multi-tenant systemen, inclusief gevirtualiseerde instanties en grootschalige implementaties.<\/li>\n<li>Je vraagt om een schrijfbevestiging na een interval om de secondaries de gelegenheid te geven om de primary in te halen, vooral wanneer je een bulk load operatie of data ingestion wilt uitvoeren die een groot aantal schrijfbewerkingen naar de primary vereist. De secondaries zullen de oplog niet snel genoeg kunnen lezen om de veranderingen bij te houden; vooral bij niet-erkende write concerns.<\/li>\n<li>Je identificeert de lopende achtergrondtaken. Bepaalde taken zoals cron jobs, serverupdates, en beveiligingscontroles kunnen onverwachte effecten hebben op het netwerk of schijfgebruik, en vertragingen veroorzaken in het replicatieproces.<\/li>\n<\/ol>\n<p>Als je niet zeker weet of er sprake is van een replicatievertraging in je applicatie, geen nood &#8211; de volgende sectie bespreekt troubleshootingstrategie\u00ebn!<\/p>\n<h2>MongoDB replicasets troubleshooten<\/h2>\n<p>Je hebt je replicasets met succes ingesteld, maar je merkt dat je gegevens inconsistent zijn tussen de servers. Dit is zeer alarmerend voor grootschalige bedrijven, maar met snelle <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-database-problemen-oplossen\/\">troubleshootingmethoden<\/a> kun je de oorzaak vinden of het probleem zelfs verhelpen! Hieronder staan enkele veelvoorkomende strategie\u00ebn voor het oplossen van problemen met replicasets die van pas kunnen komen:<\/p>\n<h3>Controleer de replicatiestatus<\/h3>\n<p>We kunnen de huidige status van de replicaset en de status van elke member controleren door het volgende commando uit te voeren in een mongosh sessie die verbonden is met de primary van een replicaset.<\/p>\n<pre><code class=\"language-markdown\"> rs.status()<\/code><\/pre>\n<h3>Controleer de replicatievertraging<\/h3>\n<p>Zoals eerder besproken kan replicatievertraging een serieus probleem zijn, omdat het maakt dat &#8220;lagged&#8221; (trage) members niet in aanmerking komen om snel primary te worden en het vergroot de kans dat gedistribueerde leesbewerkingen inconsistent zijn. We kunnen de huidige lengte van het replicatielog controleren met het volgende commando:<\/p>\n<pre><code class=\"language-markdown\">rs.printSecondaryReplicationInfo()<\/code><\/pre>\n<p>Dit geeft de waarde <code>syncedTo<\/code> terug, wat de tijd is waarop voor elk member de laatste oplog entry naar de secondary is geschreven. Hier is een voorbeeld om hetzelfde te demonstreren:<\/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>Een vertraagde member kan je met 0 seconden vertraging zien als de inactiviteitsperiode op de primary groter is dan de <code> members[n].secondaryDelaySecs<\/code> waarde.<\/p>\n<h3>Test verbindingen tussen alle members<\/h3>\n<p>Elke member van een replicaset moet verbinding kunnen maken met elk andere member. Controleer altijd de verbindingen in beide richtingen. Meestal verhinderen firewallconfiguraties of netwerktopologie\u00ebn normale en vereiste verbindingen die de replicatie kunnen blokkeren.<\/p>\n<p>Laten we bijvoorbeeld aannemen dat de mongod instantie zich bindt aan zowel localhost als hostname &#8216;ExampleHostname&#8217; die geassocieerd is met het IP adres 198.41.110.1:<\/p>\n<pre><code class=\"language-markdown\">mongod --bind_ip localhost, ExampleHostname<\/code><\/pre>\n<p>Om verbinding te maken met deze instantie moeten externe cli\u00ebnten de hostnaam of het IP adres opgeven:<\/p>\n<pre><code class=\"language-markdown\">mongosh --host ExampleHostname\nmongosh --host 198.41.110.1<\/code><\/pre>\n<p>Als een replicaset bestaat uit drie members, m1, m2, en m3, die de standaardpoort 27017 gebruiken, moet je de verbinding testen zoals hieronder:<\/p>\n<p><strong>Op m1:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongosh --host m2 --port 27017\nmongosh --host m3 --port 27017<\/code><\/pre>\n<p><strong>Op m2:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongosh --host m1 --port 27017\nmongosh --host m3 --port 27017<\/code><\/pre>\n<p><strong>Op m3:<\/strong><\/p>\n<pre><code class=\"language-markdown\">mongosh --host m1 --port 27017\nmongosh --host m2 --port 27017<\/code><\/pre>\n<p>Als een verbinding in welke richting dan ook mislukt, zou je je <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-een-firewall\/\">firewallconfiguratie<\/a> moeten controleren en opnieuw configureren om de verbindingen toe te staan.<\/p>\n<h2>Zorgen voor veilige communicatie met keyfile authenticatie<\/h2>\n<p>Standaard vertrouwt de authenticatie van sleutelbestanden in MongoDB op het salted challenge response authenticatiemechanisme (SCRAM). Om dit te doen moet MongoDB de door de gebruiker verstrekte referenties lezen en valideren, die een combinatie bevatten van de gebruikersnaam, het wachtwoord en de authenticatie database waar de specifieke MongoDB instantie van op de hoogte is. Dit is het exacte mechanisme dat gebruikt wordt om gebruikers te authentiseren die een wachtwoord opgeven bij het verbinden met de database.<\/p>\n<p>Wanneer je authenticatie in MongoDB inschakelt, wordt automatisch RBAC (Role-Based Access Control) ingeschakeld voor de replicaset, en krijgt de gebruiker een of meer rollen die zijn toegang tot databasebronnen bepalen. Wanneer RBAC is ingeschakeld, betekent dit dat alleen de geldige geauthentiseerde Mongo gebruiker met de juiste privileges toegang heeft tot de resources op het systeem.<\/p>\n<p>Het sleutelbestand fungeert als een gedeeld wachtwoord voor elke member in het cluster. Hierdoor kan elke Mongo instantie in de replicaset de inhoud van het sleutelbestand gebruiken als het gedeelde wachtwoord voor de authenticatie van andere members in de deployment.<\/p>\n<p>Alleen de mongod instanties met het juiste sleutelbestand kunnen toetreden tot de replicaset. De lengte van een sleutel moet liggen tussen 6 en 1024 tekens en mag alleen tekens in de base64 set bevatten. Merk op dat MongoDB bij het lezen van sleutels de spaties stript.<\/p>\n<p>Je kunt <strong>een sleutelbestand genereren<\/strong> door verschillende methoden te gebruiken. In deze tutorial gebruiken we <code>openssl <\/code> om een complexe string van 1024 willekeurige tekens te genereren om te gebruiken als gedeeld wachtwoord. Vervolgens wordt <code>chmod<\/code> gebruikt om de bestandspermissies te wijzigen zodat alleen de eigenaar van het bestand leesrechten krijgt. Vermijd het opslaan van het sleutelbestand op opslagmedia die gemakkelijk losgekoppeld kunnen worden van de hardware waarop de mongod instanties staan, zoals een USB stick of een netwerkopslagapparaat. Hieronder staat het commando om een sleutelbestand te genereren:<\/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><strong>Kopieer<\/strong> <strong>vervolgens het sleutelbestand naar elke member van de replicatieset<\/strong>. Zorg ervoor dat de gebruiker die de mongod instanties draait de eigenaar is van het bestand en toegang heeft tot het sleutelbestand. Nadat je het bovenstaande hebt gedaan, <strong>sluit je alle members van de replicaset af<\/strong>, te beginnen met de secondaries. Als alle secondaries offline zijn, kun je doorgaan met het afsluiten van de primary. Het is essentieel om deze volgorde aan te houden om mogelijke rollbacks te voorkomen. Sluit nu de mongod instantie af met het volgende commando:<\/p>\n<pre><code class=\"language-markdown\">use admin\ndb.shutdownServer()<\/code><\/pre>\n<p>Nadat het commando is uitgevoerd, zullen alle members van de replicaset offline zijn.<strong> Start<\/strong> <strong>nu elk member van de replica set opnieuw op met toegangscontrole ingeschakeld<\/strong>.<\/p>\n<p>Start voor elk member van de replicaset de mongod instantie met de instelling van het configuratiebestand <code>security.keyFile<\/code> of de commandoregeloptie <code>--keyFile<\/code>.<\/p>\n<p>Als je een configuratiebestand gebruikt, gebruik dan<\/p>\n<ul>\n<li>security.keyFile ingesteld op het pad van het sleutelbestand, en<\/li>\n<li>replication.replSetName ingesteld op de naam van de replicaset.<\/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 de mongod instantie met behulp van het configuratiebestand:<\/p>\n<pre><code class=\"language-markdown\">mongod --config &lt;path-to-config-file&gt;<\/code><\/pre>\n<p>Als je de commandoregelopties gebruikt, start de mongod instantie dan met de volgende opties:<\/p>\n<ul>\n<li>&#8211;keyFile ingesteld op het pad van het sleutelbestand, en<\/li>\n<li>&#8211;replSet ingesteld op de naam van de replicaset.<\/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>Je kunt extra opties toevoegen als dat nodig is voor je configuratie. Als je bijvoorbeeld wilt dat externe clients verbinding maken met je deployment of dat je ideploymentmembers op verschillende hosts draaien, geef dan de &#8211;bind_ip op. Zie voor meer informatie <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\">Localhost Binding Compatibility Changes<\/a>.<\/p>\n<p>Maak vervolgens <strong>verbinding met een member van de replicaset via de localhost interface<\/strong>. Je moet mongosh draaien op dezelfde fysieke machine als de mongod instantie. Deze interface is alleen beschikbaar als er geen gebruikers zijn aangemaakt voor de deployment en sluit automatisch na het aanmaken van de eerste gebruiker.<\/p>\n<p>Vervolgens starten we de replicaset op. Voer vanuit mongosh de methode <code>rs.initiate()<\/code> uit:<\/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>Zoals eerder besproken kiest deze methode een van de members als primair member van de replicaset. Gebruik <code>rs.status()<\/code> om het primaire member te vinden. Maak verbinding met het primaire member voordat je verder gaat.<\/p>\n<p><strong>Maak<\/strong> <strong>nu de gebruikersbeheerder aan<\/strong>. Je kunt een gebruiker toevoegen met de methode <code>db.createUser()<\/code>. Zorg ervoor dat de gebruiker minstens de rol <code>userAdminAnyDatabase<\/code> moet hebben in de admindatabase.<\/p>\n<p>Het volgende voorbeeld maakt de gebruiker &#8216;batman&#8217; aan met de rol <code>userAdminAnyDatabase<\/code> op de admin database:<\/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>Voer het eerder aangemaakte wachtwoord in als daarom wordt gevraagd.<\/p>\n<p>Vervolgens moet je <b>je authentiseren als de gebruikersbeheerder<\/b>. Gebruik hiervoor <code>db.auth()<\/code> om je te authentiseren. Bijvoorbeeld:<\/p>\n<p>db.getSiblingDB(&#8220;admin&#8221;).auth(&#8220;batman&#8221;, passwordPrompt()) \/\/ of cleartext wachtwoord<\/p>\n<p>Als alternatief kun je een nieuwe mongosh instantie verbinden met het primaire replicaset member met behulp van de parameters <code>-u &lt;username&gt;<\/code>,<code> -p &lt;password&gt;<\/code>, en de <code>--authenticationDatabase<\/code>.<\/p>\n<pre><code class=\"language-markdown\">mongosh -u \"batman\" -p  --authenticationDatabase \"admin\"<\/code><\/pre>\n<p>Zelfs als je het wachtwoord niet opgeeft in het <code>-p<\/code> commandoregelveld, vraagt mongosh om het wachtwoord.<\/p>\n<p><strong>Maak<\/strong> <strong>tenslotte de clusterbeheerder aan<\/strong>. De rol <code>clusterAdmin<\/code> geeft toegang tot replicatiebewerkingen, zoals het configureren van de replicaset.<\/p>\n<p>Laten we een clusterbeheerder gebruiker aanmaken en de rol <code>clusterAdmin<\/code> toewijzen in de admindatabase:<\/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>Voer het wachtwoord in als daarom wordt gevraagd.<\/p>\n<p>Als je wilt, kun je extra gebruikers aanmaken om clients toe te staan en interactie te hebben met de replicaset.<\/p>\n<p>En voila! Je hebt met succes keyfile authenticatie ingeschakeld!<\/p>\n\n<h2>Samenvatting<\/h2>\n<p>Replicatie is een essenti\u00eble vereiste als het gaat om databases, vooral naarmate meer bedrijven opschalen. Het verbetert op grote schaal de <a href=\"https:\/\/kinsta.com\/nl\/blog\/apm-tools\/\">prestaties<\/a>, gegevensbeveiliging en beschikbaarheid van het systeem. Over prestaties gesproken, het is cruciaal voor je WordPress database om prestatieproblemen te monitoren en te verhelpen, bijvoorbeeld met <a href=\"https:\/\/kinsta.com\/nl\/apm-tool\/\">Kinsta APM<\/a>, Jetpack en Freshping om er een paar te noemen.<\/p>\n<p>Replicatie helpt de gegevensbescherming via meerdere servers te waarborgen en voorkomt dat je servers last krijgen van zware downtime (of nog erger &#8211; je gegevens helemaal kwijtraken). In dit artikel behandelden we het maken van een replicaset en enkele tips voor troubleshooting, samen met het belang van replicatie. Gebruik je MongoDB replicatie voor je bedrijf en is het van pas gekomen? Laat het ons weten in de commentsectie hieronder!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MongoDB is een NoSQL database die gebruik maakt van JSON-achtige documenten met dynamische schema&#8217;s. Als je met databases werkt, is het altijd goed om een noodplan &#8230;<\/p>\n","protected":false},"author":199,"featured_media":51078,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[884],"class_list":["post-51077","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-webdevelopment-tools"],"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>Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden) - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Een MongoDB replicaset is een groep onderling verbonden MongoDB instanties die redundantie en hoge beschikbaarheid leveren. Gebruik replicasets en beveilig je gegevens!\" \/>\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\/nl\/blog\/mongodb-replicaset\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden)\" \/>\n<meta property=\"og:description\" content=\"Een MongoDB replicaset is een groep onderling verbonden MongoDB instanties die redundantie en hoge beschikbaarheid leveren. Gebruik replicasets en beveilig je gegevens!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-16T07:45:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T05:32:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/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=\"Een MongoDB replicaset is een groep onderling verbonden MongoDB instanties die redundantie en hoge beschikbaarheid leveren. Gebruik replicasets en beveilig je gegevens!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Holcombe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"28 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/\"},\"author\":{\"name\":\"Jeremy Holcombe\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\"},\"headline\":\"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden)\",\"datePublished\":\"2023-03-16T07:45:29+00:00\",\"dateModified\":\"2023-08-24T05:32:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/\"},\"wordCount\":5566,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg\",\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/\",\"name\":\"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden) - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg\",\"datePublished\":\"2023-03-16T07:45:29+00:00\",\"dateModified\":\"2023-08-24T05:32:12+00:00\",\"description\":\"Een MongoDB replicaset is een groep onderling verbonden MongoDB instanties die redundantie en hoge beschikbaarheid leveren. Gebruik replicasets en beveilig je gegevens!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webdevelopment tools\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/webdevelopment-tools\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"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\/nl\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\",\"name\":\"Jeremy Holcombe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/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\/nl\/blog\/author\/jeremyholcombe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden) - Kinsta\u00ae","description":"Een MongoDB replicaset is een groep onderling verbonden MongoDB instanties die redundantie en hoge beschikbaarheid leveren. Gebruik replicasets en beveilig je gegevens!","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\/nl\/blog\/mongodb-replicaset\/","og_locale":"nl_NL","og_type":"article","og_title":"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden)","og_description":"Een MongoDB replicaset is een groep onderling verbonden MongoDB instanties die redundantie en hoge beschikbaarheid leveren. Gebruik replicasets en beveilig je gegevens!","og_url":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2023-03-16T07:45:29+00:00","article_modified_time":"2023-08-24T05:32:12+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg","type":"image\/jpeg"}],"author":"Jeremy Holcombe","twitter_card":"summary_large_image","twitter_description":"Een MongoDB replicaset is een groep onderling verbonden MongoDB instanties die redundantie en hoge beschikbaarheid leveren. Gebruik replicasets en beveilig je gegevens!","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg","twitter_creator":"@Kinsta_NL","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Jeremy Holcombe","Geschatte leestijd":"28 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/"},"author":{"name":"Jeremy Holcombe","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21"},"headline":"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden)","datePublished":"2023-03-16T07:45:29+00:00","dateModified":"2023-08-24T05:32:12+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/"},"wordCount":5566,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg","inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/","url":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/","name":"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden) - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg","datePublished":"2023-03-16T07:45:29+00:00","dateModified":"2023-08-24T05:32:12+00:00","description":"Een MongoDB replicaset is een groep onderling verbonden MongoDB instanties die redundantie en hoge beschikbaarheid leveren. Gebruik replicasets en beveilig je gegevens!","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/mongodb-replica-set.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/mongodb-replicaset\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"Webdevelopment tools","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/webdevelopment-tools\/"},{"@type":"ListItem","position":3,"name":"Bouw in recordtijd een robuuste MongoDB replicaset (4 methoden)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","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\/nl\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21","name":"Jeremy Holcombe","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/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\/nl\/blog\/author\/jeremyholcombe\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/51077","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=51077"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/51077\/revisions"}],"predecessor-version":[{"id":55168,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/51077\/revisions\/55168"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/translations\/dk"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51077\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/51078"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=51077"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=51077"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=51077"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}