{"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\/ro\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Introducere<\/h1>\n<p><\/p>\n<p>Cu ceva timp \u00een urm\u0103, am fost \u00eens\u0103rcinat s\u0103 dezvolt un cluster tolerant la defecte pentru <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, care func\u021bioneaz\u0103 \u00een mai multe centre de date interconectate prin fibr\u0103 optic\u0103 \u00eentr-un singur ora\u0219 \u0219i capabil s\u0103 suporte defectarea (de exemplu, pierderea aliment\u0103rii) a unui centru de date. Ca software responsabil pentru toleran\u021ba la defecte, am ales <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, deoarece este solu\u021bia oficial\u0103 de la RedHat pentru crearea clusterelor tolerate la defecte. Este avantajos deoarece RedHat ofer\u0103 suport pentru aceasta \u0219i, \u00een plus, solu\u021bia este versatil\u0103 (modular\u0103). Cu ajutorul s\u0103u, se poate asigura toleran\u021ba la defecte nu doar pentru PostgreSQL, ci \u0219i pentru alte servicii, fie utiliz\u00e2nd module standard, fie cre\u00e2ndu-le pentru nevoile specifice.<\/p>\n<p><\/p>\n<p>Pentru aceast\u0103 solu\u021bie, s-a ivit o \u00eentrebare rezonabil\u0103: c\u00e2t de tolerant va fi clusterul tolerant la defecte? Pentru a investiha acest lucru, am dezvoltat un laborator de testare care imit\u0103 diverse defecte la nodurile clusterului, a\u0219teapt\u0103 restabilirea func\u021bionalit\u0103\u021bii, restaureaz\u0103 nodul defectat \u0219i continu\u0103 testarea \u00een ciclu. Ini\u021bial, acest proiect a fost numit hapgsql, dar cu vremea m-am plictisit de un nume cu o singur\u0103 vocal\u0103. A\u0219adar, bazele de date tolerate la defecte (\u0219i IP-urile float care le indic\u0103) le-am \u00eenceput s\u0103 le numesc <strong>krogan<\/strong> (un personaj dintr-un joc video care are toate organele vitale duplicate), iar nodurile, clusterele \u0219i proiectul \u00een sine \u2014 <strong>tuchanka<\/strong> (planeta unde locuiesc kroganii).<\/p>\n<p><\/p>\n<p>Acum conducerea a aprobat <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">deschiderea proiectului pentru comunitatea open source sub licen\u021ba MIT<\/a><\/noindex>. README-ul va fi tradus \u00een cur\u00e2nd \u00een limba englez\u0103 (deoarece se a\u0219teapt\u0103 ca principalii consumatori s\u0103 fie dezvoltatorii de Pacemaker \u0219i PostgreSQL), iar vechea variant\u0103 a README-ului \u00een rus\u0103 am decis s\u0103 o prezint (par\u021bial) sub form\u0103 de acest articol.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i 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>Clusterele sunt desf\u0103\u0219urate pe ma\u0219ini virtuale <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. Vor fi desf\u0103\u0219urate \u00een total 12 ma\u0219ini virtuale (\u00een total 36GiB), care formeaz\u0103 4 clustere tolerate la defecte (variante diferite). Primele dou\u0103 clustere constau din dou\u0103 servere PostgreSQL, care sunt amplasate \u00een diferite centre de date, \u0219i un server comun <em>witness<\/em> c <strong>quorum device<\/strong> (amplasat pe o ma\u0219in\u0103 virtual\u0103 ieftin\u0103 \u00een al treilea centru de date), care rezolv\u0103 incertitudinea <strong>50%\/50%<\/strong>, oferindu-\u0219i votul pentru una dintre p\u0103r\u021bi. Al treilea cluster este \u00een trei centre de date: un master, dou\u0103 slave, f\u0103r\u0103 <strong>quorum device<\/strong>. Clust erul patru este format din patru servere PostgreSQL, c\u00e2te dou\u0103 pentru fiecare centru de date: un master \u0219i celelalte replica, \u0219i utilizeaz\u0103 de asemenea <em>witness<\/em> c <strong>quorum device<\/strong>. Clusterul patru rezist\u0103 la defec\u021biunea a dou\u0103 servere sau a unui centru de date. Aceast\u0103 solu\u021bie poate fi, dac\u0103 este necesar, extins\u0103 la un num\u0103r mai mare de replici.<\/p>\n<p><\/p>\n<p>Serviciul de timp exact <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> de asemenea este reconfigurat pentru disponibilitate ridicat\u0103, dar utilizeaz\u0103 metoda <code>ntpd<\/code> (<em>orphan mode<\/em>). Serverul general <em>witness<\/em> func\u021bioneaz\u0103 ca un server NTP central, furniz\u00e2nd timpul s\u0103u tuturor clusterelor, astfel sincroniz\u00e2nd toate serverele \u00eentre ele. Dac\u0103 <em>witness<\/em> se defecteaz\u0103 sau devine izolat, atunci unul dintre serverele din cluster va \u00eencepe s\u0103 ofere timpul s\u0103u (\u00een interiorul clusterului). Un proxy de cache <strong>HTTP proxy<\/strong> de asemenea este ridicat pe <em>witness<\/em>, cu ajutorul c\u0103ruia celelalte ma\u0219ini virtuale au acces la repozitoarele Yum. \u00cen realitate, servicii precum timpul exact \u0219i proxy-ul vor fi cu siguran\u021b\u0103 g\u0103zduite pe servere dedicate, \u00eens\u0103 \u00een stand acestea sunt plasate pe <em>witness<\/em> doar pentru a economisi num\u0103rul de ma\u0219ini virtuale \u0219i spa\u021biu.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Versiuni<\/h1>\n<p><\/p>\n<p>v0. Func\u021bioneaz\u0103 cu CentOS 7 \u0219i PostgreSQL 11 pe VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">Structura clusterelor<\/h1>\n<p><\/p>\n<p>Toate clusterele sunt destinate g\u0103zduirii \u00een mai multe centre de date, fiind unite \u00eentr-o re\u021bea plat\u0103 \u0219i trebuie s\u0103 reziste la defec\u021biunea sau izolarea de re\u021bea a unui centru de date. Prin urmare, <strong>nu este posibil<\/strong> s\u0103 se utilizeze pentru a proteja de <strong>split-brain<\/strong> tehnologia standard Pacemaker, care se nume\u0219te <em>STONITH<\/em> (Shoot The Other Node In The Head) sau <em>fencing<\/em>. Conceputul este: dac\u0103 nodurile din cluster \u00eencep s\u0103 suspecteze c\u0103 ceva nu este \u00een regul\u0103 cu un nod, nu r\u0103spunde sau se comport\u0103 incorect, acestea \u00eel deconecteaz\u0103 for\u021bat prin dispozitive \u201eexterne\u201d, cum ar fi un card de control IPMI sau un UPS. Dar aceasta va func\u021biona doar \u00een cazurile \u00een care, \u00een cazul unei defec\u021biuni unice a serverului, IPMI sau UPS continu\u0103 s\u0103 func\u021bioneze. Aici este prev\u0103zut\u0103 o protec\u021bie \u00eempotriva unei defec\u021biuni mult mai catastrofale, c\u00e2nd \u00eentregul centru de date se defecteaz\u0103 (de exemplu, r\u0103m\u00e2ne f\u0103r\u0103 energie). \u00cen cazul unei astfel de defec\u021biuni, toate <em>stonith<\/em>-dispozitivele (IPMI, UPS etc.) nu vor func\u021biona nici ele.<\/p>\n<p><\/p>\n<p>\u00cen schimb, sistemul se bazeaz\u0103 pe ideea de vot. Toate nodurile au drept de vot, iar func\u021bioneaz\u0103 doar cele care v\u0103d mai mult de jum\u0103tate din toate nodurile. Aceast\u0103 cantitate \u201ejum\u0103tate + 1\u201d se nume\u0219te <strong>cvorum<\/strong>. Dac\u0103 nu se adun\u0103 cvorumul, nodul decide c\u0103 se afl\u0103 \u00een izolare de re\u021bea \u0219i trebuie s\u0103 \u00ee\u0219i dezactiveze resursele, adic\u0103 este o astfel de <strong>protec\u021bie \u00eempotriva split-brain<\/strong>. Dac\u0103 software-ul care r\u0103spunde de acest comportament nu func\u021bioneaz\u0103, atunci va trebui s\u0103 intervin\u0103 un watchdog, de exemplu, bazat pe IPMI.<\/p>\n<p><\/p>\n<p>Dac\u0103 num\u0103rul de noduri este par (cluster \u00een dou\u0103 centre de date), atunci poate ap\u0103rea a\u0219a-numita incertitudine <strong>50%\/50%<\/strong> (<em>fifty-fifty<\/em>), c\u00e2nd izolarea de re\u021bea \u00eemparte clusterul exact \u00een dou\u0103. Prin urmare, pentru un num\u0103r par de noduri se adaug\u0103 <strong>quorum device<\/strong> \u2014 un demon nepreten\u021bios care poate fi pornit pe cea mai ieftin\u0103 ma\u0219in\u0103 virtual\u0103 din al treilea centru de date. Acesta \u00ee\u0219i d\u0103 votul unuia dintre segmente (pe care \u00eel vede), astfel rezolv\u00e2nd incertitudinea 50%\/50%. Serverul pe care va fi pornit dispozitivul de cvorum l-am numit <em>witness<\/em> (terminologie din repmgr, mi-a pl\u0103cut).<\/p>\n<p><\/p>\n<p>Resursele pot fi mutate dintr-un loc \u00een altul, de exemplu, de pe servere defecte pe cele func\u021bionale sau la comanda administratorilor de sistem. Pentru ca clien\u021bii s\u0103 \u0219tie unde se afl\u0103 resursele de care au nevoie (unde s\u0103 se conecteze?), se folosesc <em>IP-uri flotante<\/em> (<strong>float IP<\/strong>). Acestea sunt IP-uri pe care Pacemaker le poate muta \u00eentre noduri (totul se afl\u0103 \u00eentr-o re\u021bea plat\u0103). Fiecare dintre ele simbolizeaz\u0103 o resurs\u0103 (serviciu) \u0219i va fi situat acolo unde trebuie s\u0103 te conectezi pentru a accesa acest serviciu (\u00een cazul nostru BD).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (schema cu compactare)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Structura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ideea a fost c\u0103 avem multe baze de date mici cu o sarcin\u0103 sc\u0103zut\u0103, pentru care nu este rentabil s\u0103 \u00eentre\u021binem un server slave dedicat \u00een modul hot standby pentru tranzac\u021bii read only (nu este nevoie de o astfel de risip\u0103 de resurse).<\/p>\n<p><\/p>\n<p>\u00cen fiecare centru de date exist\u0103 un server. Fiecare server are dou\u0103 instan\u021be PostgreSQL (\u00een terminologia PostgreSQL, acestea se numesc clustere, dar pentru a evita confuzia, le voi numi instan\u021be, \u00een analogie cu alte baze de date, iar clusterele le voi numi doar clustere Pacemaker). O instan\u021b\u0103 func\u021bioneaz\u0103 \u00een modul master, \u0219i doar ea ofer\u0103 servicii (doar la ea se face referin\u021b\u0103 cu IP flotant). Cealalt\u0103 instan\u021b\u0103 func\u021bioneaz\u0103 ca slujitor pentru al doilea centru de date \u0219i va oferi servicii doar dac\u0103 masterul s\u0103u va c\u0103dea. Deoarece, \u00een majoritatea timpului, doar o instan\u021b\u0103 din dou\u0103 (masterul) va oferi servicii (va executa cereri), toate resursele serverului sunt optimizate pentru master (se aloc\u0103 memorie pentru cache shared_buffers etc.), dar astfel \u00eenc\u00e2t \u0219i a doua instan\u021b\u0103 s\u0103 aib\u0103 suficiente resurse (chiar \u0219i pentru o func\u021bionare suboptimal\u0103 prin cache-ul sistemului de fi\u0219iere) \u00een cazul unei defec\u021biuni a unuia dintre centrele de date. Slujitorul nu ofer\u0103 servicii (nu execut\u0103 cereri read only) \u00een timpul func\u021bion\u0103rii normale a clustere, pentru a evita o competi\u021bie pentru resurse cu masterul pe aceea\u0219i ma\u0219in\u0103.<\/p>\n<p><\/p>\n<p>\u00cen cazul a dou\u0103 noduri, toleran\u021ba la defec\u021biuni este posibil\u0103 doar \u00een cazul replic\u0103rii asincrone, deoarece \u00een cazul replic\u0103rii sincrone, c\u0103derea slujitorului va duce la oprirea masterului.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Defec\u021biunea witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Defec\u021biunea witness (<em>quorum device<\/em>) o voi lua \u00een considerare doar pentru clusterul Tuchanka1, cu toate celelalte va fi aceea\u0219i poveste. \u00cen cazul unei defec\u021biuni a witness-ului, structura clusterului nu se va schimba, totul va continua s\u0103 func\u021bioneze la fel ca \u0219i p\u00e2n\u0103 acum. \u00cens\u0103 cvorumul va deveni 2 din 3, astfel \u00eenc\u00e2t orice defec\u021biune ulterioar\u0103 va deveni fatal\u0103 pentru cluster. Oricum, va trebui reparat urgent.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Defec\u021biunea Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Defec\u021biunea unuia dintre centrele de date pentru Tuchanka1. \u00cen acest caz <em>witness<\/em> \u00ee\u0219i d\u0103 votul celui de-al doilea nod de la al doilea centru de date. Acolo, fostul slujitor se transform\u0103 \u00een master, rezultatul fiind c\u0103 ambele mastere func\u021bioneaz\u0103 pe un singur server, iar ambele au referin\u021be la IP-urile lor flotante.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka2-klassicheskaya\">Tuchanka2 (clasic)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-1\">Structura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Schema clasic\u0103 din dou\u0103 noduri. Pe unul func\u021bioneaz\u0103 masterul, pe cel\u0103lalt slujitorul. Ambele pot executa cereri (slujitorul doar read only), de aceea ambele au referin\u021be la IP flotant: krogan2 \u2014 pentru master, krogan2s1 \u2014 pentru slujitor. Toleran\u021ba la defec\u021biuni va exista at\u00e2t pentru master, c\u00e2t \u0219i pentru slujitor.<\/p>\n<p><\/p>\n<p>\u00cen cazul a dou\u0103 noduri, toleran\u021ba la defec\u021biuni este posibil\u0103 doar \u00een cazul replic\u0103rii asincrone, deoarece \u00een cazul replic\u0103rii sincrone, c\u0103derea slujitorului va duce la oprirea masterului.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Defec\u021biunea Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen cazul unei defec\u021biuni a unuia dintre centrele de date <em>witness<\/em> voteaz\u0103 pentru al doilea. Pe singurul centru de date func\u021bional va fi ridicat un master, iar ambele IP float: cel master \u0219i cel de lucru \u00eei vor indica. Desigur, instan\u021ba trebuie s\u0103 fie configurat\u0103 astfel \u00eenc\u00e2t s\u0103 aib\u0103 suficiente resurse (limite pentru conexiuni etc.) pentru a gestiona \u00een mod simultan toate conexiunile \u0219i cererile de la IP-urile float master \u0219i slave. Asta \u00eenseamn\u0103 c\u0103 \u00een condi\u021bii normale de func\u021bionare, ar trebui s\u0103 aib\u0103 un rezervor suficient de limite.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (multe slave)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Structura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este deja o alt\u0103 extrem\u0103. Exist\u0103 baze de date care primesc foarte multe cereri de tip read-only (situa\u021bia tipic\u0103 a unui site cu \u00eenc\u0103rcare mare). Tuchanka4 este o situa\u021bie \u00een care slavele pot fi trei sau mai multe pentru a gestiona aceste cereri, dar totu\u0219i nu prea multe. La un num\u0103r foarte mare de slave, va trebui s\u0103 se inventeze un sistem ierarhic de replicare. \u00cen cel mai simplu caz (\u00een imagine), \u00een fiecare dintre cele dou\u0103 centre de date se afl\u0103 c\u00e2te dou\u0103 servere, pe fiecare dintre ele c\u00e2te o instan\u021b\u0103 PostgreSQL.<\/p>\n<p><\/p>\n<p>O alt\u0103 caracteristic\u0103 a acestui sistem este c\u0103 aici se poate organiza deja o replicare sincron\u0103. Aceasta este configurat\u0103 pentru a replica, dac\u0103 este posibil, \u00eentr-un alt centru de date, \u0219i nu pe o replic\u0103 \u00een acela\u0219i centru de date cu masterul. La master \u0219i la fiecare slave se indic\u0103 un IP float. Ideal ar fi ca \u00eentre slave s\u0103 se efectueze un balansare a cererilor folosind un <em>sql proxy<\/em>, de exemplu, pe partea clientului. Fiecare tip de client poate necesita un tip diferit <em>sql proxy<\/em>, \u0219i doar dezvoltatorii clien\u021bilor \u0219tiu cine ce are nevoie. Aceast\u0103 func\u021bionalitate poate fi implementat\u0103 fie cu un demon extern, fie cu o bibliotec\u0103 client (connection pool) etc. Toate acestea dep\u0103\u0219esc subiectul clusterului de baze de date tolerant la defec\u021biuni (toleran\u021ba la defec\u021biuni <em>SQL proxy<\/em> poate fi implementat independent, \u00eempreun\u0103 cu toleran\u021ba la defec\u021biuni a clientului).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Defec\u021biunea Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen cazul defec\u021biunii unui centru de date (adic\u0103 a dou\u0103 servere), martorul voteaz\u0103 pentru al doilea. Drept rezultat, \u00een al doilea centru de date func\u021bioneaz\u0103 dou\u0103 servere: pe unul func\u021bioneaz\u0103 masterul, iar acesta indic\u0103 IP-ul float master pentru primirea cererilor read-write; iar pe cel de-al doilea server func\u021bioneaz\u0103 un slave cu replicare sincron\u0103, care este indicat de unul dintre IP-urile float slave (pentru cererile read-only).<\/p>\n<p><\/p>\n<p>Primul lucru de men\u021bionat: nu toate IP-urile float slave vor fi func\u021bionale, ci doar unul. \u0218i pentru a func\u021biona corect cu acesta, va fi necesar ca <em>sql proxy<\/em> redirigeaz\u0103 toate cererile c\u0103tre singurul IP float r\u0103mas; iar dac\u0103 <em>sql proxy<\/em> nu, atunci se pot enumera toate IP-urile float ale sclavilor prin virgul\u0103 \u00een URL pentru conectare. \u00cen acest caz, <em>libpq<\/em> conexiunea va fi la primul IP func\u021bional, a\u0219a cum este implementat \u00een sistemul de testare automat\u0103. Este posibil ca \u00een alte biblioteci, de exemplu, JDBC, s\u0103 nu func\u021bioneze a\u0219a \u0219i s\u0103 fie necesar <em>sql proxy<\/em>. A\u0219a s-a realizat deoarece pentru IP-urile float ale sclavilor exist\u0103 o interdic\u021bie de a se ridica simultan pe acela\u0219i server, astfel \u00eenc\u00e2t acestea s\u0103 se distribuie uniform pe serverele sclav, dac\u0103 sunt mai multe.<\/p>\n<p><\/p>\n<p>Al doilea: chiar \u0219i \u00een cazul unei defec\u021biuni a centrului de date, va r\u0103m\u00e2ne o replicare sincron\u0103. \u0218i chiar dac\u0103 va avea loc o a doua defec\u021biune, adic\u0103 \u00een centrul de date r\u0103mas va ie\u0219i din func\u021biune unul dintre cele dou\u0103 servere, clusterul, de\u0219i va \u00eenceta s\u0103 ofere servicii, va p\u0103stra totu\u0219i informa\u021biile despre toate tranzac\u021biile confirmate, pentru care a dat o confirmare de commit (nu va exista pierdere de informa\u021bii \u00een cazul unei a doua defec\u021biuni).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 centre de date)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Structura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acesta este un cluster pentru situa\u021bia \u00een care exist\u0103 trei centre de date complet func\u021bionale, \u00een fiecare dintre care exist\u0103 un server Baz\u0103 de Date complet func\u021bional. \u00cen acest caz <em>quorum device<\/em> nu este necesar. \u00centr-un centru de date func\u021bioneaz\u0103 masterul, iar \u00een celelalte dou\u0103 \u2014 sclavii. Replicarea este sincron\u0103, tip ANY (slave1, slave2), adic\u0103 clientului \u00eei va veni o confirmare a commitului atunci c\u00e2nd oricare dintre sclavi r\u0103spunde \u00eent\u00e2i c\u0103 a acceptat commitul. Resursele sunt indicate de un IP float pentru master \u0219i dou\u0103 pentru sclavi. Spre deosebire de Tuchanka4, toate cele trei IP-uri float sunt rezistente la erori. Pentru balansarea interog\u0103rilor SQL read-only se poate folosi <em>sql proxy<\/em> (cu o rezisten\u021b\u0103 la erori separat\u0103), fie s\u0103 aloce un IP float sclav unei jum\u0103t\u0103\u021bi din clien\u021bi, iar celeilalte jum\u0103t\u0103\u021bi \u2014 al doilea.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Defec\u021biunea Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen cazul unei defec\u021biuni a unuia dintre centrele de date, r\u0103m\u00e2n dou\u0103. \u00cen unul este ridicat masterul \u0219i IP-ul float de la master, iar \u00een cel\u0103lalt \u2014 sclavul \u0219i ambele IP-uri float ale sclavilor (pe instan\u021b\u0103 trebuie s\u0103 existe un rezervor dublu pentru resurse, pentru a accepta toate conexiunile de la ambele IP-uri float ale sclavilor). \u00centre master \u0219i sclav exist\u0103 replicare sincron\u0103. De asemenea, clusterul va p\u0103stra informa\u021bii despre tranzac\u021biile confirmate \u0219i aprobate (nu va exista pierdere de informa\u021bii) \u00een cazul distrugerii a dou\u0103 centre de date (dac\u0103 acestea nu sunt distruse simultan).<\/p>\n<p><\/p>\n<p><em>Am decis s\u0103 nu includ o descriere detaliat\u0103 a structurii fi\u0219ierelor \u0219i desf\u0103\u0219ur\u0103rii. Cei care doresc s\u0103 experimenteze pot citi toate acestea \u00een README. Prezent\u0103m doar descrierea test\u0103rii automate.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Sistem de testare automat\u0103<\/h1>\n<p><\/p>\n<p>Pentru a verifica rezisten\u021ba la defec\u021biuni a clusterele prin simularea diferitelor defecte, a fost realizat un sistem de testare automat\u0103. Aceasta este pornit\u0103 printr-un script <code>test\/failure<\/code>. Scriptul poate accepta ca parametri numerele clustere pe care dori\u021bi s\u0103 le testa\u021bi. De exemplu, aceast\u0103 comand\u0103:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>va testa doar al doilea \u0219i al treilea cluster. Dac\u0103 parametrii nu sunt specifica\u021bi, toate clusterele vor fi testate. Toate clusterele sunt testate simultan, iar rezultatul este afi\u0219at \u00een panoul tmux. Tmux folose\u0219te un server tmux dedicat, a\u0219adar scriptul poate fi pornit din tmux-ul implicit, ceea ce va duce la un tmux \u00eennodat. V\u0103 recomand s\u0103 folosi\u021bi un terminal \u00eentr-o fereastr\u0103 mare \u0219i cu un font mic. \u00cenainte de a \u00eencepe testarea, toate ma\u0219inile virtuale sunt restaurate la un snapshot de la finalizarea scriptului. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/b546bab1ebbbe365991e1ff3d1667237.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terminalul este \u00eemp\u0103r\u021bit \u00een coloane \u00een func\u021bie de num\u0103rul clustere testate, implicit (\u00een captur\u0103 de ecran) acestea sunt patru. Con\u021binutul coloanelor \u00eel voi explica folosind exemplul Tuchanka2. Panourile din captur\u0103 sunt numerotate:<\/p>\n<p><\/p>\n<ol>\n<li>Aici este afi\u0219at\u0103 statistica testelor. Coloanele:\n<ul>\n<li><strong>failure<\/strong> \u2014 numele testului (func\u021bia din script) care simuleaz\u0103 o defec\u021biune.<\/li>\n<li><strong>reaction<\/strong> \u2014 media aritmetic\u0103 a timpului \u00een secunde \u00een care clusterul \u0219i-a restabilit func\u021bionalitatea. Este m\u0103surat de la \u00eenceputul execu\u021biei scriptului care simuleaz\u0103 defec\u021biunea p\u00e2n\u0103 \u00een momentul \u00een care clusterul \u00ee\u0219i restabile\u0219te func\u021bionalitatea \u0219i poate continua s\u0103 ofere servicii. Dac\u0103 timpul este foarte mic, de exemplu, \u0219ase secunde (aceasta se \u00eent\u00e2mpl\u0103 \u00een clustere cu mai mul\u021bi muncitori (Tuchanka3 \u0219i Tuchanka4)), \u00eenseamn\u0103 c\u0103 defec\u021biunea a avut loc pe un muncitor asincron \u0219i nu a afectat \u00een niciun fel func\u021bionalitatea, nu au fost schimb\u0103ri de stare ale clusterului.<\/li>\n<li><strong>deviation<\/strong> \u2014 arat\u0103 variabilitatea (precizia) valorii <strong>reaction<\/strong> prin metoda \u201edevia\u021biei standard\u201d.<\/li>\n<li><strong>count<\/strong> \u2014 c\u00e2te ori a fost executat acest test.<\/li>\n<\/ul>\n<\/li>\n<li>Un jurnal scurt permite evaluarea activit\u0103\u021bii curente a clusterului. Afi\u0219eaz\u0103 num\u0103rul itera\u021biei (testului), un timestamp \u0219i numele opera\u021biei. O execu\u021bie prea lung\u0103 (&gt;5 minute) sugereaz\u0103 o problem\u0103.<\/li>\n<li><strong>heart<\/strong> (inim\u0103) \u2014 timpul curent. Pentru evaluarea vizual\u0103 a func\u021bion\u0103rii <em>maestrului<\/em> \u00een tabelul s\u0103u se scrie constant timpul curent folosind IP-ul float al maestrului. \u00cen caz de succes, rezultatul este afi\u0219at \u00een acest panou.<\/li>\n<li><strong>b\u0103t\u0103i<\/strong> (puls) \u2014 \u201etimpul curent\u201d, care a fost anterior \u00eenregistrat de script <strong>heart<\/strong> \u00een maestru, acum este citit din <em>servitor<\/em> prin intermediul IP-ului s\u0103u float. Permite evaluarea vizual\u0103 a func\u021bion\u0103rii servitorului \u0219i replic\u0103rii. \u00cen Tuchanka1 nu exist\u0103 servitori cu IP float (nu exist\u0103 servitori care ofer\u0103 servicii), dar exist\u0103 dou\u0103 instan\u021be (Baz\u0103 de Date), a\u0219a c\u0103 aici nu va fi afi\u0219at <strong>b\u0103t\u0103i<\/strong>, iar <strong>heart<\/strong> a doua instan\u021b\u0103.<\/li>\n<li>Monitorizarea st\u0103rii clusterului cu ajutorul utilitarului <code>pcs mon<\/code>. Afi\u0219eaz\u0103 structura, distribu\u021bia resurselor pe noduri \u0219i alte informa\u021bii utile.<\/li>\n<li>Aici este afi\u0219at\u0103 monitorizarea sistemului din fiecare ma\u0219in\u0103 virtual\u0103 a clusterului. Poate exista mai multe astfel de panouri \u2014 c\u00e2te ma\u0219ini virtuale sunt \u00een cluster. Dou\u0103 grafice <em>\u00cenc\u0103rcarea CPU<\/em> (\u00een ma\u0219inile virtuale sunt c\u00e2te dou\u0103 procesoare), numele ma\u0219inii virtuale, <em>\u00cenc\u0103rcarea sistemului<\/em> (denumit\u0103 Load Average, deoarece este mediat\u0103 pe 5, 10 \u0219i 15 minute), date despre procese \u0219i distribu\u021bia memoriei.<\/li>\n<li>Urmarirea scriptului care efectueaz\u0103 testarea. \u00cen caz de defectare \u2014 \u00eentreruperea brusc\u0103 a func\u021bion\u0103rii sau ciclu infinit de a\u0219teptare \u2014 aici se va putea observa cauza acestui comportament.<\/li>\n<\/ol>\n<p><\/p>\n<p>Testarea se desf\u0103\u0219oar\u0103 \u00een dou\u0103 etape. Mai \u00eent\u00e2i, scriptul trece prin toate tipurile de teste, aleg\u00e2nd aleatoriu o ma\u0219in\u0103 virtual\u0103 la care s\u0103 aplice acest test. Apoi se execut\u0103 un ciclu infinit de testare, ma\u0219inile virtuale \u0219i defectarea fiind alese aleatoriu de fiecare dat\u0103. Finalizarea brusc\u0103 a testului scriptului (panoul de jos) sau ciclu infinit de a\u0219teptare pentru ceva (&gt; 5 minute timp de execu\u021bie pentru o opera\u021biune, se poate observa \u00een urm\u0103rire) indic\u0103 faptul c\u0103 unul dintre teste a e\u0219uat pe acest cluster.<\/p>\n<p><\/p>\n<p>Fiecare test este compus din urm\u0103toarele opera\u021biuni:<\/p>\n<p><\/p>\n<ol>\n<li>Lansarea unei func\u021bii care emuleaz\u0103 o pan\u0103.<\/li>\n<li><strong>Gata?<\/strong> \u2014 a\u0219teptarea restabilirii func\u021bion\u0103rii clusterului (c\u00e2nd toate serviciile sunt disponibile).<\/li>\n<li>Se afi\u0219eaz\u0103 timpul de a\u0219teptare pentru restabilirea clusterului (<em>reaction<\/em>).<\/li>\n<li><strong>Fixare<\/strong> \u2014 clusterul \u201ese repar\u0103\u201d. Dup\u0103 care ar trebui s\u0103 revin\u0103 la o stare complet func\u021bional\u0103 \u0219i preg\u0103tit pentru o nou\u0103 pan\u0103.<\/li>\n<\/ol>\n<p><\/p>\n<p>Iat\u0103 lista testelor cu descrierea a ceea ce fac:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: creeaz\u0103 &quot;Out of memory&quot; cu ajutorul unei fork-bombs.<\/li>\n<li><strong>OutOfSpace<\/strong>: umple discul de stocare. \u00cens\u0103 testul este mai mult simbolic, av\u00e2nd \u00een vedere \u00eenc\u0103rc\u0103tura neglijabil\u0103 creat\u0103 \u00een timpul test\u0103rii; \u00een cazul umplerii discului de stocare, PostgreSQL de obicei nu se defecteaz\u0103.<\/li>\n<li><strong>Postgres-KILL<\/strong>: opre\u0219te PostgreSQL cu comanda <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: suspend\u0103 PostgreSQL cu comanda <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \u201eopre\u0219te\u201d virtuala cu comanda <code>VBoxManage controlvm &quot;ma\u0219in\u0103 virtual\u0103&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: reporne\u0219te virtuala cu comanda <code>VBoxManage controlvm &quot;ma\u0219in\u0103 virtual\u0103&quot; reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: suspend\u0103 demonul SBD cu comanda <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: trimite comanda c\u0103tre virtual\u0103 prin SSH <code>systemctl poweroff<\/code>, sistemul finalizeaz\u0103 corect opera\u021biunile.<\/li>\n<li><strong>UnLink<\/strong>: izolare de re\u021bea, comanda <code>VBoxManage controlvm &quot;ma\u0219in\u0103 virtual\u0103&quot; setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Finalizarea test\u0103rii fie prin comanda standard tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, fie prin comanda &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: acest lucru finalizeaz\u0103 testarea, tmux se \u00eenchide, virtualele se opresc.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Probleme identificate \u00een timpul test\u0103rii<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>\u00cen acest moment <em>demonul watchdog sbd<\/em> gestioneaz\u0103 oprirea demonilor monitoriza\u021bi, dar nu \u0219i suspendarea lor. \u0218i, ca urmare, defec\u021biunile nu sunt gestionate corect, ceea ce duce la suspendarea doar <em>Corosync<\/em> \u0219i <em>Pacemaker<\/em>, dar f\u0103r\u0103 a suspenda <em>sbd<\/em>. Pentru verificare <em>Corosync<\/em> este deja disponibil <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (pe GitHub la <em>sbd<\/em>)<\/a><\/noindex>, acceptat \u00een ramura <em>master<\/em>. Au promis (\u00een PR#83) c\u0103 va exista ceva similar \u0219i pentru Pacemaker, sper c\u0103 la <em>RedHat 8<\/em> vor face. Dar astfel de \u201edefec\u021biuni\u201d sunt teoretice, u\u0219or de imitat artificial cu ajutorul, de exemplu, <code>killall -STOP corosync<\/code>, dar niciodat\u0103 \u00eent\u00e2lnite \u00een via\u021ba real\u0103.<\/p>\n<p>\n<\/li>\n<li>\n<p>\u00cen <em>Pacemaker<\/em> versiunea pentru <em>CentOS 7<\/em> sunt setate gre\u0219it <em>sync_timeout<\/em> u <em>quorum device<\/em>, ca rezultat <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">la e\u0219uarea unei noduri, cu o probabilitate, al doilea nod se reporne\u0219te<\/a><\/noindex>, pe care masterul ar fi trebuit s\u0103 se mute. S-a remediat prin cre\u0219terea <em>sync_timeout<\/em> u <em>quorum device<\/em> \u00een timpul desf\u0103\u0219ur\u0103rii (\u00een scriptul <code>setup\/setup1<\/code>). Aceast\u0103 corectare nu a fost acceptat\u0103 de dezvoltatori <em>Pacemaker<\/em>, \u00een schimb, au promis s\u0103 reproiecteze infrastructura astfel (\u00eentr-un viitor oarecare), astfel \u00eenc\u00e2t acest timeout s\u0103 fie calculat automat.<\/p>\n<p>\n<\/li>\n<li>\n<p>Dac\u0103 \u00een configurarea bazei de date se specific\u0103 c\u0103 \u00een <code>LC_MESSAGES<\/code> (mesajele text) se poate folosi Unicode, de exemplu, <code>ru_RU.UTF-8<\/code>, atunci la lansare <em>postgres<\/em> \u00eentr-un mediu \u00een care localele nu sunt UTF-8, de exemplu, \u00eentr-un mediu gol (aici <em>pacemaker<\/em>+<em>pgsqlms<\/em>(paf) se lanseaz\u0103 <em>postgres<\/em>), atunci <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">\u00een jurnal \u00een loc de caractere UTF-8 vor ap\u0103rea semne de \u00eentrebare<\/a><\/noindex>. Dezvoltatorii PostgreSQL nu au convenit ce s\u0103 fac\u0103 \u00een acest caz. Se poate ocoli, trebuie s\u0103 se seteze <code>LC_MESSAGES=en_US.UTF-8<\/code> la configurarea (crearea) unei instan\u021be DB.<\/p>\n<p>\n<\/li>\n<li>\n<p>Dac\u0103 este setat wal_receiver_timeout (\u00een mod implicit 60s), atunci \u00een testul PostgreSQL-STOP pe master \u00een clusterele tuchanka3 \u0219i tuchanka4 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">nu are loc reconectarea replic\u0103rii la noul master<\/a><\/noindex>. Replicarea este acolo sincronizat\u0103, astfel c\u0103 nu se opre\u0219te doar slave-ul, ci \u0219i noul master. Se poate evita prin setarea wal_receiver_timeout=0 la configurarea PostgreSQL.<\/p>\n<p>\n<\/li>\n<li>\n<p>Rareori am observat suspendarea replic\u0103rii la PostgreSQL \u00een testul ForkBomb (supra\u00eenc\u0103rcarea memoriei). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Dup\u0103 ForkBomb, uneori slavelor li se poate \u00eent\u00e2mpla s\u0103 nu se reconecteze la noul master<\/a><\/noindex>. Am \u00eent\u00e2lnit asta doar \u00een clusterele tuchanka3 \u0219i tuchanka4, unde, din cauza replic\u0103rii sincronizate, masterul a r\u0103mas suspendat. Problema s-a rezolvat de la sine, dup\u0103 un timp \u00eendelungat (aproape dou\u0103 ore). Este necesar\u0103 o cercetare suplimentar\u0103 pentru a remedia aceast\u0103 problem\u0103. Ca simptome, seam\u0103n\u0103 cu o eroare anterioar\u0103, care este cauzat\u0103 de o alt\u0103 problem\u0103, dar are consecin\u021be similare.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Imaginea kroganului este preluat\u0103 de la <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> cu permisiunea autorului:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelarea clusterelor tolerate la defecte pe baz\u0103 de PostgreSQL \u0219i Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/ded1ead387814d97d84d0fb89e025386.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Modelarea clusterelor tolerante la erori pe baza PostgreSQL \u0219i Pacemaker | ProHoster","description":"Introducere. Cu ceva timp \u00een urm\u0103, mi s-a pus sarcina de a dezvolta un cluster tolerant la erori pentru PostgreSQL.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}