{"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\/no\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Innledning<\/h1>\n<p><\/p>\n<p>For some time now, I have been tasked with developing a fault-tolerant cluster for <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, operating across several data centers interconnected by fiber optics within a single city, and capable of withstanding the failure (for instance, power outage) of one data center. As the software responsible for fault tolerance, I chose <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, because it is the official solution from RedHat for creating fault-tolerant clusters. Its advantages include that RedHat provides support for it and that it is a universal (modular) solution. With it, we will be able to ensure fault tolerance not only for PostgreSQL but also for other services, either by using standard modules or by creating them for specific needs.<\/p>\n<p><\/p>\n<p>A reasonable question arose regarding this solution: how fault-tolerant will the fault-tolerant cluster be? To investigate this, I developed a test bench that simulates various failures on the nodes of the cluster, waits for recovery, restores the failed node, and continues testing in a cycle. Initially, this project was named hapgsql, but over time I grew weary of a name with only one vowel. Therefore, I began to name the fault-tolerant databases (and the float IPs pointing to them) <strong>krogan<\/strong> (a character from a video game, whose vital organs are all duplicated), while the nodes, clusters, and the project itself are named <strong>tuchanka<\/strong> (the planet where krogan live).<\/p>\n<p><\/p>\n<p>The management has now allowed <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">to open the project for the open source community under the MIT license<\/a><\/noindex>. The README will soon be translated into English (because it is expected that the primary users will be developers of Pacemaker and PostgreSQL), and I decided to format the old Russian version of the README (partially) as this article.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og 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 are deployed on virtual machines <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. A total of 12 virtual machines (36GiB in total) will be deployed, forming 4 fault-tolerant clusters (different options). The first two clusters consist of two PostgreSQL servers located in different data centers and a shared <em>witness<\/em> med <strong>quorum device<\/strong> (hosted on an inexpensive virtual machine in the third data center), which resolves uncertainty <strong>50%\/50%<\/strong>, casting its vote for one of the sides. The third cluster involves three data centers: one master, two slaves, without <strong>quorum device<\/strong>. Den fjerde klyngen best\u00e5r av fire PostgreSQL-servere, to per datasenter: \u00e9n master, de andre replikater, og bruker ogs\u00e5 <em>witness<\/em> med <strong>quorum device<\/strong>. Den fjerde kan h\u00e5ndtere svikt av to servere eller ett datasenter. Dette alternativet kan, om n\u00f8dvendig, skaleres opp med flere replikater.<\/p>\n<p><\/p>\n<p>Tjeneste for presis tid <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> er ogs\u00e5 omkonfigurert for feiltoleranse, men bruker metoden til <code>ntpd<\/code> (<em>orphan mode<\/em>). Den generelle serveren <em>witness<\/em> fungerer som en sentral NTP-server, som distribuerer sitt tid til alle klynger, og dermed synkroniserer alle servere med hverandre. Hvis <em>witness<\/em> blir ute av drift eller isolert, vil en av serverne i klyngen begynne \u00e5 dele sin tid (innen klyngen). Den hjelpsomme cachende <strong>HTTP-proxy<\/strong> er ogs\u00e5 l\u00f8ftet p\u00e5 <em>witness<\/em>, ved hjelp av dette f\u00e5r de andre virtuelle maskinene tilgang til Yum-repositorier. I virkeligheten vil slike tjenester som presis tid og proxy sannsynligvis bli plassert p\u00e5 dedikerte servere, mens i oppsettet er de plassert p\u00e5 <em>witness<\/em> bare for \u00e5 spare antall virtuelle maskiner og plass.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Versjoner<\/h1>\n<p><\/p>\n<p>v0. Kj\u00f8res med CentOS 7 og PostgreSQL 11 p\u00e5 VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">Struktur av klynger<\/h1>\n<p><\/p>\n<p>Alle klynger er designet for \u00e5 v\u00e6re plassert i flere datasentre, koblet sammen i ett flatt nettverk og skal t\u00e5le svikt eller nettverksisolering av ett datasenter. Derfor <strong>is not possible<\/strong> bruke for beskyttelse mot <strong>split-brain<\/strong> standardteknologien Pacemaker, som kalles <em>STONITH<\/em> (Shoot The Other Node In The Head) eller <em>fencing<\/em>. Essensen er: hvis noder i klyngen begynner \u00e5 mistenke at det skjer noe galt med en av nodene, at den ikke svarer eller oppf\u00f8rer seg unormalt, s\u00e5 frakobler de den tvangsmessig via \u00abeksterne\u00bb enheter, som for eksempel en kontrollert IPMI-kort eller UPS. Men dette vil fungere bare i tilfeller der ved en enkelt svikt av serveren, IPMI eller UPS fortsetter \u00e5 fungere. Her planlegges beskyttelse mot en mye mer katastrofal svikt, n\u00e5r hele datasenteret svikter (for eksempel ved str\u00f8mbrudd). Ved en slik svikt vil alle <em>stonith<\/em>-enheter (IPMI, UPS og s\u00e5 videre) ogs\u00e5 slutte \u00e5 fungere.<\/p>\n<p><\/p>\n<p>I stedet ligger ideen om kvorum til grunn for systemet. Alle noder har en stemme, og bare de som ser mer enn halvparten av alle noder kan fungere. Dette antallet \u00abhalvparten +1\u00bb kalles <strong>kvorummet<\/strong>. Hvis kvorum ikke oppn\u00e5s, avgj\u00f8r noden at den befinner seg i nettverksisolasjon og m\u00e5 koble fra sine ressurser, det vil si at det er en slags <strong>beskyttelse mot split-brain<\/strong>. Hvis programvaren som svarer for slik atferd, ikke fungerer, m\u00e5 watchdog, for eksempel basert p\u00e5 IPMI, aktiveres.<\/p>\n<p><\/p>\n<p>Hvis antallet noder er jevnt (klyngen i to datasentre), kan det oppst\u00e5 det som kalles usikkerhet <strong>50%\/50%<\/strong> (<em>fifty-fifty<\/em>), n\u00e5r nettverksisolasjonen deler klyngen n\u00f8yaktig p\u00e5 midten. Derfor blir det lagt til <strong>quorum device<\/strong> \u2014 en uvanlig demon som kan kj\u00f8res p\u00e5 den billigste virtuelle maskinen i det tredje datasenteret. Den gir stemmen sin til en av segmentene (som den oppfatter) og l\u00f8ser dermed usikkerheten p\u00e5 50%\/50%. Serveren der quorum-enheten skal kj\u00f8res, kalte jeg <em>witness<\/em> (terminologi fra repmgr, jeg likte den).<\/p>\n<p><\/p>\n<p>Ressurser kan flyttes fra sted til sted, for eksempel fra defekte servere til fungerende, eller p\u00e5 kommando fra systemadministratorer. For at kundene skal vite hvor de aktuelle ressursene er (hvor skal de koble seg til?), brukes <em>flytende IP<\/em> (<strong>float IP<\/strong>). Dette er IP-er som Pacemaker kan flytte mellom nodene (alt er i et flatt nettverk). Hver av dem symboliserer en ressurs (tjeneste) og vil v\u00e6re der man m\u00e5 koble seg til for \u00e5 f\u00e5 tilgang til denne tjenesten (i v\u00e5rt tilfelle databasen).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (plattform med tetning)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ideen var at vi har mange sm\u00e5 databaser med lav belastning, for hvilke det ikke er \u00f8konomisk \u00e5 opprettholde en dedikert slave-server i hot standby for read-only transaksjoner (det er un\u00f8dvendig ressursbruk).<\/p>\n<p><\/p>\n<p>I hvert datasenter er det \u00e9n server. Hver server har to PostgreSQL-instanser (i PostgreSQL-terminologi kalles de klynger, men for \u00e5 unng\u00e5 forvirring vil jeg kalle dem instanser (p\u00e5 lignende m\u00e5te som andre databaser), og klynger vil jeg kun bruke om Pacemaker-klynger). \u00c9n instans fungerer i master-modus, og det er bare den som tilbyr tjenester (det er bare til den det lenkes float IP). Den andre instansen fungerer som slave for det andre datasenteret, og vil kun tilby tjenester hvis dens master svikter. Siden det meste av tiden kun \u00e9n instans av de to (master) tilbyr tjenester (utf\u00f8rer foresp\u00f8rselene), optimaliseres alle serverressurser mot master (minne tildeles til cache shared_buffers osv.), men s\u00f8rger for at den andre instansen ogs\u00e5 har tilstrekkelige ressurser (selv om det er for suboptimal drift via filsystemcache) i tilfelle et av datasentrene svikter. Slaven tilbyr ingen tjenester (utf\u00f8rer ikke lese-foresp\u00f8rselene) under normal drift av klyngen, for \u00e5 unng\u00e5 ressurskonflikter med master p\u00e5 samme maskin.<\/p>\n<p><\/p>\n<p>I tilfelle med to noder er feiltoleranse kun mulig med asynkron replikering, ettersom ved synkron replikering vil feil i slaven f\u00f8re til at master stopper.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Feil i witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Feil i witness (<em>quorum device<\/em>) vil jeg kun vurdere for klyngen Tuchanka1, det vil v\u00e6re den samme historien for alle andre. Ved feil i witness vil ingenting endres i klyngeoppsettelsen, alt vil fortsette \u00e5 fungere som f\u00f8r. Men kvorum vil bli lik 2 av 3, og derfor vil enhver annen neste feil v\u00e6re fatal for klyngen. Det m\u00e5 uansett fikses straks.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Feil i Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Feil i ett av datasentrene for Tuchanka1. I dette tilfellet <em>witness<\/em> gir stemmen sin til den andre noden i det andre datasenteret. Der blir den tidligere slaven til master, slik at begge mestere kj\u00f8rer p\u00e5 \u00e9n server og begge deres float IP-er peker til dem.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka2-klassicheskaya\">Tuchanka2 (klassisk)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-1\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Klassisk oppsett med to noder. \u00c9n kj\u00f8rer som master, den andre som slave. Begge kan utf\u00f8re foresp\u00f8rseler (slaven kun lese), s\u00e5 begge har float IP: krogan2 \u2014 for master, krogan2s1 \u2014 for slaven. Feiltoleranse vil v\u00e6re for b\u00e5de master og slave.<\/p>\n<p><\/p>\n<p>I tilfelle med to noder er feiltoleranse kun mulig med asynkron replikering, fordi ved synkron replikering vil feil i slaven f\u00f8re til at master stopper.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Feil i Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ved feil i ett av datasentrene <em>witness<\/em> stemmer for den andre. Den eneste fungerende datasenteret vil heve mesteren, og begge float IP-er vil peke mot den: mesteren og slave. Selvf\u00f8lgelig m\u00e5 instansen v\u00e6re konfigurert slik at den har nok ressurser (grenser for tilkobling osv.) til \u00e5 samtidig motta alle tilkoblinger og foresp\u00f8rselene fra master- og slave float IP. Det vil si at den m\u00e5 ha en tilstrekkelig margin p\u00e5 grensene under normal drift.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (mange slaver)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det er allerede en annen ekstremitet. Det finnes databaser som mottar mange foresp\u00f8rselene for lesing (et typisk tilfelle med h\u00f8ytrafikk-nettsteder). Tuchanka4 er en situasjon hvor det kan v\u00e6re tre eller flere slaver for \u00e5 h\u00e5ndtere slike foresp\u00f8rselene, men ikke for mange. Med veldig mange slaver m\u00e5 det oppfinnes et hierarkisk system for replikering. I minimumstilfellet (i bildet) er det to servere i hvert datasenter, og p\u00e5 hver av dem er det en instans av PostgreSQL.<\/p>\n<p><\/p>\n<p>En annen funksjon ved dette systemet er at det allerede er mulig \u00e5 organisere en synkron replikering. Den er konfigurert for \u00e5 replikere, om mulig, til et annet datasenter, og ikke til en replika i samme datasenter som mesteren. B\u00e5de p\u00e5 mesteren og p\u00e5 hver slave peker float IP. Ideelt sett m\u00e5 det gj\u00f8res lastbalansering av foresp\u00f8rselet mellom slavene ved hjelp av noe <em>sql proxy<\/em>, for eksempel, p\u00e5 klientsiden. Ulike typer kunder kan kreve forskjellig typ <em>sql proxy<\/em>, og bare utviklerne av klientene vet hvem som trenger hva. Denne funksjonaliteten kan implementeres b\u00e5de som en ekstern demon og som en klientbibliotek (tilkoblingspool), osv. Alt dette g\u00e5r utover temaet for feiltolerante databaser (feiltoleranse <em>SQL proxy<\/em> kan implementeres uavhengig av klientens feiltoleranse).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Feil Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ved feil med ett datasenter (dvs. to servere) stemmer vitnet for den andre. Resultatet er at to servere fungerer i det andre datasenteret: p\u00e5 den ene kj\u00f8rer mesteren, og den peker mot master float IP (for \u00e5 motta lesing-skriving foresp\u00f8rselene); og p\u00e5 den andre serveren kj\u00f8rer en slave med synkron replikering, og den peker mot en av slave float IP (for read only-foresp\u00f8rselen).<\/p>\n<p><\/p>\n<p>Det f\u00f8rste som m\u00e5 nevnes: ikke alle slave float IP-er vil v\u00e6re aktive, kun \u00e9n. Og for at den skal fungere korrekt, m\u00e5 det v\u00e6re kommandoer som sikrer det. <em>sql proxy<\/em> vider alle foresp\u00f8rselene til den eneste gjenv\u00e6rende float IP; hvis ikke <em>sql proxy<\/em> , kan du liste opp alle float IP-ene til slavene med komma i URL-en for tilkobling. I s\u00e5 fall vil <em>libpq<\/em> tilkoblingen v\u00e6re til den f\u00f8rste fungerende IP-en, slik det er gjort i automatisk testingssystem. Det kan hende at det ikke vil fungere p\u00e5 andre biblioteker, for eksempel JDBC, og det vil v\u00e6re n\u00f8dvendig <em>sql proxy<\/em>. Det er gjort fordi float IP-ene til slavene har restriksjonen om at de ikke kan aktiveres samtidig p\u00e5 \u00e9n server, slik at de blir jevnt fordelt over slave-serverne hvis det er flere som jobber.<\/p>\n<p><\/p>\n<p>For det andre: selv i tilfelle av datasenterfeil vil synkron replikering bli bevart. Og selv om det skjer en sekund\u00e6r feil, det vil si at en av de to serverne i det gjenv\u00e6rende datasenteret svikter, vil klyngen, selv om den slutter \u00e5 tilby tjenester, fortsatt beholde informasjon om alle bekreftede transaksjoner som den har gitt bekreftelse p\u00e5 for kommittering (det vil ikke v\u00e6re noen tap av informasjon ved sekund\u00e6rfeil).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 datasentre)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dette er en klynge for situasjonen der det finnes tre fullt fungerende datasentre, hvor hver av dem har en fullt fungerende databaseserver. I dette tilfellet <em>quorum device<\/em> er ikke n\u00f8dvendig. I ett datasenter fungerer master, mens i de to andre er det slaver. Replikeringen er synkron, av typen ANY (slave1, slave2), noe som inneb\u00e6rer at klienten vil motta bekreftelse p\u00e5 kommittering n\u00e5r noen av slavene f\u00f8rst svarer at de har mottatt kommitteringen. Ressursene peker p\u00e5 \u00e9n float IP for master og to for slavene. I motsetning til Tuchanka4 er alle tre float IP-ene feiltolerante. For \u00e5 balansere read-only SQL-foresp\u00f8rslene kan man bruke <em>sql proxy<\/em> (med separat feiltoleranse), eller man kan tildele \u00e9n slave float IP til halvparten av klientene og en annen til den andre halvparten.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Feil Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ved feil p\u00e5 ett av datasentrene er det fortsatt to igjen. I ett er master og masterens float IP aktivert, mens i det andre er det slaver og begge slavernes float IP-er (instansen m\u00e5 ha dobbelt s\u00e5 mange ressurser tilgjengelig for \u00e5 h\u00e5ndtere alle tilkoblinger fra begge slavernes float IP-er). Det er synkron replikering mellom masterne og slaven. Klyngen vil ogs\u00e5 bevare informasjon om bekreftede og kommitterte transaksjoner (det vil ikke v\u00e6re tap av informasjon) i tilfelle to datasentre blir \u00f8delagt (s\u00e5 lenge de ikke blir \u00f8delagt samtidig).<\/p>\n<p><\/p>\n<p><em>Eg detaljert beskrivelse av filstrukturen og distribusjonen bestemte jeg meg for ikke \u00e5 inkludere. De som \u00f8nsker \u00e5 eksperimentere, kan lese alt dette i README. Jeg gir bare en beskrivelse av automatisk testing.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Automatisk testingssystem<\/h1>\n<p><\/p>\n<p>For \u00e5 teste klusterets feilresistens med simulering av forskjellige feil er det laget et automatisk testingssystem. Det kj\u00f8res av et skript <code>test\/failure<\/code>. Skriptet kan ta som parametere nummer p\u00e5 klusterne som skal testes. For eksempel, denne kommandoen:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>vil teste bare det andre og tredje klusteret. Hvis ingen parametere er angitt, vil alle klusterne bli testet. Alle klusterne testes parallelt, og resultatet vises i tmux-panelet. Tmux bruker en dedikert tmux-server, s\u00e5 skriptet kan kj\u00f8res fra standard tmux, og det vil bli en nestet tmux. Jeg anbefaler \u00e5 bruke terminalen i et stort vindu med liten skrift. F\u00f8r testing starter, tilbakestilles alle virtuelle maskiner til et snapshot fra tidspunktet da skriptet ble avsluttet. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/b546bab1ebbbe365991e1ff3d1667237.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terminalen er delt inn i kolonner tilsvarende antall testede klustre; som standard (p\u00e5 skjermbildet) er det fire. Innholdet i kolonnene vil jeg utbrodere med eksemplet Tuchanka2. Panelene p\u00e5 skjermbildet er nummerert:<\/p>\n<p><\/p>\n<ol>\n<li>Her vises statistikk for testene. Kolonner:\n<ul>\n<li><strong>failure<\/strong> \u2014 navnet p\u00e5 testen (funksjonen i skriptet) som simulerer en feil.<\/li>\n<li><strong>reaction<\/strong> \u2014 det aritmetiske gjennomsnittlige tiden i sekunder som klusteret gjenopprettet sin drift. M\u00e5les fra skriptets start som simulerer feilen og til \u00f8yeblikket da klusteret gjenoppretter sin drift og er i stand til \u00e5 fortsette \u00e5 tilby tjenester. Hvis tiden er veldig kort, for eksempel seks sekunder (slik som i kluster med flere slaver (Tuchanka3 og Tuchanka4)), betyr det at feilen oppstod p\u00e5 en asynkron slave og ikke p\u00e5virket driften; det var ingen tilstandsbytter i klusteret.<\/li>\n<li><strong>deviation<\/strong> \u2014 viser variasjon (presisjon) av verdien <strong>reaction<\/strong> metoden \"standardavvik\".<\/li>\n<li><strong>count<\/strong> \u2014 hvor mange ganger denne testen har blitt utf\u00f8rt.<\/li>\n<\/ul>\n<\/li>\n<li>En kort logg gir en oversikt over hva klusteret jobber med akkurat n\u00e5. Den viser nummeret p\u00e5 iterasjonen (testen), tidsstempelet og navnet p\u00e5 operasjonen. En for lang utf\u00f8relse (&gt; 5 minutter) indikerer et problem.<\/li>\n<li><strong>heart<\/strong> (hjertet) \u2014 gjeldende tid. For visuell vurdering av ytelse <em>mesteren<\/em> i tabellen hans skrives hele tiden gjeldende tid med bruk av mesters float IP. Ved suksess vises resultatet i dette panelet.<\/li>\n<li><strong>beat<\/strong> (puls) \u2014 \u00abgjeldende tid\u00bb, som tidligere ble registrert av skriptet <strong>heart<\/strong> i mesteren, n\u00e5 leses fra <em>slaven<\/em> gjennom hans float IP. Tillater visuell vurdering av ytelsen til slaven og replikasjonen. I Tuchanka1 finnes det ingen slaver med float IP (ingen slaver som tilbyr tjenester), men her er det to instanser (DB), s\u00e5 her vil det ikke bli vist <strong>beat<\/strong>, men <strong>heart<\/strong> den andre instansen.<\/li>\n<li>Overv\u00e5king av klyngens tilstand ved hjelp av verkt\u00f8yet <code>pcs mon<\/code>. Viser strukturen, ressursfordelingen over nodene og annen nyttig informasjon.<\/li>\n<li>Her vises systemoverv\u00e5kning fra hver virtuell maskin i klyngen. Det kan v\u00e6re flere slike paneler \u2014 s\u00e5 mange virtuelle maskiner som det er i klyngen. To grafer <em>CPU Load<\/em> (i de virtuelle maskinene med to prosessorer), navnet p\u00e5 den virtuelle maskinen, <em>System Load<\/em> (kalt Load Average, fordi det er gjennomsnittlig over 5, 10 og 15 minutter), prosessdata, og minnefordeling.<\/li>\n<li>Sporing av skriptet som utf\u00f8rer testing. Ved feil \u2014 plutselig avbrudd av arbeidet eller en uendelig venteloop \u2014 kan man her se \u00e5rsaken til slik oppf\u00f8rsel.<\/li>\n<\/ol>\n<p><\/p>\n<p>Testing utf\u00f8res i to trinn. F\u00f8rst g\u00e5r skriptet gjennom alle testtyper, tilfeldig velger en virtuell maskin som testen skal anvendes p\u00e5. Deretter utf\u00f8res en uendelig testloop, hvor virtuelle maskiner og feil velges tilfeldig hver gang. Plutselig avslutning av testskriptet (nederste panel) eller en uendelig venteloop (mer enn 5 minutters kj\u00f8retid for en operasjon, synlig i sporing) indikerer at en av testene p\u00e5 denne klyngen har feilet.<\/p>\n<p><\/p>\n<p>Hver test best\u00e5r av f\u00f8lgende operasjoner:<\/p>\n<p><\/p>\n<ol>\n<li>Igangsetting av funksjonen som simulerer en feil.<\/li>\n<li><strong>Klar?<\/strong> \u2014 venting p\u00e5 gjenoppretting av klyngens arbeidsevne (n\u00e5r alle tjenester er tilgjengelige).<\/li>\n<li>Venter p\u00e5 gjenoppretting av klyngen (<em>reaction<\/em>).<\/li>\n<li><strong>Fix<\/strong> \u2014 klyngen \u00abfikses\u00bb. Etter dette skal den komme tilbake til full drift og klar for neste feil.<\/li>\n<\/ol>\n<p><\/p>\n<p>Her er listen over tester med beskrivelse av hva de gj\u00f8r:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: lager &quot;Out of memory&quot; med en fork-bombe.<\/li>\n<li><strong>OutOfSpace<\/strong>: fyller opp harddisken. Men testen er i s\u00e5 m\u00e5te symbolsk, med den ubetydelige belastningen som oppst\u00e5r under testing; ved overfylling av harddisken skjer det vanligvis ikke en feil i PostgreSQL.<\/li>\n<li><strong>Postgres-KILL<\/strong>: dreper PostgreSQL ved hjelp av kommandoen <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: setter PostgreSQL i ventemodus ved hjelp av kommandoen <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \u00abdeaktiverer\u00bb virtualmaskinen med kommandoen <code>VBoxManage controlvm &quot;virtuell maskin&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: omstarter virtualmaskinen med kommandoen <code>VBoxManage controlvm &quot;virtuell maskin&quot; reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: setter SBD-demonen i ventemodus med kommandoen <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: sender en kommando til virtualmaskinen via SSH <code>systemctl poweroff<\/code>, systemet avslutter korrekt.<\/li>\n<li><strong>UnLink<\/strong>: nettverksisolering, kommando <code>VBoxManage controlvm &quot;virtuell maskin&quot; setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Avslutte testing enten med standardkommandoen tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, eller med kommandoen &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: n\u00e5r dette skjer, avsluttes testen, tmux lukkes, og virtualmaskinene sl\u00e5s av.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Problemer identifisert under testing<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>For \u00f8yeblikket <em>watchdog-demonen sbd<\/em> h\u00e5ndterer stopp av overv\u00e5kede demoner, men ikke deres hengel\u00e5s. Som en konsekvens h\u00e5ndteres ikke feil riktig, noe som f\u00f8rer til hengel\u00e5s av demoner <em>Corosync<\/em> og <em>Pacemaker<\/em>, men uten \u00e5 faktisk fryse <em>sbd<\/em>. For \u00e5 sjekke <em>Corosync<\/em> er allerede <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (i GitHub i <em>sbd<\/em>)<\/a><\/noindex>, akseptert inn i grenen <em>master<\/em>. De lovet (i PR#83) at det ogs\u00e5 ville v\u00e6re noe lignende for Pacemaker, jeg h\u00e5per at til <em>RedHat 8<\/em> vil det bli gjort. Men slike \u00abfeil\u00bb er teoretiske, lett imiterbare kunstig, for eksempel <code>killall -STOP corosync<\/code>, men de forekommer aldri i virkeligheten.<\/p>\n<p>\n<\/li>\n<li>\n<p>Det <em>Pacemaker<\/em> i versjonen for <em>CentOS 7<\/em> er sync_timeout <em>feilaktig stilt<\/em> til <em>quorum device<\/em>, som resulterer i <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">at ved feil p\u00e5 en node blir den andre noden med en viss sannsynlighet omstartet<\/a><\/noindex>, som mesteren skulle ha flyttet til. Dette ble l\u00f8st ved \u00e5 \u00f8ke <em>feilaktig stilt<\/em> til <em>quorum device<\/em> under distribusjon (i skriptet <code>setup\/setup1<\/code>). Denne endringen ble ikke akseptert av utviklerne <em>Pacemaker<\/em>, i stedet lovte de \u00e5 omarbeide infrastrukturen slik at den tidsavbruddet ble beregnet automatisk (i en uspesifisert fremtid).<\/p>\n<p>\n<\/li>\n<li>\n<p>N\u00e5r du konfigurerer databasen, hvis det er angitt at <code>LC_MESSAGES<\/code> (tekstmeldinger) kan bruke Unicode, for eksempel <code>ru_RU.UTF-8<\/code>, s\u00e5 ved oppstart <em>postgres<\/em> i et milj\u00f8 der locale ikke er UTF-8, for eksempel i et tomt milj\u00f8 (her <em>pacemaker<\/em>+<em>pgsqlms<\/em>(paf) starter <em>postgres<\/em>), then <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">i loggen i stedet for UTF-8-tegn vil det v\u00e6re sp\u00f8rsm\u00e5lstegn<\/a><\/noindex>. Utviklerne av PostgreSQL ble aldri enige om hva de skulle gj\u00f8re i dette tilfellet. Dette kan omg\u00e5s, man m\u00e5 sette <code>LC_MESSAGES=en_US.UTF-8<\/code> N\u00e5r du konfigurerer (oppretter) en DB-instans.<\/p>\n<p>\n<\/li>\n<li>\n<p>Hvis wal_receiver_timeout er satt (standard 60s), s\u00e5 ved testing av PostgreSQL-STOP p\u00e5 masteren i klusterne tuchanka3 og tuchanka4 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">skjer det ingen gjenoppretting av replikasjonen til den nye masteren.<\/a><\/noindex>. Replikasjonen der er synkron, s\u00e5 n\u00e5r den stoppe, stopper b\u00e5de arbeidsenhet og ny master. Problemet l\u00f8ses ved \u00e5 sette wal_receiver_timeout=0 under PostgreSQL-oppsettet.<\/p>\n<p>\n<\/li>\n<li>\n<p>Jeg har sjelden sett replikasjonsfrysing i PostgreSQL under ForkBomb-testen (minneoverbelastning). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Etter ForkBomb kan arbeidsenhetene noen ganger mislykkes i \u00e5 koble til den nye masteren.<\/a><\/noindex>. Jeg har bare sett dette i klusterne tuchanka3 og tuchanka4, hvor, siden replikasjonen er synkron, fryser masteren. Problemet g\u00e5r vanligvis over av seg selv etter en viss tid (omtrent to timer). Det kreves ytterligere unders\u00f8kelse for \u00e5 fikse dette. Symptomene ligner p\u00e5 en tidligere feil, som for\u00e5rsakes av en annen grunn, men med samme konsekvenser.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Krogan-bildet er hentet fra <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> med tillatelse fra forfatteren:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av feiltolerante klynger basert p\u00e5 PostgreSQL og Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/ded1ead387814d97d84d0fb89e025386.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Modellering av feiltolerante kluster basert p\u00e5 PostgreSQL og Pacemaker | ProHoster","description":"Innledning For en tid tilbake fikk jeg i oppgave \u00e5 utvikle et feiltolerant kluster for PostgreSQL.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}