{"id":37335,"date":"2019-10-31T22:17:01","date_gmt":"2019-10-31T19:17:01","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah\/"},"modified":"2019-10-31T22:17:01","modified_gmt":"2019-10-31T19:17:01","slug":"kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","title":{"rendered":"De kat van Schr\u00f6dinger zonder doos: het consensusprobleem in gedistribueerde systemen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Stel je voor: in een kamer zitten 5 katten opgesloten, en om hun eigenaar wakker te maken, moeten ze het samen eens worden, want de deur kunnen ze alleen openen als ze met z'n vijven erop springen. Maar als een van de katten Schr\u00f6dingers kat is, en de andere katten weten niet van zijn besluit, dan rijst de vraag: \"Hoe kunnen ze dit doen?\" <\/p>\n<p>In dit artikel leg ik in eenvoudige bewoordingen uit wat de theoretische basis is van gedistribueerde systemen en hoe ze werken. Ik zal ook oppervlakkig de hoofdgedachte bespreken die ten grondslag ligt aan Paxos. <\/p>\n<p><img decoding=\"async\" alt=\"De kat van Schr\u00f6dinger zonder doos: het consensusprobleem in gedistribueerde systemen\" src=\"\/wp-content\/uploads\/2019\/08\/17c1edb1fca739d29dc4922bbbe820ce.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nWanneer ontwikkelaars gebruik maken van cloudinfrastructuren, verschillende databases en werken in clusters van veel knooppunten, zijn ze ervan overtuigd dat de gegevens intact, veilig en altijd beschikbaar zullen zijn. Maar waar komen die garanties vandaan?<\/p>\n<p>In wezen zijn de garanties die we hebben de garanties van de leverancier. Deze worden in de documentatie als volgt beschreven: \"Deze service is betrouwbaar genoeg, hij heeft een bepaalde SLA, maak je geen zorgen, alles werkt gedistribueerd zoals je verwacht.\" <\/p>\n<p>We zijn geneigd het beste te geloven, want slimme mannen van grote bedrijven hebben ons verzekerd dat alles goed zal komen. We stellen ons niet de vraag: waarom zou dit eigenlijk kunnen werken? Is er een formele rechtvaardiging voor de correctheid van zulke systemen?<\/p>\n<p>Onlangs heb ik een bezoek gebracht aan <noindex><a rel=\"nofollow\" href=\"https:\/\/sptdc.ru\">een school voor gedistribueerde berekeningen<\/a><\/noindex> , en ik raakte sterk ge\u00efnspireerd door dit onderwerp. De lezingen op de school leken meer op lessen wiskundige analyse dan op iets wat met computersystemen te maken heeft. Maar zo werden vroeger de belangrijkste algoritmes bewezen die we elke dag gebruiken, vaak zonder het zelf te beseffen. <\/p>\n<p>In de meeste moderne gedistribueerde systemen wordt het consensusalgoritme Paxos en zijn verschillende modificaties gebruikt. Het meest interessante is dat de geldigheid en zelfs de mogelijkheid van dit algoritme eenvoudig met pen en papier kan worden bewezen. In de praktijk wordt het algoritme toegepast in grote systemen die draaien op een enorm aantal knooppunten in de cloud. <\/p>\n<p><b class=\"spoiler_title\">Een lichte illustratie van waar het verder over zal gaan: het probleem van twee generaals<\/b>Laten we voor de warming-up het <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%B4%D0%B2%D1%83%D1%85_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D0%BE%D0%B2\">probleem van twee generaals bespreken<\/a><\/noindex>. <\/p>\n<p>We hebben twee legers - een rode en een witte. De witte troepen zijn gelegerd in de belegerde stad. De rode troepen onder leiding van de generaals A1 en A2 bevinden zich aan weerszijden van de stad. De taak van de roden is om de witte stad aan te vallen en te overwinnen. Echter, het leger van elke rode generaal is afzonderlijk kleiner dan het leger van de witte.<\/p>\n<p><img decoding=\"async\" alt=\"De kat van Schr\u00f6dinger zonder doos: het consensusprobleem in gedistribueerde systemen\" src=\"\/wp-content\/uploads\/2019\/08\/2a684a484d4f6cb3d4e33f2367206d9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe voorwaarden voor overwinning voor de roden: beide generaals moeten tegelijkertijd aanvallen om een numeriek voordeel tegenover de witte te hebben. Hiervoor moeten generaal A1 en A2 met elkaar afspreken. Als elke generaal afzonderlijk aanvalt, zullen de roden verliezen. <\/p>\n<p>Om te overleggen kunnen generaals A1 en A2 boodschappen naar elkaar sturen via het gebied van de witte stad. Een boodschapper kan succesvol de bondgenootgeneraal bereiken, of kan door de tegenstander worden onderschept. De vraag is: is er een zodanige volgorde van communicatie tussen de rode generaals (de volgorde van het verzenden van boodschappers van A1 naar A2 en vice versa van A2 naar A1), waarbij ze gegarandeerd overeenkomen over een aanval op tijdstip X. Hierbij betekent 'gegarandeerd' dat beide generaals ondubbelzinnig bevestiging hebben dat de bondgenoot (de andere generaal) exact op tijdstip X zal aanvallen.<\/p>\n<p>Stel je voor dat A1 een boodschapper naar A2 stuurt met de boodschap: 'Laten we vandaag om middernacht aanvallen!'. Generaal A1 kan niet aanvallen zonder bevestiging van generaal A2. Als de boodschapper van A1 is aangekomen, stuurt generaal A2 een bevestiging met de boodschap: 'Ja, laten we vandaag de witte verslaan'. Maar nu weet generaal A2 niet of zijn boodschapper is aangekomen of niet, hij heeft geen garanties dat de aanval gelijktijdig zal zijn. Nu heeft generaal A2 weer een bevestiging nodig.<\/p>\n<p>Als we hun communicatie verder uiteenzetten, blijkt het volgende: hoe vaak ze ook berichten uitwisselen, er is geen manier om beide generaals gegarandeerd te informeren dat hun berichten zijn ontvangen (ervan uitgaande dat elke boodschapper kan worden onderschept).<\/p>\n<p>De taak van de twee generaals is een uitstekende illustratie van een zeer eenvoudig gedistribueerd systeem, waar twee knooppunten zijn met onbetrouwbare communicatie. Dat betekent dat we geen 100% garantie hebben dat ze zich zullen synchroniseren. Over dit soort problemen in een groter formaat wordt verderop in het artikel gesproken.<\/p>\n<h2>We introduceren het concept van gedistribueerde systemen<\/h2>\n<p>\nEen gedistribueerd systeem is een groep computers (hierna knooppunten genoemd) die met elkaar kunnen communiceren. Elk afzonderlijk knooppunt is een autonome entiteit. Een knooppunt kan taken zelfstandig verwerken, maar om met andere knooppunten te communiceren, moet het berichten verzenden en ontvangen. <\/p>\n<p>Hoe berichten precies zijn ge\u00efmplementeerd en welke protocollen worden gebruikt, is in deze context niet relevant. Belangrijk is dat knooppunten in een gedistribueerd systeem gegevens kunnen uitwisselen door berichten te verzenden.<\/p>\n<p>De definitie lijkt niet zo ingewikkeld, maar we moeten rekening houden met een aantal kenmerken van een gedistribueerd systeem die belangrijk voor ons zullen zijn.<\/p>\n<h4>Kenmerken van gedistribueerde systemen<\/h4>\n<p><\/p>\n<ol>\n<li><b>Gelijktijdigheid<\/b> \u2013 de mogelijkheid van gelijktijdige of concurrerende gebeurtenissen in het systeem. Bovendien beschouwen we gebeurtenissen die op twee verschillende knooppunten plaatsvinden als potentieel concurrerend, totdat we een duidelijke volgorde van deze gebeurtenissen hebben. En over het algemeen hebben we die niet.<\/li>\n<li><b>Het ontbreken van globale klokken<\/b>. We hebben geen duidelijke volgorde van gebeurtenissen vanwege het ontbreken van globale klokken. In de gewone mensenwereld zijn we eraan gewend dat we klokken en een absolute tijd hebben. Alles verandert wanneer we het over gedistribueerde systemen hebben. Zelfs de meest nauwkeurige atoomklokken hebben drift, en er kunnen situaties zijn waarin we niet kunnen zeggen welk van de twee gebeurtenissen eerder heeft plaatsgevonden. Daarom kunnen we ook niet op de tijd vertrouwen.<\/li>\n<li><b>Onafhankelijke storingen van de knooppunten van het systeem<\/b>. Er is nog een probleem: er kan iets misgaan eenvoudigweg omdat onze knooppunten niet eeuwig meegaan. Een harde schijf kan falen, een virtuele machine in de cloud kan opnieuw opstarten, het netwerk kan even uitvallen en berichten kunnen verloren gaan. Bovendien zijn er situaties waarin knooppunten functioneren, maar tegelijk tegen het systeem werken. Deze laatste klasse van problemen heeft zelfs een aparte naam gekregen: het probleem van <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%B2%D0%B8%D0%B7%D0%B0%D0%BD%D1%82%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D1%85_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D0%BE%D0%B2\">de Byzantijnse generaals<\/a><\/noindex>. Het meest populaire voorbeeld van een gedistribueerd systeem met dit probleem is Blockchain. Maar vandaag zullen we deze specifieke klasse van problemen niet bespreken. We zijn ge\u00efnteresseerd in situaties waarin simpelweg \u00e9\u00e9n of meerdere knooppunten kunnen falen.<\/li>\n<li><b>Communicatiemodellen (berichtenuitwisselingsmodellen) tussen knooppunten<\/b>We have already established that nodes communicate by exchanging messages. There are two known message exchange models: synchronous and asynchronous.<\/li>\n<\/ol>\n<p><\/p>\n<h4>Communication models between nodes in distributed systems<\/h4>\n<p>\n<b>Synchronous model<\/b> \u2013 we know for certain that there is a finite known delta time during which a message is guaranteed to reach from one node to another. If this time expires and the message has not arrived, we can confidently say that the node has failed. In this model, we have a predictable waiting time. <\/p>\n<p><b>Asynchronous model<\/b> \u2013 in asynchronous models, we assume that the waiting time is finite, but there is no delta time after which we can guarantee that the node has failed. That is, the waiting time for a message from a node can be arbitrarily long. This is an important definition, and we will discuss it further. <\/p>\n<h2>The concept of consensus in distributed systems<\/h2>\n<p>\nBefore we formally define the concept of consensus, let\u2019s consider an example of a situation where it is needed, namely \u2013 <b>State Machine Replication<\/b>. <\/p>\n<p>We have a certain distributed log. We would like it to be consistent and contain identical data on all nodes of the distributed system. When one of the nodes learns a new value that it intends to write to the log, its task becomes to propose this value to all other nodes so that the log is updated on all nodes and the system transitions to a new consistent state. It is important that the nodes agree with each other: all nodes must agree that the proposed new value is correct, all nodes accept this value, and only then can everyone write the new value to the log. <\/p>\n<p>In other words: none of the nodes objected that they have more up-to-date information, and that the proposed value is incorrect. The agreement between the nodes and the consensus on a single correct accepted value is what consensus in a distributed system is all about. We will further discuss algorithms that allow a distributed system to reliably achieve consensus.<br \/>\n<img decoding=\"async\" alt=\"De kat van Schr\u00f6dinger zonder doos: het consensusprobleem in gedistribueerde systemen\" src=\"\/wp-content\/uploads\/2019\/08\/300b0834985d5d29286a83b00e6775a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFormeel kunnen we een consensusalgoritme (of simpelweg een consensusalgoritme) defini\u00ebren als een functie die een gedistribueerd systeem van toestand A naar toestand B omzet. Deze toestand wordt aanvaard door alle knooppunten, en alle knooppunten kunnen deze bevestigen. Het blijkt dat deze taak helemaal niet zo triviaal is als het op het eerste gezicht lijkt.<\/p>\n<h4>Eigenschappen van het consensusalgoritme<\/h4>\n<p>\nEen consensusalgoritme moet over drie eigenschappen beschikken, zodat het systeem blijft bestaan en vooruitgang boekt bij de overgang van de ene toestand naar de andere:<\/p>\n<ol>\n<li><b>Overeenstemming <\/b> \u2013 alle correct werkende knooppunten moeten dezelfde waarde accepteren (in artikelen wordt deze eigenschap ook als veiligheidskenmerk aangeduid). Alle knooppunten die momenteel functioneren (niet zijn uitgevallen en geen verbinding hebben verloren met anderen) moeten overeenstemming bereiken en een bepaalde definitieve gemeenschappelijke waarde accepteren.\n<p>Hier is het belangrijk te begrijpen dat de knooppunten in het gedistribueerde systeem dat we beschouwen willen overeenkomen. Met andere woorden, we hebben het over systemen waarin iets kan falen (bijvoorbeeld kan een knooppunt falen), maar in dit systeem zijn er zeker geen knooppunten die opzettelijk tegen anderen werken (het probleem van de Byzantijnse generaals). Dankzij deze eigenschap blijft het systeem consistent.<\/li>\n<li><b>Integriteit <\/b> \u2014 als alle correct werkende knooppunten dezelfde waarde voorstellen <b>v<\/b>, dan moet elk correct werkend knooppunt deze waarde accepteren <b>v<\/b>. <\/li>\n<li><b>Be\u00ebindiging <\/b>\u2013 alle correct werkende knooppunten moeten uiteindelijk een bepaalde waarde accepteren (levendigheidseigenschap), wat het algoritme in staat stelt vooruitgang te boeken in het systeem. Elk afzonderlijk correct werkend knooppunt moet vroeg of laat de definitieve waarde accepteren en bevestigen: 'Voor mij is deze waarde waar, ik ben het eens met het hele systeem.'<\/li>\n<\/ol>\n<p><\/p>\n<h4>Voorbeeld van het consensusalgoritme<\/h4>\n<p>\nTerwijl de eigenschappen van het algoritme mogelijk nog niet helemaal duidelijk zijn, zullen we een eenvoudig voorbeeld geven van de stadia die het eenvoudigste consensusalgoritme doorloopt in een systeem met een synchrone berichtenuitwisselingsmodel, waarbij alle knooppunten correct functioneren, berichten niet verloren gaan en er niets stuk is (gebeurt dat echt?).<\/p>\n<ol>\n<li>Alles begint met een voorstel van de hand en het hart (Propose). Stel je voor dat een klant is aangesloten op de node genaamd 'Node 1' en een transactie begint door een nieuwe waarde door te geven - O. Vanaf dat moment zullen we 'Node 1' noemen <b>voorsteller<\/b>. Als voorsteller moet 'Node 1' nu het hele systeem informeren dat hij verse data heeft, en hij stuurt berichten naar alle andere nodes: 'Kijk! Ik heb de waarde 'O' gekregen en ik wil deze opslaan! Bevestig alstublieft dat jullie ook 'O' in jullie logboek willen opslaan.'\n<p><img decoding=\"async\" alt=\"De kat van Schr\u00f6dinger zonder doos: het consensusprobleem in gedistribueerde systemen\" src=\"\/wp-content\/uploads\/2019\/08\/bd6a9394229b8a2a5b0bf987ba53500b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> De volgende fase is de stemming over de voorgestelde waarde (Voting). Wat is het doel hiervan? Het kan voorkomen dat andere nodes recentere informatie hebben ontvangen, en dat zij gegevens hebben over dezelfde transactie.\n<p><img decoding=\"async\" alt=\"De kat van Schr\u00f6dinger zonder doos: het consensusprobleem in gedistribueerde systemen\" src=\"\/wp-content\/uploads\/2019\/08\/7080d6222971c6bab012410ef9e074e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWanneer node 'Node 1' zijn voorstel verzendt, controleren de andere nodes de gegevens over dit evenement in hun logboeken. Als er geen tegenstrijdigheden zijn, verklaren de nodes: 'Ja, ik heb geen andere gegevens over dit evenement. De waarde 'O' is de meest recente informatie die we hebben verkregen.' <\/p>\n<p>In elk ander geval kunnen de nodes 'Node 1' antwoorden: 'Luister! Ik heb recentere gegevens over deze transactie. Niet 'O', maar iets beters.'<\/p>\n<p>In de stemfase komen de nodes tot een beslissing: ofwel accepteren ze allemaal dezelfde waarde, ofwel stemt iemand tegen en geeft aan dat hij recentere gegevens heeft. <\/li>\n<li> Als de stemronde succesvol is verlopen en iedereen 'voor' heeft gestemd, gaat het systeem naar de volgende fase - het accepteren van de waarde (Accept). 'Node 1' verzamelt alle antwoorden van de andere nodes en kondigt aan: 'Iedereen heeft ermee ingestemd dat de waarde 'O' is! Nu verklaar ik officieel dat 'O' onze nieuwe waarde is, de enige voor iedereen! Noteer het in je logboek, vergeet het niet. Noteer het in je log!'\n<p><img decoding=\"async\" alt=\"De kat van Schr\u00f6dinger zonder doos: het consensusprobleem in gedistribueerde systemen\" src=\"\/wp-content\/uploads\/2019\/08\/c4bc2af053a27d7030824d45c3ad6def.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> De andere nodes sturen een bevestiging (Accepted) dat ze de waarde 'O' hebben opgeslagen, omdat er in die tussentijd niets nieuws is binnengekomen (soort van tweefasige commit). Na dit belangrijke evenement beschouwen we de gedistribueerde transactie als uitgevoerd.<br \/>\n <img decoding=\"async\" alt=\"De kat van Schr\u00f6dinger zonder doos: het consensusprobleem in gedistribueerde systemen\" src=\"\/wp-content\/uploads\/2019\/08\/2a9c49729f2607099385fee29f45d1f3.jpg\" style=\"display:block;margin: 0 auto;\" \/> <\/li>\n<\/ol>\n<p>\nDus bestaat het consensusalgoritme in de eenvoudigste vorm uit vier stappen: voorstel, stemming (voting), acceptatie (accept), bevestiging van acceptatie (accepted).<\/p>\n<p>Als we op enig moment niet tot overeenstemming konden komen, gaat het algoritme opnieuw van start, rekening houdend met de informatie die de nodes zullen verstrekken die weigerden de voorgestelde waarde te bevestigen.<\/p>\n<h2>Consensus algoritme in een asynchroon systeem<\/h2>\n<p>\nTot nu toe ging alles goed, want we spraken over een synchrone model van berichtuitwisseling. Maar we weten dat we in de moderne wereld alles gewend zijn om asynchroon te doen. Hoe werkt een dergelijk algoritme in een systeem met een asynchroon model van berichtuitwisseling, waar we aannemen dat de wachttijd voor een antwoord van een knooppunt onbeperkt kan zijn (terwijl we het eruit vallen van een knooppunt ook als een voorbeeld kunnen beschouwen waarbij een knooppunt zo lang kan antwoorden als het wil). <\/p>\n<blockquote><p>Nu we weten hoe het consensus algoritme in principe werkt, is er een vraag voor nieuwsgierige lezers die dit punt hebben bereikt: hoeveel knooppunten in een systeem van N knooppunten met een asynchroon model van berichtenuitwisseling kunnen er uitvallen, zodat het systeem nog steeds consensus kan bereiken?<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">Het juiste antwoord en de onderbouwing zijn in de spoiler.<\/b>Het juiste antwoord: <b>0<\/b>. Als er zelfs maar \u00e9\u00e9n knooppunt in een asynchroon systeem uitvalt, kan het systeem geen consensus bereiken. Deze uitspraak is bewezen in de bekende FLP-theorema (1985, Fischer, Lynch, Paterson, verwijzing naar het origineel aan het einde van het artikel): 'Onmogelijk om een gedistribueerde consensus te bereiken bij het uitvallen van zelfs maar \u00e9\u00e9n knooppunt.'<br \/>\n<img decoding=\"async\" alt=\"De kat van Schr\u00f6dinger zonder doos: het consensusprobleem in gedistribueerde systemen\" src=\"\/wp-content\/uploads\/2019\/08\/92417aafe00841aaa41cbefe0386e21a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJongens, dan hebben we een probleem, we zijn immers gewend dat alles asynchroon is. En nu dit. Hoe verder te leven? <\/p>\n<p>We spraken nu over theorie, over wiskunde. Wat betekent 'consensus kan niet worden bereikt', vertaald van de wiskundige taal naar onze - technische? Het betekent dat 'het niet altijd kan worden bereikt', dat wil zeggen dat er een situatie bestaat waarin consensus niet haalbaar is. Maar wat is dat voor geval? <\/p>\n<p>Dit is precies de schending van de liveness property, zoals hierboven beschreven. We hebben geen algemene overeenstemming en het systeem kan geen voortgang maken (kan niet binnen een eindige tijd worden voltooid) in het geval dat we geen antwoord van alle knooppunten hebben. Omdat we in een asynchroon systeem geen voorspelbare responstijd hebben en we niet kunnen weten of een knooppunt is uitgevallen of gewoon langzaam reageert.<\/p>\n<p>Maar in de praktijk kunnen we een oplossing vinden. Laat ons algoritme een lange tijd kunnen draaien in het geval van uitval (kan potentieel oneindig blijven werken). Maar in de meeste situaties, wanneer de meeste knooppunten correct functioneren, zullen we voortgang in het systeem hebben. <\/p>\n<p>In de praktijk hebben we te maken met gedeeltelijk synchrone communicatiemodellen. Gedeeltelijke synchroniteit wordt als volgt begrepen: in het algemeen hebben we een asynchrone model, maar formeel wordt er een begrip 'global stabilization time' van een bepaald moment in de tijd ge\u00efntroduceerd. <\/p>\n<p>Dit moment in de tijd kan onbeperkt lang uitblijven, maar op een gegeven moment moet het komen. Een virtuele wekker gaat af en vanaf dat moment kunnen we de tijdsdelta voorspellen waarbinnen berichten aankomen. Vanaf dat moment verandert het systeem van asynchroon naar synchroon. In de praktijk hebben we te maken met dergelijke systemen. <\/p>\n<h2>Het Paxos-algoritme lost consensusproblemen op<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Paxos_(computer_science)\">Paxos <\/a><\/noindex> is een familie van algoritmen die het consensusprobleem oplossen voor gedeeltelijk synchrone systemen, op voorwaarde dat sommige knooppunten kunnen falen. De auteur van Paxos is <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Leslie_Lamport\">Leslie Lamport<\/a><\/noindex>. Hij stelde in 1989 een formeel bewijs voor van het bestaan en de juistheid van het algoritme voor. <\/p>\n<p>Maar het bewijs bleek allesbehalve eenvoudig te zijn. De eerste publicatie verscheen pas in 1998 (33 pagina's) met een beschrijving van het algoritme. Het bleek extreem moeilijk te begrijpen, en in 2001 werd een toelichting op het artikel gepubliceerd die 14 pagina's besloeg. De omvang van de publicaties is genoemd om aan te tonen dat het consensusprobleem in werkelijkheid helemaal niet eenvoudig is, en er achter dergelijke algoritmen een enorme inspanning van de slimste mensen schuilgaat.<\/p>\n<blockquote><p>Het is interessant dat Leslie Lamport zelf opmerkte in zijn lezing dat er in het tweede toelichtende artikel \u00e9\u00e9n bewering, \u00e9\u00e9n regel (zonder opgave van welke), is die op verschillende manieren kan worden ge\u00efnterpreteerd. En daardoor werken veel moderne implementaties van Paxos niet helemaal correct. <\/p><\/blockquote>\n<p>\nEen gedetailleerde uitleg van de werking van Paxos beslaat meer dan \u00e9\u00e9n artikel, dus ik zal proberen de kern van het algoritme heel kort over te brengen. In de linkjes aan het einde van mijn artikel vindt u materialen voor verdere verdieping in dit onderwerp.<\/p>\n<h4>Rollen in Paxos<\/h4>\n<p>\nIn het Paxos-algoritme zijn er het begrip rollen. Laten we drie belangrijke bekijken (er zijn modificaties met extra rollen):<\/p>\n<ol>\n<li><b>Proposers (ook de termen: leiders of co\u00f6rdinatoren kunnen worden gebruikt)<\/b>. Dit zijn de jongens die nieuwe waarden van de gebruiker leren en de rol van leider op zich nemen. Hun taak is om een ronde voor te stellen voor de nieuwe waarde en de verdere acties van de knooppunten te co\u00f6rdineren. bovendien staat Paxos in bepaalde situaties meerdere leiders toe.<\/li>\n<li><b>Accepters (Stemgerechtigden)<\/b>. Dit zijn knooppunten die stemmen voor de acceptatie of afwijzing van een bepaalde waarde. Hun rol is cruciaal, omdat het juist van hen afhangt welk staatssysteem volgt na de volgende fase van het consensusalgoritme.<\/li>\n<li><b>Leraren<\/b>. Knooppunten die gewoon de nieuwe geaccepteerde waarde aannemen en opschrijven wanneer de staat van het systeem verandert. Ze nemen geen beslissingen, maar ontvangen gegevens en kunnen deze aan de eindgebruiker doorgeven. <\/li>\n<\/ol>\n<p>\nEen knooppunt kan verschillende rollen combineren in verschillende situaties. <\/p>\n<h4>Het concept van quorum<\/h4>\n<p>\nWe gaan ervan uit dat we een systeem van <b>N<\/b> knooppunten hebben. En daarvan kunnen maximaal <b>F<\/b> knooppunten uitvallen. Als F knooppunten uitvallen, betekent dit dat er in de cluster minstens <b>2F + 1<\/b> acceptorknooppunten. <\/p>\n<p>Dit is nodig zodat we altijd, zelfs in de slechtste situatie, 'goede', correct werkende knooppunten een meerderheid hebben. Dus <b>F + 1<\/b> 'goede' knooppunten die het ermee eens zijn, en de finale waarde zal worden geaccepteerd. In het andere geval kan er een situatie ontstaan waarin verschillende lokale groepen verschillende waarden accepteren en niet met elkaar kunnen overleggen. Daarom hebben we een absolute meerderheid nodig om te winnen in de stemming.<\/p>\n<h4>Het algemene idee van het consensusalgoritme Paxos<\/h4>\n<p>\nHet Paxos-algoritme omvat twee grote fasen, die op hun beurt in twee stappen zijn verdeeld:<\/p>\n<ol>\n<li><b>Fase 1a: Voorbereiden<\/b>. In de voorbereidingsfase meldt de leider (proposer) aan alle knooppunten: \u201cWe beginnen een nieuwe stemronde. We hebben een nieuwe ronde. Het nummer van deze ronde is n. We gaan nu stemmen.\u201d Tot nu toe meldt hij alleen het begin van een nieuwe cyclus, maar geeft geen nieuwe waarde door. De taak van deze fase is om een nieuwe ronde te initi\u00ebren en iedereen zijn unieke nummer te laten weten. Het rondenummer is belangrijk, het moet een waarde zijn die groter is dan alle voorgaande stemnummers van alle eerdere leiders. Want dankzij het rondenummer zullen andere knooppunten in het systeem begrijpen hoe vers de gegevens van de leider zijn. Het is waarschijnlijk dat andere knooppunten al stemresultaten hebben van veel latere rondes en ze zullen de leider gewoon vertellen dat hij achterloopt.<\/li>\n<li><b>Fase 1b: Belofte<\/b>. Wanneer de acceptorknooppunten een nieuw stemronde nummer hebben ontvangen, zijn er twee mogelijke uitkomsten: \n<ul>\n<li>Nummer n van de nieuwe stemronde is groter dan het nummer van welke eerdere stemronde dan ook waaraan de acceptor heeft deelgenomen. In dat geval stuurt de acceptor de leider een belofte dat hij niet meer zal deelnemen aan stemrondes met een lager nummer dan n. Als de acceptor al voor iets gestemd heeft (dat wil zeggen, als hij al in de tweede fase een bepaalde waarde heeft aangenomen), voegt hij zijn aangenomen waarde en het stemnummer van zijn deelname aan zijn belofte toe.<\/li>\n<li>In het andere geval, als de acceptor al bekend is met een stemronde met een hoger nummer, kan hij gewoon de voorbereidingsfase negeren en de leider niet antwoorden.<\/li>\n<\/ul>\n<\/li>\n<li><b>Fase 2a: Accepteer<\/b>. De leider moet wachten op reacties van een quorum (de meerderheid van de knooppunten in het systeem) en, als het vereiste aantal antwoorden is ontvangen, heeft hij twee mogelijke scenario's: \n<ul>\n<li>Sommige van de acceptorknooppunten hebben waarden gestuurd waarvoor ze al hebben gestemd. In dit geval kiest de leider de waarde met het hoogste stemnummer. Laten we deze waarde x noemen en hij stuurt een bericht naar alle knooppunten met de inhoud: \"Accept (n, x)\", waarbij de eerste waarde het stemnummer van zijn eigen Propose-stap is, en de tweede waarde is waarover we eigenlijk stemmen.<\/li>\n<li>Als geen van de acceptorknooppunten waarden heeft gestuurd, maar ze gewoon hebben beloofd te stemmen in deze ronde, kan de leider hen voorstellen om voor zijn waarde te stemmen, de waarde waarvoor hij \u00fcberhaupt leider is geworden. Laten we dit y noemen. Hij stuurt een bericht naar alle knooppunten met de inhoud: \"Accept (n, y)\", vergelijkbaar met de vorige uitkomst.<\/li>\n<\/ul>\n<\/li>\n<li><b>Fase 2b: Geaccepteerd<\/b>. Verder stemmen de acceptorknooppunten, wanneer ze het bericht \"Accept(&hellip;)\" van de leider ontvangen, alleen in overeenstemming met hem (ze sturen een bevestiging naar alle knooppunten dat ze het nieuwe waarde ermee eens zijn) als ze niemand (een andere) leider hebben beloofd deel te nemen aan stemronden met ronde nummer <b>n' &gt; n<\/b>, anders negeren ze het bevestigingsverzoek.\n<p>Als de meerderheid van de knooppunten heeft geantwoord en ze hebben allemaal de nieuwe waarde bevestigd, wordt de nieuwe waarde als geaccepteerd beschouwd. Hiep hiep hoera! Maar als de meerderheid niet is bereikt of er zijn knooppunten die weigeren de nieuwe waarde te accepteren, begint alles opnieuw.<\/li>\n<\/ol>\n<p>\nZo werkt het Paxos-algoritme. Elke fase heeft veel nuances, we hebben de verschillende soorten storingen, problemen met meerdere leiders en meer nauwelijks behandeld, maar het doel van dit artikel is om de lezer op een hoog niveau bekend te maken met de wereld van gedistribueerde rekensystemen.<\/p>\n<p>Het is ook vermeldenswaard dat Paxos niet de enige in zijn soort is; er zijn ook andere algoritmen, bijvoorbeeld, <noindex><a rel=\"nofollow\" href=\"https:\/\/raft.github.io\/\">Raft<\/a><\/noindex>, maar dat is al een onderwerp voor een ander artikel.<\/p>\n<h2>Links naar materialen voor verdere studie<\/h2>\n<p>\nNiveau \"beginneling\":<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/s\/story\/lets-take-a-crack-at-understanding-distributed-consensus-dad23d0dc95\">Hoe Werkt Gedistribueerde Consensus?<\/a><\/noindex>, Preethi Kasireddy, blogartikel op Medium<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@nevverlander\/paxos-made-simple-for-real-aa221be7d91b\">Paxos eenvoudig gemaakt. Voor echt<\/a><\/noindex>, Adi Kancherla, blogartikel op Medium<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ittaiab.github.io\/\">Gedecentraliseerde Gedachten<\/a><\/noindex>, Ittai Abraham, blog<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ittaiab.github.io\/2019-06-01-2019-5-31-models\/\">Synchronie, Asynchronie en Parti\u00eble Synchronie<\/a><\/noindex>, Ittai Abraham, blogartikel<\/li>\n<\/ul>\n<p>\nNiveau \"Leslie Lamport\":<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/groups.csail.mit.edu\/tds\/papers\/Lynch\/jacm85.pdf\">Onmogelijkheid van Gedistribueerde Consensus met \u00c9\u00e9n Defect Proces (FLP-onsmogelijkheid)<\/a><\/noindex>, Fischer, Lynch en Paterson, onderzoeksrapport, 1985<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lamport.azurewebsites.net\/pubs\/lamport-paxos.pdf\">Het Deeltijdparlement<\/a><\/noindex>, Leslie Lamport, onderzoeksrapport, 1998<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lamport.azurewebsites.net\/pubs\/paxos-simple.pdf\">Paxos eenvoudig gemaakt<\/a><\/noindex>, Leslie Lamport, onderzoeksrapport, 2001<\/li>\n<\/ul>\n<p>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzaio\/blog\/463469\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c. \u0412 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0437\u0430\u043f\u0435\u0440\u0442\u044b 5 \u043a\u043e\u0442\u043e\u0432, \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u0445\u043e\u0437\u044f\u0438\u043d\u0430 \u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0432\u0435\u0434\u044c \u0434\u0432\u0435\u0440\u044c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u044f\u0442\u0435\u0440\u043e\u043c \u043d\u0430\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043d\u0435\u0451. \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0432 \u2013 \u043a\u043e\u0442 \u0428\u0440\u0451\u0434\u0438\u043d\u0433\u0435\u0440\u0430, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0442\u044b \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u043e \u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u041a\u0430\u043a \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c?\u00bb \u0412 \u044d\u0442\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28009,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37335","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c. \u0412 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0437\u0430\u043f\u0435\u0440\u0442\u044b 5 \u043a\u043e\u0442\u043e\u0432, \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u0445\u043e\u0437\u044f\u0438\u043d\u0430 \u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0432\u0435\u0434\u044c \u0434\u0432\u0435\u0440\u044c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u044f\u0442\u0435\u0440\u043e\u043c \u043d\u0430\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043d\u0435\u0451.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u043e\u0442 \u0428\u0440\u0451\u0434\u0438\u043d\u0433\u0435\u0440\u0430 \u0431\u0435\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c. \u0412 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0437\u0430\u043f\u0435\u0440\u0442\u044b 5 \u043a\u043e\u0442\u043e\u0432, \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u0445\u043e\u0437\u044f\u0438\u043d\u0430 \u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0432\u0435\u0434\u044c \u0434\u0432\u0435\u0440\u044c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u044f\u0442\u0435\u0440\u043e\u043c \u043d\u0430\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043d\u0435\u0451.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:17:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17:01+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Schr\u00f6dinger's Kat zonder Doos: het consensusprobleem in gedistribueerde systemen | ProHoster","description":"Stel je voor: In een kamer zitten 5 katten opgesloten, en om de eigenaar wakker te maken moeten ze het eens worden, want de deur kunnen ze alleen openen door er met zijn vijven tegenaan te leunen.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u043e\u0442 \u0428\u0440\u0451\u0434\u0438\u043d\u0433\u0435\u0440\u0430 \u0431\u0435\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 | ProHoster","og:description":"\u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c. \u0412 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0437\u0430\u043f\u0435\u0440\u0442\u044b 5 \u043a\u043e\u0442\u043e\u0432, \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u0445\u043e\u0437\u044f\u0438\u043d\u0430 \u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0432\u0435\u0434\u044c \u0434\u0432\u0435\u0440\u044c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u044f\u0442\u0435\u0440\u043e\u043c \u043d\u0430\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043d\u0435\u0451.","og:url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/kot-shryodingera-bez-korobki-problema-konsensusa-v-raspredelyonnyh-sistemah","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:17:01+00:00","article:modified_time":"2019-10-31T19:17:01+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37335","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 17:20:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:28:27","updated":"2026-01-23 17:20:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/37335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=37335"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/37335\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/28009"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=37335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=37335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=37335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}