{"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\/sv\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Introduktion<\/h1>\n<p><\/p>\n<p>F\u00f6r en tid sedan fick jag i uppdrag att utveckla en h\u00f6g tillg\u00e4nglighetskluster f\u00f6r <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, som fungerar i flera datacentra, kopplade med fiber inom samma stad, och som kan klara av att ett datacenter g\u00e5r nere (till exempel str\u00f6mavbrott). Som programvara f\u00f6r h\u00f6g tillg\u00e4nglighet valde jag <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, eftersom detta \u00e4r den officiella l\u00f6sningen fr\u00e5n RedHat f\u00f6r att skapa h\u00f6g tillg\u00e4ngliga kluster. Det \u00e4r bra eftersom RedHat ger st\u00f6d f\u00f6r det, och det \u00e4r en universell (modul\u00e4r) l\u00f6sning. Med hj\u00e4lp av detta kan h\u00f6g tillg\u00e4nglighet s\u00e4kerst\u00e4llas f\u00f6r inte bara PostgreSQL, utan ocks\u00e5 andra tj\u00e4nster, antingen genom att anv\u00e4nda standardmoduler eller genom att skapa dem f\u00f6r specifika behov.<\/p>\n<p><\/p>\n<p>Det uppstod en rimlig fr\u00e5ga om detta l\u00f6sning: hur h\u00f6g tillg\u00e4nglighet kommer det h\u00f6g tillg\u00e4nglighetsklustret att ha? F\u00f6r att unders\u00f6ka detta utvecklade jag en testmilj\u00f6 som imiterar olika fel p\u00e5 klusternoderna, v\u00e4ntar p\u00e5 \u00e5terst\u00e4llande av funktionaliteten, \u00e5terst\u00e4ller den misslyckade noden och forts\u00e4tter testningen i cykler. Ursprungligen kallades detta projekt hapgsql, men med tiden blev jag tr\u00f6tt p\u00e5 namnet som bara hade en vokal. D\u00e4rf\u00f6r b\u00f6rjade jag kalla h\u00f6g tillg\u00e4ngliga databaser (och den flytande IP som pekar p\u00e5 dem) <strong>krogan<\/strong> (en karakt\u00e4r fr\u00e5n ett datorspel vars alla viktiga organ \u00e4r duplicerade), och noder, kluster och sj\u00e4lva projektet \u2014 <strong>tuchanka<\/strong> (planeten d\u00e4r krogans bor).<\/p>\n<p><\/p>\n<p>Nu har ledningen beslutat att <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">\u00f6ppna projektet f\u00f6r open source-gemenskapen under MIT-licensen<\/a><\/noindex>. README kommer snart att \u00f6vers\u00e4ttas till engelska (eftersom det f\u00f6rv\u00e4ntas att huvudkonsumenterna kommer att vara utvecklare av Pacemaker och PostgreSQL), och den gamla ryska varianten av README har jag beslutat att utforma (delvis) i form av denna artikel.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och 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>Klustren s\u00e4tts upp p\u00e5 virtuella maskiner <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. Totalt kommer 12 virtuella maskiner att s\u00e4ttas upp (totalt 36 GiB), som bildar 4 h\u00f6g tillg\u00e4nglighetskluster (olika varianter). De f\u00f6rsta tv\u00e5 klustren best\u00e5r av tv\u00e5 PostgreSQL-servrar, som \u00e4r placerade i olika datacentra, och en gemensam server <em>witness<\/em> c <strong>quorum device<\/strong> (placerad p\u00e5 en billig virtuell maskin i det tredje datacentret), som l\u00f6ser os\u00e4kerheten <strong>50%\/50%<\/strong>, genom att ge sin r\u00f6st till en av parterna. Det tredje klustret best\u00e5r av tre datacenter: en master och tv\u00e5 slavservrar, utan <strong>quorum device<\/strong>. Den fj\u00e4rde klustret best\u00e5r av fyra PostgreSQL-servrar, tv\u00e5 per datacenter: en master och resten repliker, och anv\u00e4nder ocks\u00e5 <em>witness<\/em> c <strong>quorum device<\/strong>. Fj\u00e4rde klustret klarar av att f\u00f6rlora tv\u00e5 servrar eller ett datacenter. Denna l\u00f6sning kan, vid behov, skalas upp till fler repliker.<\/p>\n<p><\/p>\n<p>Tj\u00e4nst f\u00f6r exakt tid <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> har ocks\u00e5 konfigurerats f\u00f6r h\u00f6g tillg\u00e4nglighet, men d\u00e4r anv\u00e4nds metoden f\u00f6r <code>ntpd<\/code> (<em>orphan mode<\/em>). Den gemensamma servern <em>witness<\/em> har en central roll som NTP-server, som delar sin tid med alla kluster och p\u00e5 s\u00e5 s\u00e4tt synkroniserar alla servrar med varandra. Om <em>witness<\/em> den g\u00e5r s\u00f6nder eller blir isolerad, d\u00e5 b\u00f6rjar en av klusterservrarna (inom klustret) dela sin tid. En hj\u00e4lpkassande <strong>HTTP-proxy<\/strong> \u00e4r ocks\u00e5 uppr\u00e4ttad, <em>witness<\/em>med hj\u00e4lp av denna har de andra virtuella maskinerna tillg\u00e5ng till Yum-repositorier. I verkligheten kommer s\u00e5dana tj\u00e4nster som exakt tid och proxy f\u00f6rmodligen att hostas p\u00e5 dedikerade servrar, men i detta stand har de placerats p\u00e5 <em>witness<\/em> endast f\u00f6r att spara p\u00e5 antalet virtuella maskiner och utrymme.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Versioner<\/h1>\n<p><\/p>\n<p>v0. Fungerar med CentOS 7 och PostgreSQL 11 p\u00e5 VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">Konstruktur f\u00f6r kluster<\/h1>\n<p><\/p>\n<p>Alla kluster \u00e4r avsedda f\u00f6r distribution i flera datacenter, sammanl\u00e4nkade i ett enda platt n\u00e4tverk och ska klara av ett fel eller n\u00e4tverksisolering av ett datacenter. D\u00e4rf\u00f6r <strong>\u00e4r om\u00f6jligt<\/strong> anv\u00e4nds f\u00f6r skydd mot <strong>split-brain<\/strong> standardteknologin Pacemaker, som kallas <em>STONITH<\/em> (Shoot The Other Node In The Head) eller <em>fencing<\/em>. Dess k\u00e4rna: om noderna i klustret b\u00f6rjar misst\u00e4nka att n\u00e5got \u00e4r fel med en nod, den svarar inte eller beter sig felaktigt, s\u00e5 st\u00e4nger de av den tv\u00e5ngsm\u00e4ssigt via \"externa\" enheter, till exempel en IPMI-kontrollkort eller UPS. Men detta fungerar bara i fall d\u00e4r vid enstaka serverfel forts\u00e4tter IPMI eller UPS att fungera. H\u00e4r planeras skydd mot betydligt mer katastrofalt fel, n\u00e4r hela datacentret g\u00e5r ner (till exempel str\u00f6mavbrott). Vid s\u00e5dan avbrott kommer alla <em>stonith<\/em>-enheter (IPMI, UPS osv.) heller inte fungera.<\/p>\n<p><\/p>\n<p>Ist\u00e4llet bygger systemet p\u00e5 id\u00e9n om majoritet. Alla noder har en r\u00f6st, och endast de som ser mer \u00e4n h\u00e4lften av alla noder kan arbeta. Detta antal \"h\u00e4lften+1\" kallas <strong>kvorum<\/strong>. Om majoriteten inte uppn\u00e5s anser noden att den \u00e4r i n\u00e4tverksisolering och att den m\u00e5ste st\u00e4nga av sina resurser, dvs. det \u00e4r s\u00e5 h\u00e4r <strong>skydd mot split-brain<\/strong>. Om mjukvaran som ansvarar f\u00f6r detta beteende inte fungerar, b\u00f6r en watchdog aktiveras, till exempel baserat p\u00e5 IPMI.<\/p>\n<p><\/p>\n<p>Om antalet noder \u00e4r j\u00e4mnt (klustret finns i tv\u00e5 datacenter) kan det uppst\u00e5 s\u00e5 kallad os\u00e4kerhet <strong>50%\/50%<\/strong> (<em>fifty-fifty<\/em>), n\u00e4r n\u00e4tverksisoleringen delar klustret i exakt tv\u00e5 halvor. D\u00e4rf\u00f6r l\u00e4ggs det till ett j\u00e4mnt antal noder <strong>quorum device<\/strong> \u2014 en resurskr\u00e4vande demon som kan k\u00f6ras p\u00e5 den billigaste virtuella maskinen i det tredje datacentret. Den ger sin r\u00f6st till en av segmenten (som den ser) och d\u00e4rmed l\u00f6ser 50%\/50% os\u00e4kerheten. Servern d\u00e4r quorum-enheten kommer att k\u00f6ras har jag kallat <em>witness<\/em> (terminologi fr\u00e5n repmgr, jag gillade den).<\/p>\n<p><\/p>\n<p>Resurser kan flyttas runt, till exempel fr\u00e5n trasiga servrar till fungerande, eller p\u00e5 beg\u00e4ran av systemadministrat\u00f6rer. F\u00f6r att kunder ska veta var deras n\u00f6dv\u00e4ndiga resurser finns (var de ska ansluta?), anv\u00e4nds <em>flytande IP<\/em> (<strong>float IP<\/strong>). Det \u00e4r IP-adresser som Pacemaker kan flytta mellan noder (allt finns i ett platt n\u00e4tverk). Varje av dem symboliserar en resurs (tj\u00e4nst) och kommer att befinna sig d\u00e4r man beh\u00f6ver ansluta f\u00f6r att f\u00e5 tillg\u00e5ng till denna tj\u00e4nst (i v\u00e5rt fall DB).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (schema med komprimering)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Id\u00e9n var att vi har m\u00e5nga sm\u00e5 databaser med l\u00e5g belastning, f\u00f6r vilka det inte \u00e4r l\u00f6nsamt att ha en dedikerad slavserver i hot standby-l\u00e4ge f\u00f6r read only-transaktioner (ingen anledning till s\u00e5dan resurs\u00e5terg\u00e5ng).<\/p>\n<p><\/p>\n<p>I varje datacenter finns en server. P\u00e5 varje server finns det tv\u00e5 instanser av PostgreSQL (i PostgreSQL-termer kallas de kluster, men f\u00f6r att undvika f\u00f6rvirring kommer jag att kalla dem instanser (i analogi med andra databaser), och kluster kommer jag bara att kalla kluster f\u00f6r Pacemaker). En instans fungerar i masterl\u00e4ge, och endast den tillhandah\u00e5ller tj\u00e4nster (det \u00e4r bara den som har float IP). Den andra instansen fungerar som en slav f\u00f6r det andra datacentret och kommer endast att erbjuda tj\u00e4nster om dess master g\u00e5r ner. Eftersom det under st\u00f6rre delen av tiden bara \u00e4r en instans av de tv\u00e5 (master) som tillhandah\u00e5ller tj\u00e4nster (bearbetar f\u00f6rfr\u00e5gningar) optimeras alla serverresurser f\u00f6r master (minne avs\u00e4tts f\u00f6r cache av shared_buffers etc.), men s\u00e5 att det ocks\u00e5 finns tillr\u00e4ckligt med resurser f\u00f6r den andra instansen (om \u00e4n f\u00f6r en suboptimal drift via filsystemets cache) i h\u00e4ndelse av att ett av datacentren slutar fungera. Slaven tillhandah\u00e5ller inga tj\u00e4nster (g\u00f6r inga read-only-f\u00f6rfr\u00e5gningar) under normal drift av klustret f\u00f6r att undvika resurskonflikter med mastern p\u00e5 samma maskin.<\/p>\n<p><\/p>\n<p>I fallet med tv\u00e5 noder \u00e4r felresiliens endast m\u00f6jlig vid asynkron replikering, eftersom en synkroniserad fel p\u00e5 slaven skulle leda till att mastern stannar.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Fel witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fel witness (<em>quorum device<\/em>) jag kommer endast att \u00f6verv\u00e4ga f\u00f6r klustret Tuchanka1, alla andra kommer att ha samma historia. Vid ett fel p\u00e5 witness i klustrets struktur f\u00f6r\u00e4ndras ingenting, allt kommer att fungera som tidigare. Men avg\u00f6rande r\u00f6ster blir 2 av 3, och d\u00e4rf\u00f6r kommer varje f\u00f6ljande fel att vara fatalt f\u00f6r klustret. Det m\u00e5ste fortfarande \u00e5tg\u00e4rdas omedelbart.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Fel Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fel p\u00e5 ett av datacentren f\u00f6r Tuchanka1. I detta fall <em>witness<\/em> ger sin r\u00f6st till den andra noden i det andra datacentret. D\u00e4r f\u00f6rvandlas den tidigare slaven till master, vilket resulterar i att b\u00e5da mastern arbetar p\u00e5 en server och b\u00e5da deras float IP pekar p\u00e5 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 felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Klassiskt m\u00f6nster med tv\u00e5 noder. P\u00e5 en arbetar master, p\u00e5 den andra slav. B\u00e5da kan behandla f\u00f6rfr\u00e5gningar (slaven bara read-only), s\u00e5 b\u00e5da pekar p\u00e5 float IP: krogan2 - f\u00f6r mastern, krogan2s1 - f\u00f6r slaven. Felresiliens kommer att finnas b\u00e5de hos mastern och slaven.<\/p>\n<p><\/p>\n<p>I fallet med tv\u00e5 noder \u00e4r felresiliens endast m\u00f6jlig vid asynkron replikering, eftersom en synkroniserad fel p\u00e5 slaven skulle leda till att mastern stannar.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Fel Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vid ett fel p\u00e5 ett av datacentren <em>witness<\/em> r\u00f6star p\u00e5 den andra. P\u00e5 det enda fungerande datacentret kommer en master att s\u00e4ttas upp, och b\u00e5da float IP:erna \u2013 master och slav \u2013 kommer att peka p\u00e5 den. Sj\u00e4lvklart m\u00e5ste instansen konfigureras s\u00e5 att den har tillr\u00e4ckligt med resurser (gr\u00e4nser f\u00f6r anslutningar etc.) f\u00f6r att samtidigt ta emot alla anslutningar och f\u00f6rfr\u00e5gningar fr\u00e5n b\u00e5de master- och slavens float IP. Det vill s\u00e4ga, under normal drift b\u00f6r den ha ett tillr\u00e4ckligt \u00f6verskott av kapacitet.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (m\u00e5nga slavar)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det \u00e4r redan en annan extrem. Det finns databaser som har mycket h\u00f6ga read-only f\u00f6rfr\u00e5gningar (ett typiskt fall f\u00f6r en h\u00f6gbelastad webbplats). Tuchanka4 \u00e4r en situation d\u00e4r det kan finnas tre eller fler slavar f\u00f6r att hantera s\u00e5dana f\u00f6rfr\u00e5gningar, men \u00e4nd\u00e5 inte f\u00f6r m\u00e5nga. Vid ett mycket stort antal slavar beh\u00f6ver man uppfinna ett hierarkiskt replikationssystem. I det minimiella fallet (p\u00e5 bilden) finns det tv\u00e5 servrar i varje datacenter, med en instans av PostgreSQL p\u00e5 varje server.<\/p>\n<p><\/p>\n<p>En annan funktion hos detta system \u00e4r att man redan kan organisera en synkron replikation. Den \u00e4r konfigurerad f\u00f6r att replikera, n\u00e4r det \u00e4r m\u00f6jligt, till ett annat datacenter, snarare \u00e4n till en replika i samma datacenter som master. B\u00e5de master och varje slav pekar p\u00e5 float IP. F\u00f6r att optimera detta b\u00f6r man balansera f\u00f6rfr\u00e5gningarna mellan slavar med hj\u00e4lp av n\u00e5got. <em>sql proxy<\/em>, till exempel fr\u00e5n klientens sida. Olika typer av klienter kan beh\u00f6va olika typer <em>sql proxy<\/em>, och endast klientutvecklarna vet vem som beh\u00f6ver vad. Denna funktionalitet kan implementeras antingen som en extern demon eller som en klientbibliotek (connection pool), etc. Allt detta faller utanf\u00f6r \u00e4mnet f\u00f6r ett fel- och drift-s\u00e4kert databaskluster (drift-s\u00e4kerhet <em>SQL proxy<\/em> kan realiseras oberoende, tillsammans med klientens drift-s\u00e4kerhet).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Fel i Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vid fel i ett datacenter (dvs tv\u00e5 servrar) r\u00f6star witness f\u00f6r den andra. Som en f\u00f6ljd av detta fungerar tv\u00e5 servrar i det andra datacentret: en server hanterar master och pekar p\u00e5 master float IP (f\u00f6r att ta emot read-write f\u00f6rfr\u00e5gningar); och p\u00e5 den andra servern verkar en slav med synkron replikation, och p\u00e5 den pekar ett av slavarnas float IP (f\u00f6r read-only f\u00f6rfr\u00e5gningar).<\/p>\n<p><\/p>\n<p>Det f\u00f6rsta att notera \u00e4r att arbetsfloat IP f\u00f6r slavar inte kommer att vara alla, bara en. Och f\u00f6r att kunna arbeta korrekt med det kr\u00e4vs det att <em>sql proxy<\/em> alla beg\u00e4rningar omdirigerades till den enda kvarvarande float IP; om inte <em>sql proxy<\/em> kan man lista alla float IP f\u00f6r slavarna med kommatecken i URL:en f\u00f6r anslutning. I s\u00e5 fall kommer anslutningen att ske till den f\u00f6rsta fungerande IP:n, som implementerats i automatiseringstestningssystemet. Det kan h\u00e4nda att det fungerar annorlunda i andra bibliotek, som JDBC, och d\u00e5 kr\u00e4vs <em>libpq<\/em> att anslutningen kommer att ske till den f\u00f6rsta fungerande IP:n, vilket implementerats i automatiserat testningssystem. I andra bibliotek, som JDBC, kan det h\u00e4nda att detta inte fungerar och att det kr\u00e4vs <em>sql proxy<\/em>. Detta \u00e4r f\u00f6r att float IP:n f\u00f6r slavarna har en restriktion f\u00f6r att samtidigt kunna k\u00f6ra p\u00e5 en server, s\u00e5 att de f\u00f6rdelas j\u00e4mnt \u00f6ver slavservrarna om flera \u00e4r ig\u00e5ng.<\/p>\n<p><\/p>\n<p>F\u00f6r det andra: \u00e4ven om datacentret skulle falla kommer den synkrona replikeringen att bevaras. Om en sekund\u00e4r felaktighet uppst\u00e5r, det vill s\u00e4ga om en av tv\u00e5 servrar i det kvarst\u00e5ende datacentret g\u00e5r ner, s\u00e5 kommer klustret, \u00e4ven om det slutar erbjuda tj\u00e4nster, fortfarande att bevara information om alla kommitterade transaktioner som det har bekr\u00e4ftat med en commit (ingen f\u00f6rlust av information vid sekund\u00e4r felaktighet).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 datacenter)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detta \u00e4r ett kluster f\u00f6r situationen n\u00e4r det finns tre fullt fungerande datacenter, d\u00e4r var och en har en fullt fungerande databasserver. I detta fall <em>quorum device<\/em> \u00e4r inte n\u00f6dv\u00e4ndig. I ett datacenter finns det en master, och i de tv\u00e5 andra \u2014 slavar. Replikeringen \u00e4r synkron, i stil med ANY (slave1, slave2), vilket inneb\u00e4r att klienten f\u00e5r en bekr\u00e4ftelse p\u00e5 commit n\u00e4r n\u00e5gon av slavarna f\u00f6rst svarar att den har tagit emot commiten. Resurserna pekar p\u00e5 en float IP f\u00f6r master och tv\u00e5 f\u00f6r slavarna. Till skillnad fr\u00e5n Tuchanka4 \u00e4r alla tre float IP:er \u00e4r redundanta. F\u00f6r lastbalansering av read-only SQL-f\u00f6rfr\u00e5gningar kan man anv\u00e4nda <em>sql proxy<\/em> (med separat redundans), eller tilldela h\u00e4lften av klienterna en slav float IP och den andra h\u00e4lften den andra.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Fel p\u00e5 Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vid ett fel i ett av datacentren finns det fortfarande tv\u00e5 kvar. I ett finns master och float IP fr\u00e5n master, medan det andra har en slav och b\u00e5da slavarnas float IP (instansen b\u00f6r ha dubbelt s\u00e5 mycket resurser f\u00f6r att ta emot alla anslutningar fr\u00e5n b\u00e5da slavarnas float IP). Mellan master och slav finns det synkron replikering. Klustret kommer ocks\u00e5 att bevara information om kommitterade och bekr\u00e4ftade transaktioner (ingen f\u00f6rlust av information) i h\u00e4ndelse av att tv\u00e5 datacenter f\u00f6rst\u00f6rs (om de inte f\u00f6rst\u00f6rs samtidigt).<\/p>\n<p><\/p>\n<p><em>Jag har valt att inte inkludera en detaljerad beskrivning av filstrukturen och distributionen. De som vill experimentera kan l\u00e4sa allt detta i README. Jag ger bara en beskrivning av automatisk testning.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Automatisk testningssystem<\/h1>\n<p><\/p>\n<p>F\u00f6r att kontrollera klusterens felbest\u00e4ndighet har ett system f\u00f6r automatisk testning skapats. Det k\u00f6rs med ett skript. <code>test\/failure<\/code>. Skriptet kan ta som parametrar de nummer av kluster som du vill testa. Till exempel, det h\u00e4r kommandot:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>kommer bara att testa det andra och tredje klustret. Om inga parametrar anges kommer alla kluster att testas. Alla kluster testas parallellt, och resultatet visas i tmux-panelen. Tmux anv\u00e4nder en dedikerad tmux-server, s\u00e5 skriptet kan k\u00f6ras fr\u00e5n default tmux, vilket ger en inb\u00e4ddad tmux. Jag rekommenderar att anv\u00e4nda en terminal i ett stort f\u00f6nster med liten teckenstorlek. Innan testningen inleds \u00e5terst\u00e4lls alla virtuella maskiner till en snapshot vid tidpunkten d\u00e5 skriptet avslutades. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/b546bab1ebbbe365991e1ff3d1667237.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terminals \u00e4r uppdelad i kolumner enligt antal testade kluster, som standard (i sk\u00e4rmdumpen) fyra. Inneh\u00e5llet i kolumnerna kommer jag att beskriva med exemplet Tuchanka2. Panelerna p\u00e5 sk\u00e4rmdumpen \u00e4r numrerade:<\/p>\n<p><\/p>\n<ol>\n<li>H\u00e4r visas statistiken f\u00f6r testerna. Kolumner:\n<ul>\n<li><strong>failure<\/strong> \u2014 namnet p\u00e5 testet (funktionen i skriptet) som emulerar ett fel.<\/li>\n<li><strong>reaction<\/strong> \u2014 det aritmetiska medelv\u00e4rdet i sekunder, som klustret tog f\u00f6r att \u00e5terf\u00e5 sin funktionalitet. M\u00e4ts fr\u00e5n b\u00f6rjan av skriptets k\u00f6rning, som emulerar felet, fram till det \u00f6gonblick d\u00e5 klustret \u00e5terf\u00e5r sin funktionalitet och kan forts\u00e4tta leverera tj\u00e4nster. Om tiden \u00e4r mycket kort, till exempel sex sekunder (som ibland g\u00e4ller kluster med flera arbetare (Tuchanka3 och Tuchanka4)), inneb\u00e4r det att felet intr\u00e4ffade p\u00e5 en asynkron arbetare och d\u00e4rf\u00f6r inte hade n\u00e5gon p\u00e5verkan p\u00e5 funktionaliteten, inga tillst\u00e5ndsbyten i klustret skedde.<\/li>\n<li><strong>deviation<\/strong> \u2014 visar spridningen (noggrannheten) av v\u00e4rdet <strong>reaction<\/strong> med metoden \"standardavvikelse\".<\/li>\n<li><strong>count<\/strong> \u2014 hur m\u00e5nga g\u00e5nger detta test har utf\u00f6rts.<\/li>\n<\/ul>\n<\/li>\n<li>En kort logg ger m\u00f6jlighet att bed\u00f6ma vad klustret g\u00f6r f\u00f6r n\u00e4rvarande. Iterationsnummer (test), tidsst\u00e4mpel och operationens namn visas. Om utf\u00f6randet tar f\u00f6r l\u00e5ng tid (&gt; 5 minuter) tyder det p\u00e5 ett problem.<\/li>\n<li><strong>heart<\/strong> (hj\u00e4rtat) \u2014 aktuell tid. F\u00f6r visuell bed\u00f6mning av funktionalitet <em>m\u00e4stare<\/em> i hans tabell skrivs den aktuella tiden kontinuerligt med hj\u00e4lp av m\u00e4starens float IP. Vid framg\u00e5ng visas resultatet i denna panel.<\/li>\n<li><strong>slag<\/strong> (puls) \u2014 \"aktuell tid\", som tidigare registrerades av skriptet <strong>heart<\/strong> i m\u00e4staren, l\u00e4ses nu fr\u00e5n <em>slaven<\/em> genom hans float IP. Ger m\u00f6jligheten att visuellt bed\u00f6ma slaven och replikationens funktionalitet. I Tuchanka1 finns det inga slavar med float IP (inga slavar som erbjuder tj\u00e4nster), men d\u00e4r finns tv\u00e5 instanser (databaser), s\u00e5 h\u00e4r kommer det att visas inte <strong>slag<\/strong>, och <strong>heart<\/strong> den andra instansen.<\/li>\n<li>\u00d6vervakning av klustrets tillst\u00e5nd med hj\u00e4lp av verktyg <code>pcs mon<\/code>. Visar strukturen, resursf\u00f6rdelningen p\u00e5 noderna och annan nyttig information.<\/li>\n<li>H\u00e4r visas system\u00f6vervakning fr\u00e5n varje virtuell maskin i klustret. Det kan finnas flera s\u00e5dana paneler \u2014 s\u00e5 m\u00e5nga virtuella maskiner klustret har. Tv\u00e5 diagram <em>CPU-belastning<\/em> (med tv\u00e5 processorer i varje virtuell maskin), namn p\u00e5 den virtuella maskinen, <em>Systembelastning<\/em> (ben\u00e4mns Load Average, eftersom den \u00e4r genomsnittlig \u00f6ver 5, 10 och 15 minuter), data om processer och minnesf\u00f6rdelning.<\/li>\n<li>Skriptslagning som utf\u00f6r tester. Vid fel \u2014 pl\u00f6tslig avbrott av arbetet eller o\u00e4ndlig v\u00e4nteloop \u2014 kan orsaken till ett s\u00e5dant beteende ses h\u00e4r.<\/li>\n<\/ol>\n<p><\/p>\n<p>Testningen genomf\u00f6rs i tv\u00e5 steg. F\u00f6rst g\u00e5r skriptet igenom alla typer av tester, slumpm\u00e4ssigt v\u00e4ljer en virtuell maskin till vilken detta test ska till\u00e4mpas. Sedan utf\u00f6rs en o\u00e4ndlig testcykel, d\u00e4r virtuella maskiner och fel v\u00e4ljs slumpm\u00e4ssigt varje g\u00e5ng. Pl\u00f6tslig avslutning av testningsskriptet (nedre panel) eller o\u00e4ndlig v\u00e4nteloop f\u00f6r n\u00e5got (&gt; 5 minuter exekveringstid f\u00f6r en operation, vilket syns i sp\u00e5rningen) indikerar att n\u00e5got av testen i detta kluster har misslyckats.<\/p>\n<p><\/p>\n<p>Varje test best\u00e5r av f\u00f6ljande operationer:<\/p>\n<p><\/p>\n<ol>\n<li>K\u00f6r en funktion som emulerar ett fel.<\/li>\n<li><strong>Redo?<\/strong> \u2014 v\u00e4ntar p\u00e5 att klustret ska \u00e5terst\u00e4llas (n\u00e4r alla tj\u00e4nster \u00e4r tillg\u00e4ngliga).<\/li>\n<li>Visar tiden f\u00f6r att \u00e5terst\u00e4lla klustret (<em>reaction<\/em>).<\/li>\n<li><strong>Fix<\/strong> \u2014 klustret \"repareras\". Efter det ska det \u00e5terg\u00e5 till ett helt fungerande tillst\u00e5nd och vara redo f\u00f6r n\u00e4sta fel.<\/li>\n<\/ol>\n<p><\/p>\n<p>H\u00e4r \u00e4r en lista \u00f6ver tester med en beskrivning av vad de g\u00f6r:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: skapar &quot;Out of memory&quot; med hj\u00e4lp av en fork-bomb.<\/li>\n<li><strong>OutOfSpace<\/strong>: fyller disken. Men testet \u00e4r snarare symboliskt, med den begr\u00e4nsade belastning som skapas vid testning, f\u00f6r vid diskfullhet uppst\u00e5r vanligtvis inget avbrott i PostgreSQL.<\/li>\n<li><strong>Postgres-KILL<\/strong>: d\u00f6dar PostgreSQL med kommandot <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: h\u00e4nger PostgreSQL med kommandot <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \"st\u00e4nger av\" virtuella maskinen med kommandot <code>VBoxManage controlvm &quot;virtuell maskin&quot; poweroff<\/code>.<\/li>\n<li><strong>\u00c5terst\u00e4llning<\/strong>: omstartar den virtuella maskinen med kommandot <code>VBoxManage controlvm &quot;virtuell maskin&quot; reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: h\u00e4nger SBD-demonen med kommandot <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: skickar kommandot till den virtuella maskinen via SSH <code>systemctl poweroff<\/code>, systemet avslutar arbetet korrekt.<\/li>\n<li><strong>UnLink<\/strong>: n\u00e4tverksisolering, kommando <code>VBoxManage controlvm &quot;virtuell maskin&quot; setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Avsluta testet antingen med standardkommandot tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, eller med kommandot &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: d\u00e4rmed avslutas testet, tmux st\u00e4ngs av, de virtuella maskinerna st\u00e4ngs ner.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Identifierade problem vid testning<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>F\u00f6r tillf\u00e4llet <em>watchdog-demonen sbd<\/em> hanterar stopp av observerade demoner, men inte deras h\u00e4ngande. Och som en f\u00f6ljd av detta, hanteras felaktigheter felaktigt, vilket leder till h\u00e4ngningar bara <em>Corosync<\/em> och <em>Pacemaker<\/em>, men som inte h\u00e4nger <em>sbd<\/em>. F\u00f6r att kontrollera <em>Corosync<\/em> s\u00e5 med hj\u00e4lp av denna samling certifikat kan en kedja byggas och webbplatsen autentiseras. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (i GitHub f\u00f6r <em>sbd<\/em>)<\/a><\/noindex>, accepterad i grenen <em>master<\/em>. Lovade (i PR#83) att det kommer att finnas n\u00e5got liknande f\u00f6r Pacemaker, jag hoppas att det kommer till <em>RedHat 8<\/em> . Men s\u00e5dana \"fel\" \u00e4r hypotetiska, l\u00e4tt duplicerbara artificiellt med exempelvis <code>killall -STOP corosync<\/code>, men f\u00f6rekommer aldrig i verkliga livet.<\/p>\n<p>\n<\/li>\n<li>\n<p>Hos <em>Pacemaker<\/em> i versionen f\u00f6r <em>CentOS 7<\/em> \u00e4r sync_timeout felaktigt st\u00e4llt <em>, vilket resulterar i<\/em> f\u00f6r <em>quorum device<\/em>att vid ett node-fel startade \u00e4ven den andra noden med viss sannolikhet omstart <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">, d\u00e4r m\u00e4staren skulle ha flyttat. Det \u00e5tg\u00e4rdades genom att \u00f6ka<\/a><\/noindex>vid distribution (i skriptet <em>, vilket resulterar i<\/em> f\u00f6r <em>quorum device<\/em> setup\/setup1 <code>). Denna \u00e4ndring accepterades inte av utvecklarna<\/code>, ist\u00e4llet lovade de att omarbeta infrastrukturen p\u00e5 s\u00e5 s\u00e4tt (i n\u00e5gon obest\u00e4md framtid), att denna timeout skulle ber\u00e4knas automatiskt. <em>Pacemaker<\/em>Om det under konfigurationen av databasen anges att<\/p>\n<p>\n<\/li>\n<li>\n<p>LC_MESSAGES <code>(textmeddelanden) kan anv\u00e4nda Unicode, till exempel<\/code> ru_RU.UTF-8 <code>, s\u00e5 vid start<\/code>i en milj\u00f6 d\u00e4r locale inte \u00e4r UTF-8, l\u00e5t s\u00e4ga i en tom milj\u00f6 (h\u00e4r <em>postgres<\/em> pacemaker <em>pgsqlms<\/em>+<em>(paf) startar<\/em>i loggen ist\u00e4llet f\u00f6r tecken i UTF-8 kommer det att finnas fr\u00e5getecken <em>postgres<\/em>), s\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">. PostgreSQL-utvecklarna har \u00e4nnu inte kommit \u00f6verens om hur man ska hantera detta. Detta kan undvikas, man m\u00e5ste st\u00e4lla in<\/a><\/noindex>LC_MESSAGES=en_US.UTF-8 <code>LC_MESSAGES=sv_SE.UTF-8<\/code> vid konfiguration (skapande) av en databasinstans.<\/p>\n<p>\n<\/li>\n<li>\n<p>Om wal_receiver_timeout \u00e4r inst\u00e4llt (standard \u00e4r 60s), d\u00e5 vid test av PostgreSQL-STOP p\u00e5 master i klustren tuchanka3 och tuchanka4 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">sker ingen omkoppling av replikering till den nya mastern.<\/a><\/noindex>. Replikeringen \u00e4r synkron, s\u00e5 b\u00e5de arbetaren och den nya mastern stannar. Detta kan kringg\u00e5s genom att s\u00e4tta wal_receiver_timeout=0 n\u00e4r du konfigurerar PostgreSQL.<\/p>\n<p>\n<\/li>\n<li>\n<p>Jag har s\u00e4llan sett att replikeringen h\u00e4nger sig i PostgreSQL under ForkBomb-testet (minnes\u00f6verfl\u00f6d). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Efter ForkBomb kan arbetarna ibland missa att \u00e5teransluta till den nya mastern.<\/a><\/noindex>. Jag har bara sett detta i klustren tuchanka3 och tuchanka4, d\u00e4r master h\u00e4ngde sig p\u00e5 grund av att replikeringen var synkron. Problemet l\u00f6ste sig sj\u00e4lv efter en l\u00e4ngre tid (ungef\u00e4r tv\u00e5 timmar). Ytterligare forskning kr\u00e4vs f\u00f6r att \u00e5tg\u00e4rda detta. Symptomen liknar en tidigare bugg som orsakas av en annan anledning, men med samma konsekvenser.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Krogan-bilden \u00e4r h\u00e4mtad fr\u00e5n <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> med f\u00f6rfattarens tillst\u00e5nd:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering av felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/ded1ead387814d97d84d0fb89e025386.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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 felresistenta kluster baserade p\u00e5 PostgreSQL och Pacemaker | ProHoster","description":"Introduktion F\u00f6r en tid sedan fick jag i uppdrag att utveckla en felresistent klusterl\u00f6sning f\u00f6r PostgreSQL.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}