{"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\/da\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Modellering af fejltolerante klynger baseret p\u00e5 PostgreSQL og Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Introduktion<\/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 in several data centers connected by fiber optics within one city, and capable of withstanding the failure (for example, a 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 building fault-tolerant clusters. It is good in that RedHat provides support for it, and because this solution is universal (modular). With its help, it will be possible 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 actually be? To investigate this, I developed a test setup 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 called hapgsql, but over time I grew tired of the 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 computer game who has all vital organs duplicated), while the nodes, clusters, and the project itself are called <strong>tuchanka<\/strong> (the planet where the krogan live).<\/p>\n<p><\/p>\n<p>Now the management has allowed <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">to open the project to the open-source community under the MIT license<\/a><\/noindex>. The README will soon be translated into English (because it is expected that the main 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 af fejltolerante klynger baseret 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 will be deployed (36GiB in total), forming 4 fault-tolerant clusters (different options). The first two clusters consist of two PostgreSQL servers, which are located in different data centers, and a common server <em>witness<\/em> c <strong>quorum device<\/strong> (located on a cheap virtual machine in the third data center), which resolves uncertainty <strong>50%\/50%<\/strong>, giving its vote to one of the parties. The third cluster spans three data centers: one master, two slaves, without <strong>quorum device<\/strong>. Klyngen best\u00e5r af fire PostgreSQL-servere, to per datacenter: en master og de \u00f8vrige replikaer, og benytter ogs\u00e5 <em>witness<\/em> c <strong>quorum device<\/strong>. Klyngen kan t\u00e5le at to servere eller et datacenter fejler. Denne l\u00f8sning kan, om n\u00f8dvendigt, skaleres til et st\u00f8rre antal replikaer.<\/p>\n<p><\/p>\n<p>Tidsynkroniseringstjeneste <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> er ogs\u00e5 omkonfigureret for redundans, men den bruger metoden med <code>ntpd<\/code> (<em>orphan mode<\/em>). Den centrale server <em>witness<\/em> funker som en central NTP-server, der distribuerer sin tid til alle klynger, hvilket synchroniserer alle serverne indbyrdes. Hvis <em>witness<\/em> den fejler eller isoleres, s\u00e5 vil en af klyngens servere (inden for klyngen) begynde at distribuere sin tid. En supplementary caching <strong>HTTP proxy<\/strong> er ogs\u00e5 oprettet p\u00e5 <em>witness<\/em>, som g\u00f8r det muligt for de \u00f8vrige virtuelle maskiner at f\u00e5 adgang til Yum-repositories. I virkeligheden vil s\u00e5danne tjenester som tidsynkronisering og proxy sandsynligvis v\u00e6re placeret p\u00e5 dedikerede servere, mens de i denne opstilling er placeret p\u00e5 <em>witness<\/em> kun for at spare p\u00e5 antallet af virtuelle maskiner og plads.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Versioner<\/h1>\n<p><\/p>\n<p>v0. Arbejder med CentOS 7 og PostgreSQL 11 p\u00e5 VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">Klyngeopbygning<\/h1>\n<p><\/p>\n<p>Alle klynger er designet til at v\u00e6re placeret i flere datacentre, bundet sammen i et fladt netv\u00e6rk og skal kunne modst\u00e5 nedbrud eller netv\u00e6rksisolering af et datacenter. Derfor <strong>ikke er muligt<\/strong> bruger standard teknologien Pacemaker til at beskytte mod <strong>split-brain<\/strong> teknologi kaldet <em>STONITH<\/em> (Shoot The Other Node In The Head) eller <em>fencing<\/em>. Dens essens: hvis noderne i klyngen begynder at mist\u00e6nke, at en nod er i problemer, ikke svarer eller opf\u00f8rer sig unormalt, vil de tvinge den til at lukke ned via \"eksterne\" enheder, s\u00e5som en IPMI-kontrolkort eller UPS. Men dette vil kun virke i tilf\u00e6lde, hvor i tilf\u00e6lde af en enkelt serverfejl forts\u00e6tter IPMI eller UPS med at fungere. Her planl\u00e6gges der beskyttelse mod en meget mere katastrofal fejl, n\u00e5r hele datacentret fejler (for eksempel mister str\u00f8m). Ved en s\u00e5dan fejltagelse vil alle <em>stonith<\/em>-enheder (IPMI, UPS osv.) heller ikke fungere.<\/p>\n<p><\/p>\n<p>I stedet bygger systemet p\u00e5 en kvorum-ide. Alle noder har stemmerettighed, og kun de, der kan se mere end halvdelen af alle noder, kan fungere. Antallet \"halvdel + 1\" kaldes <strong>kvorum<\/strong>. Hvis kvorum ikke kan oprettes, beslutter noden, at den er i netv\u00e6rksisolering og skal deaktivere sine ressourcer, dvs. det er s\u00e5dan en <strong>beskyttelse mod split-brain<\/strong>. Hvis softwaren, der styrer denne adf\u00e6rd, ikke fungerer, skal en watchdog aktiveres, for eksempel baseret p\u00e5 IPMI.<\/p>\n<p><\/p>\n<p>Hvis antallet af noder er lige (klyngen i to datacentre), kan der opst\u00e5 det, der kaldes usikkerhed <strong>50%\/50%<\/strong> (<em>fifty-fifty<\/em>), n\u00e5r netv\u00e6rksisoleringen opdeler klyngen pr\u00e6cist i to. Derfor tilf\u00f8jes <strong>quorum device<\/strong> \u2014 en ubesv\u00e6ret daemon, der kan k\u00f8res p\u00e5 den billigste virtuelle maskine i det tredje datacenter. Den giver sin stemme til en af sektionerne (som den ser), og derved afklarer usikkerheden 50%\/50%. Serveren, hvor quorum-enheden skal k\u00f8res, har jeg kaldt <em>witness<\/em> (terminologi fra repmgr, som jeg kan lide).<\/p>\n<p><\/p>\n<p>Ressourcer kan flytte fra sted til sted, for eksempel fra defekte servere til fungerende, eller p\u00e5 ordre fra systemadministratorer. For at kunderne skal vide, hvor deres n\u00f8dvendige ressourcer er (hvor skal de forbinde?), bruges der <em>flydende IP<\/em> (<strong>float IP<\/strong>). Dette er IP-adresser, som Pacemaker kan flytte mellem noder (alt er i et fladt netv\u00e6rk). Hver af dem symboliserer en ressource (tjeneste) og vil v\u00e6re der, hvor der skal forbindes for at f\u00e5 adgang til denne tjeneste (i vores tilf\u00e6lde databasen).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (schema med t\u00e6thed)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering af fejltolerante klynger baseret 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>Id\u00e9en var, at vi har mange sm\u00e5 databaser med lav belastning, for hvilke det ikke er rentabelt at opretholde en dedikeret slave-server i hot standby-tilstand til read-only-transaktioner (der er ikke behov for s\u00e5dan en ressourcespild).<\/p>\n<p><\/p>\n<p>Der er \u00e9n server i hver datacenter. P\u00e5 hver server er der to PostgreSQL-instanser (i PostgreSQL-terminologi kaldes de kl\u00f8fter, men for at undg\u00e5 forvirring vil jeg kalde dem instanser (analogt med andre databaser) og kalde klustrene kun for Pacemaker-klustre). En instans k\u00f8rer i master-tilstand, og kun den leverer tjenester (kun denne har et float IP). Den anden instans fungerer som slave for det andet datacenter og vil kun levere tjenester, hvis dens master fejler. Da der kun vil v\u00e6re \u00e9n instans, der leverer tjenester (behandler foresp\u00f8rgsler) det meste af tiden (master), optimeres serverens ressourcer til masteren (hukommelse tildeles til cache shared_buffers osv.), men s\u00e5 der ogs\u00e5 er tilstr\u00e6kkelige ressourcer til den anden instans (selv om det kun er til suboptimal drift gennem filsystemets cache) i tilf\u00e6lde af svigt i et af datacentrene. Slaven leverer ikke tjenester (behandler ikke read only-foresp\u00f8rgsler) under normal drift af klyngen for at undg\u00e5 ressourcekonflikter med masteren p\u00e5 samme maskine.<\/p>\n<p><\/p>\n<p>I tilf\u00e6lde af to noder er h\u00f8j tilg\u00e6ngelighed kun mulig ved asynkron replikation, da en synkron fejlfunktion p\u00e5 slaven vil resultere i stop af masteren.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Fejl witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering af fejltolerante klynger baseret 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>Fejl witness (<em>quorum device<\/em>) vil jeg kun overveje for klyngen Tuchanka1, historien er den samme for alle andre. Ved fejl p\u00e5 witness \u00e6ndres der ikke noget i klynge-strukturen, alt forts\u00e6tter med at fungere som f\u00f8r. Men quorum vil v\u00e6re lig med 2 ud af 3, og derfor vil enhver efterf\u00f8lgende fejl v\u00e6re fatal for klyngen. Det skal hastigt repareres.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Fejl Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering af fejltolerante klynger baseret 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>Fejl p\u00e5 et af datacentrene for Tuchanka1. I dette tilf\u00e6lde <em>witness<\/em> stemmer denne for den anden node i det andet datacenter. Her bliver den tidligere slave omdannet til master, hvilket resulterer i, at begge mastere k\u00f8rer p\u00e5 \u00e9n server, og begge deres float IP peger 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 af fejltolerante klynger baseret 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>Den klassiske konfiguration best\u00e5ende af to noder. P\u00e5 den ene k\u00f8rer master, og p\u00e5 den anden er der en slave. Begge kan h\u00e5ndtere foresp\u00f8rgsler (slaven kun read only), derfor peger begge p\u00e5 et float IP: krogan2 \u2014 p\u00e5 master, krogan2s1 \u2014 p\u00e5 slaven. Der vil v\u00e6re h\u00f8j tilg\u00e6ngelighed b\u00e5de for masteren og slaven.<\/p>\n<p><\/p>\n<p>I tilf\u00e6lde af to noder er h\u00f8j tilg\u00e6ngelighed kun mulig ved asynkron replikation, fordi en synkron fejlfunktion p\u00e5 slaven vil resultere i stop af masteren.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Fejl Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering af fejltolerante klynger baseret 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 fejl p\u00e5 et af datacentrene <em>witness<\/em> stemmer imod den anden. P\u00e5 det eneste fungerende datacenter vil master blive oprettet, og begge float IP'er: master og slave vil pege p\u00e5 det. Selvf\u00f8lgelig skal instansen v\u00e6re konfigureret s\u00e5ledes, at den har tilstr\u00e6kkelige ressourcer (gr\u00e6nser for forbindelser osv.) til samtidig at h\u00e5ndtere alle forbindelser og anmodninger fra b\u00e5de master og slave float IP. Det vil sige, at den skal have et tilstr\u00e6kkeligt overskud af gr\u00e6nser 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 af fejltolerante klynger baseret 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>Der er allerede en anden ekstrem. Der er databaser, som har mange read-only anmodninger (et typisk tilf\u00e6lde af en h\u00f8jbelastet hjemmeside). Tuchanka4 er en situation, hvor der kan v\u00e6re tre eller flere slaver til at h\u00e5ndtere s\u00e5danne anmodninger, men ikke mere end det. Ved et meget stort antal slaver skal der opfindes et hierarkisk replikationssystem. I det mindste tilf\u00e6lde (p\u00e5 billedet) er der to servere i hvert af de to datacentre, hvor hver har en instans PostgreSQL.<\/p>\n<p><\/p>\n<p>En anden funktion ved denne ordning er, at der allerede kan organiseres en synkron replikation. Den er konfigureret til at replikere, s\u00e5 vidt det er muligt, til et andet datacenter, og ikke til en kopi i det samme datacenter som master. Master og hver slave peger p\u00e5 float IP. Ideelt set skal der mellem slaverne laves en belastningsbalancering af anmodninger p\u00e5 en eller anden m\u00e5de. <em>sql proxy<\/em>, for eksempel p\u00e5 klientsiden. Forskellige typer af klienter kan kr\u00e6ve forskellige typer <em>sql proxy<\/em>, og kun klientudviklerne ved, hvem der har brug for hvad. Denne funktionalitet kan implementeres b\u00e5de som et eksternt demon og som et klientbibliotek (forbindelsespool) osv. Alt dette ligger uden for emnet for det fejltolerante DB-kluster (fejltolerance <em>SQL proxy<\/em> kan implementeres uafh\u00e6ngigt, sammen med klientens fejltolerance).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Fejl Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering af fejltolerante klynger baseret 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 fejlen p\u00e5 et datacenter (dvs. de to servere) stemmer witness for den anden. Som et resultat fungerer der to servere i det andet datacenter: p\u00e5 den ene k\u00f8rer master, og den peger p\u00e5 master float IP (til modtagelse af read-write anmodninger); og p\u00e5 den anden server k\u00f8rer en slave med synkron replikation, og den peger p\u00e5 en af slave float IP'er (til read only-anmodninger).<\/p>\n<p><\/p>\n<p>Det f\u00f8rste, man skal bem\u00e6rke: de fungerende slave float IP'er vil ikke v\u00e6re alle, men kun \u00e9n. Og for korrekt brug af den, skal det v\u00e6re s\u00e5dan, at <em>sql proxy<\/em> omdirigerede alle foresp\u00f8rgsler til den eneste tilbagev\u00e6rende float IP; og hvis <em>sql proxy<\/em> nej, s\u00e5 kan man opdatere alle float IP'er for slaverne med komma i URL'en for forbindelsen. I s\u00e5 fald <em>libpq<\/em> vil forbindelsen ske til den f\u00f8rste fungerende IP, som det er gjort i testsystemet. Det er muligt, at det ikke fungerer p\u00e5 samme m\u00e5de i andre biblioteker, f.eks. JDBC, og det er n\u00f8dvendigt <em>sql proxy<\/em>. Det er gjort s\u00e5dan, fordi der er forbud mod at have flere float IP'er for slaverne k\u00f8rende p\u00e5 samme server, s\u00e5 de bliver j\u00e6vnt fordelt p\u00e5 slave-serverne, hvis der er flere i drift.<\/p>\n<p><\/p>\n<p>Det andet: selv i tilf\u00e6lde af fejl i datacenteret vil den synkrone replikation blive bevaret. Og selv hvis der sker en sekund\u00e6r fejl, alts\u00e5 hvis en af de to servere i det tilbagev\u00e6rende datacenter g\u00e5r ned, vil klyngen, selvom den stopper med at yde service, stadig gemme information om alle bekr\u00e6ftede transaktioner, som den har givet en bekr\u00e6ftelse om kommittering (der vil ikke v\u00e6re tab af information ved sekund\u00e6r fejl).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 datacentre)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering af fejltolerante klynger baseret 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 situationen, hvor der er tre fuldt operationelle datacentre, hvor hver har en fuldt operationel DB-server. I dette tilf\u00e6lde <em>quorum device<\/em> er ikke n\u00f8dvendig. I \u00e9t datacenter k\u00f8rer masteren, i de to andre \u2014 slaverne. Replikationen er synkron, type ANY (slave1, slave2), hvilket betyder, at klienten vil modtage en bekr\u00e6ftelse p\u00e5 kommitteringen, n\u00e5r nogen af slaverne f\u00f8rst svarer, at de har accepteret kommitteringen. Der peges p\u00e5 en float IP for masteren og to for slaverne. I mods\u00e6tning til Tuchanka4 er alle tre float IP'er fejl tolerante. Til belastningsbalancering af read-only SQL-foresp\u00f8rgsler kan man bruge <em>sql proxy<\/em> (med separate fejl tolerancer), eller den ene halvdel af kunderne f\u00e5r tildelt \u00e9n slave float IP, og den anden halvdel en anden.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Fejl Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering af fejltolerante klynger baseret 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 fejl i et af datacentrene forbliver der to. I \u00e9t k\u00f8rer masteren og float IP'en fra masteren, i det andet \u2014 slaven og begge slave float IP'er (instansen skal have dobbelt s\u00e5 mange ressourcer for at kunne modtage alle forbindelser fra begge slave float IP'er). Mellem masterne og slaven er der synkron replikation. Desuden vil klyngen gemme information om bekr\u00e6ftede og accepterede transaktioner (der vil ikke v\u00e6re tab af information) i tilf\u00e6lde af \u00f8del\u00e6ggelse af to datacentre (hvis de ikke \u00f8del\u00e6gges samtidigt).<\/p>\n<p><\/p>\n<p><em>Jeg har valgt ikke at inkludere en detaljeret beskrivelse af filstrukturen og deployment. Den, der \u00f8nsker at lege med det, kan l\u00e6se alt dette i README. Jeg giver kun en beskrivelse af automatiseret testning.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Automatiseret testsystem<\/h1>\n<p><\/p>\n<p>For at teste fejltolerance i klynger med simulering af forskellige fejl er der oprettet et automatiseret testsystem. Det startes med et script <code>test\/failure<\/code>. Scriptet kan tage som parametre numrene p\u00e5 de klynger, der \u00f8nskes testet. For eksempel vil denne kommando:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>teste kun den anden og tredje klynge. Hvis der ikke angives parametre, vil alle klynger blive testet. Alle klynger testes parallelt, og resultatet vises i tmux-panelet. Tmux bruger en dedikeret tmux-server, s\u00e5 scriptet kan startes fra standard tmux, hvilket vil resultere i indlejret tmux. Jeg anbefaler at bruge terminalen i et stort vindue med lille skrift. F\u00f8r testningen begynder, bliver alle virtuelle maskiner rullet tilbage til det \u00f8jebliksbillede, der blev taget ved afslutningen af scriptet. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering af fejltolerante klynger baseret 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 opdelt i kolonner svarende til antallet af testede klynger, som i standard (p\u00e5 sk\u00e6rmbilledet) er fire. Indholdet af kolonnerne vil jeg beskrive med eksemplet Tuchanka2. Panelerne p\u00e5 sk\u00e6rmbilledet er nummererede:<\/p>\n<p><\/p>\n<ol>\n<li>Her vises statistikken for testene. Kolonnerne:\n<ul>\n<li><strong>failure<\/strong> \u2014 navnet p\u00e5 testen (funktionen i scriptet), der simulerer fejlen.<\/li>\n<li><strong>reaction<\/strong> \u2014 det aritmetiske gennemsnit af tiden i sekunder, hvori klyngen genoprettede sin funktionalitet. Det m\u00e5les fra starten af scriptet, der simulerer fejlen, indtil klyngen genopretter sin funktionalitet og kan forts\u00e6tte med at levere tjenester. Hvis tiden er meget kort, for eksempel seks sekunder (det sker i klynger med flere slaver (Tuchanka3 og Tuchanka4)), betyder det, at fejlen blev p\u00e5 en asynkron slave og ikke p\u00e5virkede funktionaliteten, der var ingen tilstandsskift i klyngen.<\/li>\n<li><strong>deviation<\/strong> \u2014 viser spredningen (pr\u00e6cisionen) af v\u00e6rdien <strong>reaction<\/strong> metoden \"standardafvigelse\".<\/li>\n<li><strong>count<\/strong> \u2014 hvor mange gange denne test er blevet udf\u00f8rt.<\/li>\n<\/ul>\n<\/li>\n<li>En kort log giver mulighed for at vurdere, hvad klyngen laver p\u00e5 nuv\u00e6rende tidspunkt. Der vises iterationsnummeret (testen), tidsstempel og operationens navn. En for lang udf\u00f8relse (&gt; 5 minutter) indikerer et problem.<\/li>\n<li><strong>heart<\/strong> (hjerte) \u2014 den aktuelle tid. For visuel vurdering af driftssikkerhed <em>mester<\/em> i hans tabel skrives den aktuelle tid konstant ved anvendelse af mesterens float IP. Ved succes vises resultatet i denne panel.<\/li>\n<li><strong>slag<\/strong> (puls) \u2014 \u00abden aktuelle tid\u00bb, som tidligere blev optaget af scriptet <strong>heart<\/strong> i mester, nu l\u00e6ses fra <em>slave<\/em> gennem hans float IP. Muligg\u00f8r visuel vurdering af slaveoperabilitet og replikering. I Tuchanka1 er der ingen slaver med float IP (ingen slaver, der leverer tjenester), men der er to instanser (DB), s\u00e5 der vil blive vist ikke <strong>slag<\/strong>, og <strong>heart<\/strong> den anden instans.<\/li>\n<li>Overv\u00e5gning af klyngens tilstand ved hj\u00e6lp af v\u00e6rkt\u00f8jet <code>pcs mon<\/code>. Viser strukturen, ressourcefordelingen p\u00e5 noderne og anden nyttig information.<\/li>\n<li>Her vises systemoverv\u00e5gning fra hver virtuel maskine i klyngen. Der kan v\u00e6re flere af disse paneler \u2014 svarende til antallet af virtuelle maskiner i klyngen. To grafer <em>CPU Belasting<\/em> (hver virtuel maskine har to processorer), navnet p\u00e5 den virtuelle maskine, <em>System Belastning<\/em> (ben\u00e6vnt som Load Average, fordi det er gennemsnittet over 5, 10 og 15 minutter), data om processer og hukommelsesfordeling.<\/li>\n<li>Sporing af scriptet, der udf\u00f8rer test. I tilf\u00e6lde af fejl \u2014 pludselig afbrydelse af arbejdet eller en uendelig ventecyklus \u2014 kan \u00e5rsagen til s\u00e5dan adf\u00e6rd ses her.<\/li>\n<\/ol>\n<p><\/p>\n<p>Testen udf\u00f8res i to faser. F\u00f8rst g\u00e5r scriptet gennem alle typer tests, der tilf\u00e6ldigt v\u00e6lger en virtuel maskine, til hvilken testen anvendes. Derefter udf\u00f8res en uendelig testcyklus, hvor virtuelle maskiner og fejl hver gang v\u00e6lges tilf\u00e6ldigt. Pludselig afslutning af testscriptet (den nederste panel) eller en uendelig ventecyklus p\u00e5 noget (&gt; 5 minutters udf\u00f8relsestid for en operation, dette ses i sporing) indikerer, at en af tests i denne klynge er fejlet.<\/p>\n<p><\/p>\n<p>Hver test best\u00e5r af f\u00f8lgende operationer:<\/p>\n<p><\/p>\n<ol>\n<li>Udf\u00f8relse af funktionen, der simulerer en fejl.<\/li>\n<li><strong>Klar?<\/strong> \u2014 ventetid for genopretning af klyngen (n\u00e5r alle tjenester leveres).<\/li>\n<li>Viser ventetiden for genopretning af klyngen (<em>reaction<\/em>).<\/li>\n<li><strong>Fix<\/strong> \u2014 klyngen \u00abrepareres\u00bb. Derefter skal den vende tilbage til en fuldt operativ tilstand og v\u00e6re klar til n\u00e6ste fejl.<\/li>\n<\/ol>\n<p><\/p>\n<p>Her er en liste over tests med beskrivelse af, hvad de g\u00f8r:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: skaber &quot;Out of memory&quot; med en fork-bombe.<\/li>\n<li><strong>OutOfSpace<\/strong>: fylder harddisken. Men testen er snarere symbolsk, da belastningen, der skabes under testningen, er ubetydelig, og ved overflow af harddisken opst\u00e5r der normalt ikke noget nedbrud i PostgreSQL.<\/li>\n<li><strong>Postgres-KILL<\/strong>: dr\u00e6ber PostgreSQL med kommandoen <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: h\u00e6nger PostgreSQL med kommandoen <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \"slukker\" virtuelt maskine med kommandoen <code>VBoxManage controlvm &quot;virtuelle maskine&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: genstarter den virtuelle maskine med kommandoen <code>VBoxManage controlvm &quot;virtuelle maskine&quot; reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: h\u00e6nger SBD-d\u00e6monen med kommandoen <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: sender kommando til den virtuelle maskine via SSH <code>systemctl poweroff<\/code>, systemet afslutter arbejdet korrekt.<\/li>\n<li><strong>UnLink<\/strong>: netv\u00e6rksisolering, kommando <code>VBoxManage controlvm &quot;virtuelle maskine&quot; setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Afslut testningen enten med den standardkommando tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, eller med kommandoen &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: her afsluttes testningen, tmux lukker, de virtuelle maskiner slukkes.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Problemer fundet under testningen<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>I \u00f8jeblikket <em>watchdog d\u00e6mon sbd<\/em> h\u00e5ndterer stop af de overv\u00e5gede d\u00e6moner, men ikke deres h\u00e6ngning. Og som f\u00f8lge heraf h\u00e5ndteres fejl ikke korrekt, hvilket f\u00f8rer til h\u00e6ngning kun <em>Corosync<\/em> og <em>Pacemaker<\/em>, men samtidig h\u00e6nger ikke <em>sbd<\/em>. For at kontrollere <em>Corosync<\/em> allerede <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (i GitHub hos <em>sbd<\/em>)<\/a><\/noindex>, accepteret i gren <em>master<\/em>. De lovede (i PR#83), at der ogs\u00e5 vil komme noget lignende til Pacemaker, og jeg h\u00e5ber, at det vil v\u00e6re klar til <em>RedHat 8<\/em> . Men s\u00e5danne \"fejl\" er teoretiske, let kan simuleres kunstigt ved hj\u00e6lp af for eksempel <code>killall -STOP corosync<\/code>, men forekommer aldrig i virkeligheden.<\/p>\n<p>\n<\/li>\n<li>\n<p>Ved <em>Pacemaker<\/em> i versionen til <em>CentOS 7<\/em> er sync_timeout sat forkert <em>, hvilket resulterer i<\/em> af <em>quorum device<\/em>at n\u00e5r \u00e9n node fejler, genstarter den anden node med en vis sandsynlighed <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">, som den skulle flytte master til. Det blev l\u00f8st ved at \u00f8ge<\/a><\/noindex>under implementeringen (i scriptet <em>, hvilket resulterer i<\/em> af <em>quorum device<\/em> setup\/setup1 <code>). Denne \u00e6ndring blev ikke accepteret af udviklerne<\/code>, i stedet lovede de at genoverveje infrastrukturen p\u00e5 en s\u00e5dan m\u00e5de (i en udefineret fremtid), at denne timeout automatisk bliver beregnet. <em>Pacemaker<\/em>Hvis der under konfigurationen af databasen angives, at<\/p>\n<p>\n<\/li>\n<li>\n<p>LC_MESSAGES <code>(tekstbeskeder) kan bruge Unicode, for eksempel<\/code> ru_RU.UTF-8 <code>, s\u00e5 ved k\u00f8rsel<\/code>i et milj\u00f8, hvor locale ikke er UTF-8, antageligt i et tomt milj\u00f8 (her <em>postgres<\/em> pacemaker <em>pgsqlms<\/em>+<em>(paf) starter<\/em>i loggen vil der i stedet for UTF-8-bogstaver v\u00e6re sp\u00f8rgsm\u00e5lstegn <em>postgres<\/em>), s\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">. PostgreSQL's udviklere blev aldrig enige om, hvad der skulle g\u00f8res i dette tilf\u00e6lde. Det kan omg\u00e5s, man skal s\u00e6tte<\/a><\/noindex>LC_MESSAGES=en_US.UTF-8 <code>LC_MESSAGES=da_DK.UTF-8<\/code> ved konfiguration (oprettelse) af en DB-instans.<\/p>\n<p>\n<\/li>\n<li>\n<p>Hvis wal_receiver_timeout er indstillet (standard er 60s), s\u00e5 sker der ingen genopkobling af replikationen til den nye master under testen PostgreSQL-STOP p\u00e5 masteren i klyngerne tuchanka3 og tuchanka4. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Replikationen stopper, da den er synkron, hvilket betyder, at b\u00e5de slave og ny master stoppes. Dette kan omg\u00e5s ved at s\u00e6tte wal_receiver_timeout=0 under konfigurationen af PostgreSQL.<\/a><\/noindex>Jeg har sj\u00e6ldent observeret h\u00e6ngning af replikationen i PostgreSQL under testen ForkBomb (hukommelsesoverbelastning).<\/p>\n<p>\n<\/li>\n<li>\n<p>Efter ForkBomb kan slaver nogle gange ikke genopkoble til den nye master. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Jeg har kun set dette i klyngerne tuchanka3 og tuchanka4, hvor masteren hang p\u00e5 grund af den synkrone replikation. Problemet forsvandt af sig selv efter lidt tid (omkring to timer). Yderligere unders\u00f8gelse er n\u00f8dvendig for at rette det. Symptomerne ligner en tidligere bug, der skyldes en anden \u00e5rsag, men med de samme konsekvenser.<\/a><\/noindex>Billedet af kroganen er taget fra<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Deviant Art <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">med forfatterens tilladelse:<\/a><\/noindex> Introduktion For nogen tid siden blev jeg bedt om at udvikle en fejltolerant klynge for PostgreSQL.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellering af fejltolerante klynger baseret 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.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\/da\/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=\"da_DK\" \/>\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\/da\/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 af fejltolerante klynger baseret p\u00e5 PostgreSQL og Pacemaker | ProHoster","description":"\ud83e\udd47Modellering af fejltolerante klynger baseret p\u00e5 PostgreSQL og Pacemaker | ProHoster","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}