{"id":92570,"date":"2020-08-28T19:42:21","date_gmt":"2020-08-28T17:42:21","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker"},"modified":"2020-08-28T19:42:21","modified_gmt":"2020-08-28T17:42:21","slug":"modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Inleiding<\/h1>\n<p><\/p>\n<p>Een tijd geleden kreeg ik de taak om een failovercluster te ontwikkelen voor <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, opererend in meerdere datacenters die via glasvezel met elkaar zijn verbonden in \u00e9\u00e9n stad, en dat in staat is om de uitval (bijvoorbeeld een stroomuitval) van \u00e9\u00e9n datacenter te weerstaan. Als software die verantwoordelijk is voor de failover heb ik gekozen voor <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, omdat dit de offici\u00eble oplossing van RedHat is voor het opzetten van failoverclusters. Het voordeel is dat RedHat ervoor zorgt dat het ondersteund wordt, en dat deze oplossing universeel (modulair) is. Hiermee kan niet alleen de failover voor PostgreSQL worden gegarandeerd, maar ook voor andere services, hetzij door gebruik te maken van standaardmodules, hetzij door speciaal modules te cre\u00ebren voor specifieke behoeften.<\/p>\n<p><\/p>\n<p>Bij deze oplossing kwam een terechte vraag op: hoe failover-robust zal een failovercluster zijn? Om dit te onderzoeken, heb ik een testopstelling ontwikkeld die verschillende storingen op de clusterknopen simuleert, wacht op herstel, herstelt de uitgevallen knoop en gaat verder met de tests in een cyclus. Dit project heette oorspronkelijk hapgsql, maar na verloop van tijd begon de naam, waar slechts \u00e9\u00e9n klinker in staat, me te vervelen. Daarom ben ik de failoverdatabases (en het float IP dat naar hen verwijst) gaan noemen <strong>krogan<\/strong> (een personage uit een computer game, dat alle belangrijke organen gedupliceert heeft), en de knooppunten, clusters en het project zelf werden <strong>tuchanka<\/strong> (de planeet waar de kroganen wonen).<\/p>\n<p><\/p>\n<p>Nu heeft het management toegestaan <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">het project open te stellen voor de open source-gemeenschap onder de MIT-licentie<\/a><\/noindex>. De README wordt binnenkort in het Engels vertaald (omdat verwacht wordt dat de belangrijkste gebruikers ontwikkelaars van Pacemaker en PostgreSQL zullen zijn), en de oude Russische versie van de README heb ik besloten om (gedeeltelijk) in de vorm van dit artikel te presenteren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/7ebb04b3e56337060e981da319192a28.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Clusters worden opgezet op virtuele machines <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. In totaal worden er 12 virtuele machines uitgerold (in totaal 36GiB), die 4 failoverclusters vormen (verschillende varianten). De eerste twee clusters bestaan uit twee PostgreSQL-servers die zich in verschillende datacenters bevinden, en een gemeenschappelijke server <em>witness<\/em> c <strong>quorum device<\/strong> (geplaatst op een goedkope virtuele machine in het derde datacenter), die de onduidelijkheid oplost <strong>50%\/50%<\/strong>, door zijn stem aan \u00e9\u00e9n van de partijen te geven. Het derde cluster is verspreid over drie datacenters: \u00e9\u00e9n master, twee slaves, zonder <strong>quorum device<\/strong>. De vierde cluster bestaat uit vier PostgreSQL-servers, twee per datacenter: \u00e9\u00e9n primaire en de rest replica's, en maakt ook gebruik van <em>witness<\/em> c <strong>quorum device<\/strong>. De vierde kan uitval van twee servers of \u00e9\u00e9n datacenter weerstaan. Deze oplossing kan indien nodig worden opgeschaald naar meer replica's.<\/p>\n<p><\/p>\n<p>Tijdservice <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> is ook herconfigureerbaar voor fouttolerantie, maar er wordt gebruikgemaakt van de methode van <code>ntpd<\/code> (<em>orphan mode<\/em>). De algemene server <em>witness<\/em> fungeert als centrale NTP-server, die zijn tijd aan alle clusters verstrekt, waardoor alle servers op elkaar worden gesynchroniseerd. Als <em>witness<\/em> uitvalt of ge\u00efsoleerd raakt, begint een van de servers in de cluster zijn tijd te verstrekken (binnen de cluster). Een hulpk caching <strong>HTTP proxy<\/strong> is ook opgezet op <em>witness<\/em>, waarmee de andere virtuele machines toegang hebben tot Yum-repositories. In werkelijkheid worden dergelijke services, zoals tijdservice en proxy, waarschijnlijk op speciale servers gehost, terwijl ze in de opstelling op <em>witness<\/em> alleen voor het besparen van het aantal virtuele machines en ruimte.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Versies<\/h1>\n<p><\/p>\n<p>v0. Werkt met CentOS 7 en PostgreSQL 11 op VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">Clusterstructuur<\/h1>\n<p><\/p>\n<p>Alle clusters zijn bedoeld om in verschillende datacenters te worden gehost, verbonden in een plat netwerk en moeten uitval of netwerkisolatie van \u00e9\u00e9n datacenter weerstaan. Daarom <strong>onmogelijk is<\/strong> wordt gebruikt om te beschermen tegen <strong>split-brain<\/strong> de standaardtechnologie Pacemaker, die <em>STONITH<\/em> (Shoot The Other Node In The Head) of <em>fencing<\/em>. De kern ervan is: als de knooppunten in de cluster gaan vermoeden dat er iets mis is met een bepaald knooppunt, dat niet reageert of zich onjuist gedraagt, dan schakelen ze het gedwongen uit via \u2018externe\u2019 apparaten, zoals de IPMI-beheerpunt of UPS. Maar dit werkt alleen in gevallen waarin bij een enkel falen van de server de IPMI of UPS blijft functioneren. Hier is ook bescherming gepland tegen een veel catastrofaler falen, wanneer een heel datacenter uitvalt (bijvoorbeeld geen stroom meer heeft). En bij een dergelijke storing zullen ook alle <em>stonith<\/em>-apparaten (IPMI, UPS, enz.) niet meer werken.<\/p>\n<p><\/p>\n<p>In plaats daarvan ligt de basis van het systeem in het idee van quorum. Alle knooppunten hebben een stem, en alleen degenen die meer dan de helft van alle knooppunten kunnen zien, kunnen functioneren. Dit aantal \u2018meer dan de helft + 1\u2019 wordt genoemd <strong>quorum<\/strong>. Als er geen quorum wordt bereikt, beslist het knooppunt dat het zich in netwerkisolatie bevindt en moet het zijn middelen uitschakelen, d.w.z. dit is zo'n <strong>bescherming tegen split-brain<\/strong>. Als de software die verantwoordelijk is voor dergelijk gedrag niet functioneert, moet de watchdog, bijvoorbeeld op basis van IPMI, worden geactiveerd.<\/p>\n<p><\/p>\n<p>Als het aantal knooppunten even is (een cluster in twee datacenters), kan er een zogenaamde onduidelijkheid ontstaan <strong>50%\/50%<\/strong> (<em>vijftig-vijftig<\/em>), wanneer net isolatie het cluster precies doormidden splitst. Daarom wordt voor een even aantal knooppunten toegevoegd <strong>quorum device<\/strong> \u2014 een on-demand daemon die kan worden uitgevoerd op de goedkoopste virtuele machine in het derde datacenter. Het geeft zijn stem aan een van de segmenten (die het ziet) en lost zo de 50%\/50% onduidelijkheid op. De server waarop het quorum-device zal worden uitgevoerd, heb ik genoemd <em>witness<\/em> (terminologie uit repmgr, ik vond het leuk).<\/p>\n<p><\/p>\n<p>Hulpbronnen kunnen van plaats naar plaats verhuizen, bijvoorbeeld van defecte servers naar werkende of op verzoek van systeembeheerders. Om klanten te laten weten waar hun benodigde hulpbronnen zich bevinden (waar moet men verbinding mee maken?), worden gebruikt <em>drijvende IP<\/em> (<strong>drijvend IP<\/strong>). Dit zijn IP's die Pacemaker over de knooppunten kan verplaatsen (alles bevindt zich in een plat netwerk). Iedere daarvan symboliseert een hulpbron (dienst) en zal zich bevinden waar verbinding mee moet worden gemaakt om toegang te krijgen tot deze dienst (in ons geval de DB).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (schema met verdichting)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Structuur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Het idee was dat we veel kleine databases met een lage belasting hebben, waarvoor het niet rendabel is om een dedicated slave-server in hot standby modus te onderhouden voor read-only transacties (er is geen behoefte aan zo'n verspilling van middelen).<\/p>\n<p><\/p>\n<p>In elk datacenter bevindt zich \u00e9\u00e9n server. Op elke server draaien twee instanties PostgreSQL (in de terminologie van PostgreSQL worden ze clusters genoemd, maar om verwarring te voorkomen zal ik ze instanties noemen, zoals met andere databases; clusters zal ik alleen gebruiken voor Pacemaker-clusters). E\u00e9n instantie werkt in de mastermodus en biedt alleen daar diensten aan (alleen op deze instantie wijst het float IP). De tweede instantie fungeert als slave voor het tweede datacenter en zal alleen diensten verlenen als zijn master uitvalt. Aangezien de meeste tijd slechts \u00e9\u00e9n van de twee instanties (de master) diensten aanbiedt (verzoeken uitvoert), worden alle serverresources geoptimaliseerd voor de master (zoals geheugen voor de cache shared_buffers, enz.), maar zodanig dat er ook genoeg resources zijn voor de tweede instantie (al is het voor minder optimale werking via de bestandssysteemcache) voor het geval van uitval van een van de datacenters. De slave biedt geen diensten aan (voert geen read-only verzoeken uit) tijdens de normale werking van het cluster, om oorlog om resources met de master op dezelfde machine te voorkomen.<\/p>\n<p><\/p>\n<p>Bij twee knooppunten is failover alleen mogelijk bij asynchrone replicatie, want bij synchronisatie leidt de uitval van de slave tot de stopzetting van de master.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Uitval getuige<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uitval getuige (<em>quorum device<\/em>) zal ik alleen beschouwen voor het cluster Tuchanka1, het zal met alle andere hetzelfde verhaal zijn. Bij uitval van de getuige verandert er niets in de clusterstructuur, alles blijft werken zoals het werkte. Maar het quorum wordt 2 uit 3, en daarom zal elke volgende uitval fataal zijn voor de cluster. Het moet dringend worden gerepareerd.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Uitval Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uitval van een van de datacenters voor Tuchanka1. In dit geval <em>witness<\/em> geeft zijn stem aan het tweede knooppunt in het tweede datacenter. Daar verandert de voormalige slave in de master, waardoor beide masters op \u00e9\u00e9n server draaien en beide hun float IP aanwijzen.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka2-klassicheskaya\">Tuchanka2 (klassiek)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-1\">Structuur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Klassiek schema met twee knooppunten. Op de ene draait de master, op de andere de slave. Beide kunnen verzoeken uitvoeren (de slave alleen read-only), daarom wijzen beiden naar float IP: krogan2 \u2014 naar de master, krogan2s1 \u2014 naar de slave. Zowel de master als de slave zullen failover hebben.<\/p>\n<p><\/p>\n<p>Bij twee knooppunten is failover alleen mogelijk bij asynchrone replicatie, want bij synchronisatie leidt de uitval van de slave tot de stopzetting van de master.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Uitval Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bij uitval van een van de datacenters <em>witness<\/em> stemt voor de tweede. Op het enige werkende datacenter zal een master worden opgezet, en beide float IP's zullen naar deze master verwijzen: de master en de slave. Uiteraard moet de instantie zo worden ingesteld dat het voldoende middelen heeft (limieten voor verbindingen enz.) om gelijktijdig alle verbindingen en verzoeken van zowel de master als de slave float IP te verwerken. Dit betekent dat, onder normale omstandigheden, er voldoende limieten beschikbaar moeten zijn.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (veel slaven)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Structuur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alweer een andere extremiteit. Er zijn databases die veel read-only verzoeken ontvangen (een typisch geval van een zwaarbelaste site). Tuchanka4 is een situatie waarbij er drie of meer slaven kunnen zijn om deze verzoeken te verwerken, maar toch niet te veel. Bij een zeer groot aantal slaven moet er een hi\u00ebrarchisch replicatiesysteem worden uitgevonden. In het minimaalste geval (zoals op de afbeelding) zijn er in elk van de twee datacenters twee servers, elk met een PostgreSQL instantie.<\/p>\n<p><\/p>\n<p>Een ander kenmerk van dit schema is dat hier al \u00e9\u00e9n synchrone replicatie kan worden georganiseerd. Deze is zo ingesteld dat het, indien mogelijk, naar een ander datacenter repliceert, en niet naar een replica in hetzelfde datacenter als de master. Zowel de master als elke slave verwijzen naar float IP. Idealiter moet er tussen slaven een verzoekbalancering worden gemaakt met een of andere <em>sql proxy<\/em>, bijvoorbeeld aan de klantzijde. Verschillende soorten klanten kunnen verschillende soorten <em>sql proxy<\/em>nodig hebben, en alleen de ontwikkelaars van de klanten weten wie wat nodig heeft. Deze functionaliteit kan worden ge\u00efmplementeerd door zowel een externe daemon als een clientbibliotheek (connection pool), enz. Dit valt echter buiten het onderwerp van een fouttolerante databasecluster (fouttolerantie <em>SQL proxy<\/em> kan onafhankelijk worden ge\u00efmplementeerd, samen met de fouttolerantie van de client).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Fout van Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bij de storing van \u00e9\u00e9n datacenter (d.w.z. twee servers) stemt de getuige voor de tweede. Als gevolg hiervan zijn er in het tweede datacenter twee servers in werking: op de ene draait de master, en deze verwijst naar de master float IP (voor het ontvangen van read-write verzoeken); en op de tweede server draait een slave met synchrone replicatie, en deze verwijst naar een van de slave float IP's (voor read-only verzoeken).<\/p>\n<p><\/p>\n<p>Het eerste dat opgemerkt moet worden: niet alle slave float IP's zullen actief zijn, maar slechts \u00e9\u00e9n. En voor een correcte werking daarmee moet ervoor gezorgd worden dat <em>sql proxy<\/em> verzendde alle verzoeken naar het enige overgebleven float-IP; en als <em>sql proxy<\/em> nee, dan kunnen alle float-IP's van de slaves door een komma in de URL voor verbinding worden opgesomd. In dat geval met <em>libpq<\/em> de verbinding zal naar het eerste functionele IP gaan, zoals gedaan is in het automatiseringssysteem voor testen. Misschien werkt het niet met andere bibliotheken, zoals JDBC, en is dat nodig <em>sql proxy<\/em>. Dit is gedaan omdat er voor de float-IP's van de slaves een verbod is ingesteld om tegelijkertijd op dezelfde server te draaien, zodat ze gelijkmatig over de slave-servers worden verspreid, als er meerdere in gebruik zijn.<\/p>\n<p><\/p>\n<p>Ten tweede: zelfs in het geval van een storing in het datacenter blijft de synchronisatie-replicatie bestaan. En zelfs als er een secundaire storing optreedt, dat wil zeggen, als een van de twee servers in het overblijvende datacenter defect raakt, zal de cluster, hoewel hij geen diensten meer kan aanbieden, nog steeds informatie over alle toegewezen transacties behouden waarvoor hij een commit-bevestiging heeft gegeven (er zal geen verlies van informatie zijn bij een secundaire storing).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 datacentra)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Structuur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dit is een cluster voor situaties waarin er drie volledig functionele datacentra zijn, elk met een volledig functionele database-server. In dat geval <em>quorum device<\/em> is niet nodig. In \u00e9\u00e9n datacenter draait de master, in de andere twee - slaves. De replicatie is synchronisch, type ANY (slave1, slave2), dat wil zeggen dat de client een commit-bevestiging ontvangt wanneer een van de slaves als eerste antwoordt dat hij de commit heeft geaccepteerd. Het aantal bronnen wordt aangeduid door \u00e9\u00e9n float-IP voor de master en twee voor de slaves. In tegenstelling tot Tuchanka4 zijn alle drie de float-IP's fouttolerant. Voor het balanceren van read-only SQL-verzoeken kan gebruik worden gemaakt van <em>sql proxy<\/em> (met aparte fouttolerantie), of de helft van de clients een slave float-IP toewijzen en de andere helft de tweede.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Fout Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bij een storing in een van de datacentra blijven er twee over. In de ene draait de master en het float-IP van de master, in de andere de slave en beide slave float-IP's (de instantie moet een dubbele reserve aan middelen hebben om alle verbindingen van beide slave float-IP's te accepteren). Tussen de master en de slave is er synchronische replicatie. Bovendien behoudt de cluster de informatie over toegewezen en bevestigde transacties (er zal geen verlies van informatie zijn) in het geval van de vernietiging van twee datacentra (als ze niet tegelijkertijd worden vernietigd).<\/p>\n<p><\/p>\n<p><em>Ik heb besloten om de gedetailleerde beschrijving van de bestandsstructuur en implementatie niet op te nemen. Wie wil experimenteren, kan dit alles lezen in README. Ik geef alleen de beschrijving van de geautomatiseerde testing.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Geautomatiseerd testsysteem<\/h1>\n<p><\/p>\n<p>Voor het testen van de fouttolerantie van clusters met simulaties van verschillende storingen is een geautomatiseerd testsysteem ontwikkeld. Het wordt gestart met een script. <code>test\/failure<\/code>. Het script kan als parameters de nummers van de clusters accepteren die je wilt testen. Bijvoorbeeld, deze opdracht:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>zal alleen de tweede en derde cluster testen. Als er geen parameters zijn opgegeven, worden alle clusters getest. Alle clusters worden parallel getest, en het resultaat wordt weergegeven in het tmux-paneel. Tmux gebruikt een aparte tmux-server, dus het script kan worden uitgevoerd vanuit de standaard tmux, wat resulteert in geneste tmux. Ik raad aan een terminal te gebruiken in een groot venster met een klein lettertype. Voor het starten van de tests worden alle virtuele machines teruggezet naar hun snapshot op het moment dat het script wordt voltooid. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/b546bab1ebbbe365991e1ff3d1667237.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De terminal is verdeeld in kolommen overeenkomend met het aantal te testen clusters, standaard (op de schermafbeelding) zijn dat er vier. De inhoud van de kolommen beschrijf ik aan de hand van Tuchanka2. De panelen op de schermafbeelding zijn genummerd:<\/p>\n<p><\/p>\n<ol>\n<li>Hier wordt statistiek over de tests weergegeven. Kolommen:\n<ul>\n<li><strong>failure<\/strong> \u2014 de naam van de test (functie in het script), die de storing simuleert.<\/li>\n<li><strong>reaction<\/strong> \u2014 het gemiddelde tijd in seconden dat de cluster nodig had om zijn werking te herstellen. Dit wordt gemeten vanaf het begin van het script, dat de storing simuleert, tot het moment waarop de cluster zijn werking herstelt en weer diensten kan verlenen. Als de tijd heel kort is, bijvoorbeeld zes seconden (dat kan voorkomen in clusters met meerdere werknemers (Tuchanka3 en Tuchanka4)), betekent dit dat de storing zich op een asynchrone werknemer bevond en geen invloed heeft gehad op de werking; er was geen wisseling van de staat van de cluster.<\/li>\n<li><strong>deviation<\/strong> \u2014 toont de spreiding (nauwkeurigheid) van de waarde <strong>reaction<\/strong> met de methode \u2018 standaarddeviatie\u2019.<\/li>\n<li><strong>count<\/strong> \u2014 hoe vaak deze test is uitgevoerd.<\/li>\n<\/ul>\n<\/li>\n<li>Een kort overzicht stelt je in staat om te beoordelen wat de cluster op dat moment doet. Het toont het iteratienummer (test), de tijdstempel en de naam van de bewerking. Een te lange uitvoering (&gt; 5 minuten) wijst op een probleem.<\/li>\n<li><strong>heart<\/strong> (hart) \u2014 huidige tijd. Voor visuele beoordeling van de functionaliteit <em>meester<\/em> in zijn tabel wordt voortdurend de huidige tijd geschreven met behulp van het float IP van de meester. Bij succes wordt het resultaat in dit paneel weergegeven.<\/li>\n<li><strong>slag<\/strong> (pols) \u2014 'huidige tijd', die eerder was geregistreerd door een script <strong>heart<\/strong> in de meester, nu gelezen uit <em>slaaf<\/em> via zijn float IP. Maakt visuele beoordeling van de functionaliteit van de slaaf en replicatie mogelijk. In Tuchanka1 zijn er geen slaven met float IP (geen slaven die diensten verlenen), maar er zijn wel twee instanties (DB), dus hier wordt niet weergegeven <strong>slag<\/strong>, met behulp van 1 bit, gelijk aan 0, <strong>heart<\/strong> tweede instantie.<\/li>\n<li>Monitoring van de status van de cluster met behulp van het hulpprogramma <code>pcs mon<\/code>. Toont de structuur, verdeling van bronnen over de knooppunten en andere nuttige informatie.<\/li>\n<li>Hier wordt systeemmonitoring weergegeven met elke virtuele machine van de cluster. Er kunnen meerdere van deze panelen zijn \u2014 zoveel virtuele machines als de cluster heeft. Twee grafieken <em>CPU Load<\/em> (in de virtuele machines twee processoren), naam van de virtuele machine, <em>System Load<\/em> (genoemd als Load Average, omdat het gemiddeld is over 5, 10 en 15 minuten), gegevens over processen en geheugenverdeling.<\/li>\n<li>Tracing van het script dat de tests uitvoert. In geval van een storing \u2014 een plotselinge onderbreking van de werking of een oneindige wachttijd \u2014 kan hier de oorzaak van dit gedrag worden gezien.<\/li>\n<\/ol>\n<p><\/p>\n<p>Tests worden in twee fasen uitgevoerd. Eerst doorloopt het script alle varianten van tests, waarbij willekeurig een virtuele machine wordt gekozen waaraan deze test wordt toegepast. Vervolgens wordt er een oneindige testcyclus uitgevoerd, waarbij bij elke keer willekeurig een virtuele machine en een storing wordt gekozen. Een plotselinge be\u00ebindiging van het testscript (onderste paneel) of een oneindige wachttijd voor iets (&gt; 5 minuten uitvoeringstijd voor \u00e9\u00e9n operatie, dit is zichtbaar in de tracing) geeft aan dat een van de tests op deze cluster is mislukt.<\/p>\n<p><\/p>\n<p>Elke test bestaat uit de volgende bewerkingen:<\/p>\n<p><\/p>\n<ol>\n<li>Start de functie die de storing emuleert.<\/li>\n<li><strong>Klaar?<\/strong> \u2014 wachten op herstel van de functionaliteit van de cluster (wanneer alle diensten worden verleend).<\/li>\n<li>Toont de wachttijd voor herstel van de cluster (<em>reaction<\/em>).<\/li>\n<li><strong>Fix<\/strong> \u2014 cluster wordt 'gerepareerd'. Daarna moet het terugkeren naar een volledig functionele staat en klaar zijn voor de volgende storing.<\/li>\n<\/ol>\n<p><\/p>\n<p>Hier is een lijst met tests met een beschrijving van wat ze doen:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: cre\u00ebert &quot;Out of memory&quot; met een fork-bom.<\/li>\n<li><strong>OutOfSpace<\/strong>: de harde schijf raakt vol. Maar de test is eerder symbolisch, gezien de minimale belasting die tijdens het testen wordt gecre\u00eberd; bij een volle harde schijf komt er meestal geen storing van PostgreSQL voor.<\/li>\n<li><strong>Postgres-KILL<\/strong>: be\u00ebindigt PostgreSQL met het commando <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: pauzeert PostgreSQL met het commando <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: 'schakelt de virtuele machine uit' met het commando <code>VBoxManage controlvm &quot;virtuele machine&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: herstart de virtuele machine met het commando <code>VBoxManage controlvm &quot;virtuele machine&quot; reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: pauzeert de SBD daemon met het commando <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: stuurt via SSH het commando naar de virtuele machine <code>systemctl poweroff<\/code>, het systeem sluit op de juiste manier af.<\/li>\n<li><strong>UnLink<\/strong>: netwerkisolatie, het commando <code>VBoxManage controlvm &quot;virtuele machine&quot; setlinkstate1 uit<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Test be\u00ebindigen ofwel met het standaardcommando tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, of met het commando &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: hierbij wordt de test gestopt, tmux sluit, en de virtuele machines worden uitgeschakeld.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Problemen die tijdens de test zijn vastgesteld<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>Op dit moment <em>de watchdog daemon sbd<\/em> verwerkt het stoppen van de geobserveerde daemon, maar niet hun vastlopen. En als gevolg daarvan worden storingen die alleen vastlopen niet correct afgehandeld <em>Corosync<\/em> en <em>Pacemaker<\/em>, maar die wel vasthouden aan <em>sbd<\/em>. Voor controle <em>Corosync<\/em> al een <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (in GitHub bij <em>sbd<\/em>)<\/a><\/noindex>, aangenomen in de branch <em>master<\/em>. Er is beloofd (in PR#83) dat er ook iets dergelijks voor Pacemaker zal komen, ik hoop dat dit voor <em>RedHat 8<\/em> wordt gedaan. Maar dergelijke 'storingen' zijn theoretisch en kunnen gemakkelijk kunstmatig worden ge\u00efmiteerd met bijvoorbeeld <code>killall -STOP corosync<\/code>, maar komen nooit in de echte wereld voor.<\/p>\n<p>\n<\/li>\n<li>\n<p>Er <em>Pacemaker<\/em> in de versie voor <em>CentOS 7<\/em> is sync_timeout verkeerd ingesteld <em>, met als gevolg dat<\/em> \u2018 <em>quorum device<\/em>bij het falen van \u00e9\u00e9n knooppunt met enige kans ook het tweede knooppunt werd herstart <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">, waar de master naartoe zou moeten verhuizen. Dit werd opgelost door het vergroten van<\/a><\/noindex>tijdens de uitrol (in het script <em>, met als gevolg dat<\/em> \u2018 <em>quorum device<\/em> setup\/setup1 <code>). Deze correctie is niet geaccepteerd door de ontwikkelaars<\/code>, in plaats daarvan hebben ze beloofd de infrastructuur zo te herontwerpen (in een niet nader gespecificeerd toekomst), zodat deze time-out automatisch wordt berekend. <em>Pacemaker<\/em>Als bij het configureren van de database is aangegeven dat in<\/p>\n<p>\n<\/li>\n<li>\n<p>LC_MESSAGES <code>(tekstberichten) Unicode kan worden gebruikt, bijvoorbeeld<\/code> ru_RU.UTF-8 <code>, dan bij het starten<\/code>in een omgeving waar de locale geen UTF-8 is, bijvoorbeeld in een lege omgeving (hier <em>postgres<\/em> pacemaker <em>pgsqlms<\/em>+<em>(paf) start<\/em>in de log in plaats van UTF-8-letters zal vraagtekens zijn <em>postgres<\/em>), dan <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">. De ontwikkelaars van PostgreSQL konden het daarover niet eens worden, wat te doen in dit geval. Dit kan worden omzeild, je moet instellen<\/a><\/noindex>LC_MESSAGES=en_US.UTF-8 <code>LC_MESSAGES=nl_NL.UTF-8<\/code> bij het configureren (aanmaken) van een database-instantie.<\/p>\n<p>\n<\/li>\n<li>\n<p>Als wal_receiver_timeout is ingesteld (standaard is het 60s), dan vindt er tijdens de PostgreSQL-STOP test op de master in de clusters tuchanka3 en tuchanka4 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">geen herverbinding van de replicatie met de nieuwe master plaats.<\/a><\/noindex>. De replicatie is daar synchronisch, waardoor zowel de slave als de nieuwe master stopt. Dit kan worden omzeild door wal_receiver_timeout=0 in de PostgreSQL-configuratie in te stellen.<\/p>\n<p>\n<\/li>\n<li>\n<p>Soms heb ik vastlopers van de replicatie bij PostgreSQL waargenomen tijdens de ForkBomb test (geheugenoverloop). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Na ForkBomb kunnen slaves soms niet opnieuw verbinden met de nieuwe master.<\/a><\/noindex>. Ik heb dit alleen gezien in de clusters tuchanka3 en tuchanka4, waar de master vastliep omdat de replicatie synchronisch is. Het probleem loste zichzelf na enige tijd (ongeveer twee uur) op. Verdere onderzoek is nodig om dit te verhelpen. Op basis van de symptomen lijkt het op een eerdere bug, die door een andere oorzaak wordt veroorzaakt, maar met dezelfde gevolgen.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>De afbeelding van de krogan is afkomstig van <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> met toestemming van de auteur:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Het simuleren van fouttolerante clusters op basis van PostgreSQL en Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/ded1ead387814d97d84d0fb89e025386.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/516538\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u043e\u0432\u043e\u043b\u043e\u043a\u043d\u043e\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0435\u0441\u0442\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435) \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0444\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u043b Pacemaker, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 RedHat \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432. \u041e\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0435\u043c, \u0447\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92571,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92570","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=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.\" \/>\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\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\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\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\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=\"2020-08-28T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-28T17:42:21+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 Modellering van fouttolerante clusters op basis van PostgreSQL en Pacemaker | ProHoster","description":"Inleiding Een tijd geleden kreeg ik de opdracht om een fouttolerante cluster voor PostgreSQL te ontwikkelen.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","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\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.","og:url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","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":"2020-08-28T17:42:21+00:00","article:modified_time":"2020-08-28T17:42:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92570","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:06:03","updated":"2022-09-29 15:28:29","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\/92570","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=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}