{"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\/sk\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">\u00davod<\/h1>\n<p><\/p>\n<p>Pred nieko\u013ek\u00fdmi mesiacmi sa mi naskytla \u00faloha vyvin\u00fa\u0165 vysoko dostupn\u00fd klaster pre <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, ktor\u00fd funguje v nieko\u013ek\u00fdch d\u00e1tov\u00fdch centr\u00e1ch prepojen\u00fdch optick\u00fdm vl\u00e1knom v r\u00e1mci jedn\u00e9ho mesta a odol\u00e1va poruche (napr\u00edklad v\u00fdpadku energie) jedn\u00e9ho d\u00e1tov\u00e9ho centra. Ako softv\u00e9r, ktor\u00fd zais\u0165uje vysok\u00fa dostupnos\u0165, som zvolil <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, preto\u017ee je to ofici\u00e1lne rie\u0161enie od RedHat pre vytv\u00e1ranie vysoko dostupn\u00fdch klastrov. Je dobr\u00e9 t\u00fdm, \u017ee RedHat zabezpe\u010duje jeho podporu a \u017ee ide o univerz\u00e1lne (modul\u00e1rne) rie\u0161enie. S jeho pomocou bude mo\u017en\u00e9 zabezpe\u010di\u0165 vysok\u00fa dostupnos\u0165 nielen pre PostgreSQL, ale aj pre in\u00e9 slu\u017eby, bu\u010f pou\u017eit\u00edm \u0161tandardn\u00fdch modulov, alebo vytvoren\u00edm vlastn\u00fdch pod\u013ea konkr\u00e9tnych potrieb.<\/p>\n<p><\/p>\n<p>K tomuto rie\u0161eniu sa objavila opr\u00e1vnen\u00e1 ot\u00e1zka: ak\u00e1 vysok\u00e1 bude dostupnos\u0165 vysoko dostupn\u00e9ho klastru? Na presk\u00famanie tejto t\u00e9my som vytvoril testovac\u00ed syst\u00e9m, ktor\u00fd imituje r\u00f4zne poruchy na uzloch klastru, o\u010dak\u00e1va obnovenie funk\u010dnosti, obnovuje nefunk\u010dn\u00fd uzol a pokra\u010duje v testovan\u00ed v cykle. P\u00f4vodne sa tento projekt volal hapgsql, ale \u010dasom ma omrzelo toto meno, v ktorom bola len jedna samohl\u00e1ska. Preto som za\u010dal naz\u00fdva\u0165 vysoko dostupn\u00e9 datab\u00e1zy (a float IP, ktor\u00e9 na ne odkazuj\u00fa) <strong>krogan<\/strong> (postava z po\u010d\u00edta\u010dovej hry, ktor\u00e1 m\u00e1 v\u0161etky d\u00f4le\u017eit\u00e9 org\u00e1ny duplikovan\u00e9), a uzly, klastry a samotn\u00fd projekt \u2013 <strong>tuchanka<\/strong> (plan\u00e9ta, kde \u017eij\u00fa krogania).<\/p>\n<p><\/p>\n<p>Teraz vedenie povolilo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">otvori\u0165 projekt pre open source komunitu pod licenciou MIT<\/a><\/noindex>. README bude \u010doskoro prelo\u017een\u00e9 do angli\u010dtiny (preto\u017ee sa o\u010dak\u00e1va, \u017ee hlavn\u00fdmi pou\u017e\u00edvate\u013emi bud\u00fa v\u00fdvoj\u00e1ri Pacemaker a PostgreSQL), a star\u00fa rusk\u00fa verziu README som sa rozhodol upravi\u0165 (\u010diasto\u010dne) vo forme tohto \u010dl\u00e1nku.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a 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>Klastre sa nasadzuj\u00fa na virtu\u00e1lnych strojoch <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. Celkovo bude nasaden\u00fdch 12 virtu\u00e1lnych strojov (spolu 36GiB), ktor\u00e9 vytvoria 4 vysoko dostupn\u00e9 klastry (r\u00f4zne varianty). Prv\u00e9 dva klastry pozost\u00e1vaj\u00fa z dvoch serverov PostgreSQL, ktor\u00e9 s\u00fa umiestnen\u00e9 v r\u00f4znych d\u00e1tov\u00fdch centr\u00e1ch, a spolo\u010dn\u00e9ho servera <em>witness<\/em> c <strong>quorum device<\/strong> (umiestnen\u00e9 na lacnom virtu\u00e1lnom stroji v tre\u0165om d\u00e1tovom centre), ktor\u00fd rozuzl\u00ed nejasnos\u0165 <strong>50%\/50%<\/strong>, d\u00e1vaj\u00fac svoj hlas jednej zo str\u00e1n. Tret\u00ed klaster je v troch d\u00e1tov\u00fdch centr\u00e1ch: jeden master, dva slave, bez <strong>quorum device<\/strong>. \u0160tvrt\u00fd cluster pozost\u00e1va zo \u0161tyroch serverov PostgreSQL, po dva na d\u00e1tov\u00e9 centrum: jeden je hlavn\u00fd, ostatn\u00e9 s\u00fa repliky, a tie\u017e pou\u017e\u00edva <em>witness<\/em> c <strong>quorum device<\/strong>. \u0160tvrt\u00fd zvl\u00e1da v\u00fdpadok dvoch serverov alebo jedn\u00e9ho d\u00e1tov\u00e9ho centra. Toto rie\u0161enie m\u00f4\u017ee by\u0165, ak je to potrebn\u00e9, roz\u0161\u00edren\u00e9 na v\u00e4\u010d\u0161\u00ed po\u010det replik.<\/p>\n<p><\/p>\n<p>Slu\u017eba presn\u00e9ho \u010dasu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> tie\u017e je prekonfigurovan\u00e1 na vysok\u00fa dostupnos\u0165, pri\u010dom sa pou\u017e\u00edva met\u00f3da <code>ntpd<\/code> (<em>orphan mode<\/em>). Spolo\u010dn\u00fd server <em>witness<\/em> zohr\u00e1va \u00falohu centr\u00e1lny NTP server, poskytuj\u00fac svoj \u010das v\u0161etk\u00fdm clusterom, \u010d\u00edm synchronizuje v\u0161etky servery medzi sebou. Ak <em>witness<\/em> vypadne alebo bude izolovan\u00fd, za\u010dne svoj \u010das poskytova\u0165 jeden zo serverov klastrov (v r\u00e1mci klastru). Pomocn\u00fd vyrovn\u00e1vac\u00ed <strong>HTTP proxy<\/strong> taktie\u017e je spusten\u00fd na <em>witness<\/em>, s jeho pomocou maj\u00fa ostatn\u00e9 virtu\u00e1lne stroje pr\u00edstup k Yum-repozit\u00e1rom. V skuto\u010dnosti bud\u00fa tak\u00e9to slu\u017eby, ako presn\u00fd \u010das a proxy, ur\u010dite hosten\u00e9 na vyhraden\u00fdch serveroch, zatia\u013e \u010do v st\u00e1nku s\u00fa hosten\u00e9 na <em>witness<\/em> len kv\u00f4li \u00faspore po\u010dtu virtu\u00e1lnych strojov a miesta.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Verzie<\/h1>\n<p><\/p>\n<p>v0. Funguje s CentOS 7 a PostgreSQL 11 na VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">\u0160trukt\u00fara klastrov<\/h1>\n<p><\/p>\n<p>V\u0161etky clustre s\u00fa ur\u010den\u00e9 na umiestnenie v nieko\u013ek\u00fdch d\u00e1tov\u00fdch centr\u00e1ch, s\u00fa prepojen\u00e9 do jednej plochej siete a musia odol\u00e1va\u0165 v\u00fdpadku alebo sie\u0165ovej izol\u00e1cii jedn\u00e9ho d\u00e1tov\u00e9ho centra. Preto <strong>ned\u00e1 vykona\u0165<\/strong> pou\u017ei\u0165 na ochranu pred <strong>split-brain<\/strong> \u0161tandardn\u00fa technol\u00f3giu Pacemaker, ktor\u00e1 sa naz\u00fdva <em>STONITH<\/em> (Shoot The Other Node In The Head) alebo <em>fencing<\/em>. Jej podstata: ak uzly v klastri za\u010dn\u00fa podozrieva\u0165, \u017ee s niektorou uzlom sa deje nie\u010do zl\u00e9, nenap\u00e1ja sa alebo sa spr\u00e1va nespr\u00e1vne, tak ho n\u00fatene odpoja cez \u201eextern\u00e9\u201c zariadenia, ako napr\u00edklad riadiacu kartu IPMI alebo UPS. Ale toto funguje len v pr\u00edpadoch, ke\u010f pri jednotkovom v\u00fdpadku servera IPMI alebo UPS na\u010falej funguj\u00fa. Tu sa pl\u00e1nuje ochrana pred ove\u013ea katastrofickej\u0161\u00edm v\u00fdpadkom, ke\u010f zlyh\u00e1 (napr. je odpojen\u00e9 od nap\u00e1jania) cel\u00e9 d\u00e1tov\u00e9 centrum. A pri takomto v\u00fdpadku v\u0161etky <em>stonith<\/em>-zariadenia (IPMI, UPS at\u010f.) tie\u017e nebud\u00fa fungova\u0165.<\/p>\n<p><\/p>\n<p>Namiesto toho v z\u00e1kladnom syst\u00e9me le\u017e\u00ed my\u0161lienka kv\u00f3ra. V\u0161etky uzly maj\u00fa hlas a m\u00f4\u017eu pracova\u0165 len tie, ktor\u00e9 vidia viac ako polovicu v\u0161etk\u00fdch uzlov. Tento po\u010det \u201epolovica+1\u201c sa naz\u00fdva <strong>kv\u00f3rum<\/strong>. Ak sa kv\u00f3rum nenazbiera, uzol sa rozhodne, \u017ee sa nach\u00e1dza v sie\u0165ovej izol\u00e1cii a mus\u00ed odpoji\u0165 svoje zdroje, t.j. to je tak\u00e1 <strong>ochrana proti split-brain<\/strong>. Ak softv\u00e9r, ktor\u00fd zodpoved\u00e1 za tak\u00e9to spr\u00e1vanie, nefunguje, mal by sa aktivova\u0165 watchdog, napr\u00edklad na b\u00e1ze IPMI.<\/p>\n<p><\/p>\n<p>Ak je po\u010det uzlov p\u00e1rny (klaster v dvoch d\u00e1tov\u00fdch centr\u00e1ch), m\u00f4\u017ee vznikn\u00fa\u0165 takzvan\u00e1 neur\u010ditos\u0165 <strong>50%\/50%<\/strong> (<em>fifty-fifty<\/em>), kedy sie\u0165ov\u00e1 izol\u00e1cia rozdel\u00ed klaster presne napoly. Preto sa pre p\u00e1rny po\u010det uzlov prid\u00e1va <strong>quorum device<\/strong> \u2014 nen\u00e1ro\u010dn\u00fd d\u00e9mon, ktor\u00fd m\u00f4\u017ee by\u0165 spusten\u00fd na najlacnej\u0161ej virtu\u00e1lke v tre\u0165om d\u00e1tovom centre. D\u00e1va svoj hlas jedn\u00e9mu z segmentov (ktor\u00fd vid\u00ed), \u010d\u00edm odstra\u0148uje neur\u010ditos\u0165 50%\/50%. Server, na ktorom bude spusten\u00e9 quorum device, som nazval <em>witness<\/em> (terminol\u00f3gia z repmgr, p\u00e1\u010dila sa mi).<\/p>\n<p><\/p>\n<p>Zdroje m\u00f4\u017eu pres\u00fava\u0165 svoje umiestnenie, napr\u00edklad z nefunk\u010dn\u00fdch serverov na funk\u010dn\u00e9, alebo na pr\u00edkaz syst\u00e9mov\u00fdch administr\u00e1torov. Aby klienti vedeli, kde sa nach\u00e1dzaj\u00fa potrebn\u00e9 zdroje (kam sa pripoji\u0165?), pou\u017e\u00edvaj\u00fa sa <em>pl\u00e1vaj\u00face IP<\/em> (<strong>float IP<\/strong>). To s\u00fa IP, ktor\u00e9 m\u00f4\u017ee Pacemaker pres\u00fava\u0165 medzi uzlami (v\u0161etko je v plochej sieti). Ka\u017ed\u00fd z nich symbolizuje zdroj (slu\u017ebu) a bude sa nach\u00e1dza\u0165 tam, kam je potrebn\u00e9 pripoji\u0165 sa, aby sa z\u00edskal pr\u00edstup k tejto slu\u017ebe (v na\u0161om pr\u00edpade DB).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (sch\u00e9ma s utesnen\u00edm)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Struktura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>My\u0161lienka bola v tom, \u017ee m\u00e1me mnoho drobn\u00fdch datab\u00e1z s n\u00edzkym za\u0165a\u017een\u00edm, pre ktor\u00e9 nie je v\u00fdhodn\u00e9 udr\u017eiava\u0165 vyhraden\u00fd slave-server v re\u017eime hot standby pre read only transakcie (nie je potrebn\u00e9 takto zbyto\u010dne m\u00ed\u0148a\u0165 zdroje).<\/p>\n<p><\/p>\n<p>V ka\u017edom d\u00e1tovom centre je jeden server. Na ka\u017edom serveri s\u00fa dve in\u0161tancie PostgreSQL (v terminol\u00f3gii PostgreSQL sa volaj\u00fa klastre, ale aby sa predi\u0161lo zm\u00e4tku, budem ich naz\u00fdva\u0165 in\u0161tanciami (podobne ako in\u00e9 DB) a klastrami budem naz\u00fdva\u0165 iba klastre Pacemaker). Jeden in\u0161tancia funguje v re\u017eime majstra a len ona poskytuje slu\u017eby (iba na \u0148u vedie float IP). Druh\u00e1 in\u0161tancia funguje ako otrok pre druh\u00e9 d\u00e1tov\u00e9 centrum a bude poskytova\u0165 slu\u017eby iba v pr\u00edpade, \u017ee jej majster zlyh\u00e1. Ke\u010f\u017ee v\u00e4\u010d\u0161inu \u010dasu poskytuje slu\u017eby (vykon\u00e1va dotazy) iba jedna in\u0161tancia z dvoch (majster), v\u0161etky prostriedky servera s\u00fa optimalizovan\u00e9 pre majstra (vy\u010dlenen\u00e1 pam\u00e4\u0165 pre cache shared_buffers at\u010f.), ale tak, aby aj druh\u00e1 in\u0161tancia mala dostatok prostriedkov (nech aj na suboptim\u00e1lnu pr\u00e1cu cez cache s\u00faborov\u00e9ho syst\u00e9mu) v pr\u00edpade zlyhania jedn\u00e9ho z d\u00e1tov\u00fdch centier. Otrok neposkytuje slu\u017eby (nevykon\u00e1va read only dotazy) za norm\u00e1lnej prev\u00e1dzky klastru, aby nedo\u0161lo k boju o prostriedky s majstrom na tej istej ma\u0161ine.<\/p>\n<p><\/p>\n<p>V pr\u00edpade dvoch uzlov je vysok\u00e1 dostupnos\u0165 mo\u017en\u00e1 iba pri asynchr\u00f3nnej replik\u00e1cii, preto\u017ee pri synchronizovanej replik\u00e1cii zlyhanie otroka vedie k zastaveniu majstra.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Zlyhanie witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zlyhanie witness (<em>quorum device<\/em>) sa budem zaobera\u0165 iba pre klaster Tuchanka1, so v\u0161etk\u00fdmi ostatn\u00fdmi bude rovnak\u00fd pr\u00edbeh. Pri zlyhan\u00ed witness v \u0161trukt\u00fare klastru sa ni\u010d nezmen\u00ed, v\u0161etko bude aj na\u010falej fungova\u0165 tak, ako fungovalo. Ale kv\u00f3rum sa stane rovn\u00e9 2 z 3, a preto ak\u00e9ko\u013evek nasleduj\u00face zlyhanie bude fat\u00e1lne pre klaster. A tak \u010di tak bude nutn\u00e9 okam\u017eite opravi\u0165.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Zlyhanie Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zlyhanie jedn\u00e9ho z d\u00e1tov\u00fdch centier pre Tuchanka1. V tomto pr\u00edpade <em>witness<\/em> odovzd\u00e1va svoj hlas druh\u00e9mu uzlu na druhom d\u00e1tovom centre. Tam sa b\u00fdval\u00fd otrok premen\u00ed na majstra, v\u00fdsledkom \u010doho na jednom serveri pracuj\u00fa obaja majstri a na nich smeruj\u00fa oba ich float IP.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka2-klassicheskaya\">Tuchanka2 (klasick\u00e9)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-1\">Struktura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Klasick\u00e9 sch\u00e9ma z dvoch uzlov. Na jednom be\u017e\u00ed majster, na druhom otrok. Obaja m\u00f4\u017eu vykon\u00e1va\u0165 dotazy (otrok iba read only), preto na oboch smeruj\u00fa float IP: krogan2 \u2014 na majstra, krogan2s1 \u2014 na otroka. Vysok\u00e1 dostupnos\u0165 bude aj u majstra, aj u otroka.<\/p>\n<p><\/p>\n<p>V pr\u00edpade dvoch uzlov je vysok\u00e1 dostupnos\u0165 mo\u017en\u00e1 iba pri asynchr\u00f3nnej replik\u00e1cii, preto\u017ee pri synchronizovanej replik\u00e1cii zlyhanie otroka vedie k zastaveniu majstra.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Zlyhanie Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pri zlyhan\u00ed jedn\u00e9ho z d\u00e1tov\u00fdch centier <em>witness<\/em> hlasuje za druh\u00fd. Na jedinom funguj\u00facom d\u00e1tovom centre bude spusten\u00fd master a na\u0148 bud\u00fa ukazova\u0165 oba float IP: master a slave. Samozrejme, in\u0161tancia mus\u00ed by\u0165 nastaven\u00e1 tak, aby mala dostatok zdrojov (limitov na pripojenia at\u010f.) na to, aby s\u00fa\u010dasne akceptovala v\u0161etky pripojenia a po\u017eiadavky od master a slave float IP. To znamen\u00e1, \u017ee pri be\u017enej prev\u00e1dzke by mala ma\u0165 dostato\u010dn\u00fa rezervu po limitoch.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (ve\u013ea slave)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Struktura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>U\u017e in\u00fd extr\u00e9m. Existuj\u00fa DB, na ktor\u00e9 prich\u00e1dza ve\u013emi ve\u013ea po\u017eiadaviek read-only (typick\u00fd pr\u00edpad vysoce za\u0165a\u017eenej str\u00e1nky). Tuchanka4 \u2014 to je situ\u00e1cia, ke\u010f m\u00f4\u017ee by\u0165 troch alebo viac slave na spracovanie tak\u00fdchto po\u017eiadaviek, ale predsa len nie pr\u00edli\u0161 ve\u013ea. Pri ve\u013emi vysokom po\u010dte slave bude potrebn\u00e9 vym\u00fd\u0161\u013ea\u0165 hierarchick\u00fd syst\u00e9m replik\u00e1cie. V minim\u00e1lnom pr\u00edpade (na obr\u00e1zku) sa v ka\u017edom z dvoch d\u00e1tov\u00fdch centier nach\u00e1dzaj\u00fa po dva servery, na ktor\u00fdch be\u017e\u00ed jedna in\u0161tancia PostgreSQL.<\/p>\n<p><\/p>\n<p>\u010eal\u0161ou zvl\u00e1\u0161tnos\u0165ou tohto sch\u00e9my je, \u017ee tu u\u017e je mo\u017en\u00e9 usporiada\u0165 jednu synchronn\u00fa replik\u00e1ciu. Je nastaven\u00e1 tak, aby replikovala, ak je to mo\u017en\u00e9, do in\u00e9ho d\u00e1tov\u00e9ho centra, a nie na replik\u00e1t v tej istej d\u00e1tovej centr\u00e1le, kde je aj master. Na master a na ka\u017ed\u00e9ho slave ukazuje float IP. V skuto\u010dnosti by medzi slave potrebn\u00e1 vyv\u00e1\u017eenos\u0165 po\u017eiadaviek prostredn\u00edctvom nejak\u00e9ho <em>sql proxy<\/em>, napr\u00edklad na strane klienta. R\u00f4znemu typu klientov m\u00f4\u017ee by\u0165 potrebn\u00fd r\u00f4zny typ <em>sql proxy<\/em>, a len v\u00fdvoj\u00e1ri klientov vedia, ktor\u00fdm typom potrebuj\u00fa. T\u00e1to funk\u010dnos\u0165 m\u00f4\u017ee by\u0165 realizovan\u00e1 bu\u010f extern\u00fdm d\u00e9monom, alebo kni\u017enicou klienta (connection pool) at\u010f. V\u0161etko toto presahuje r\u00e1mec t\u00e9my odoln\u00e9ho klastrov\u00e9ho DB (odolnos\u0165 <em>SQL proxy<\/em> je mo\u017en\u00e9 realizova\u0165 nez\u00e1visle, s\u00fa\u010dasne s odolnos\u0165ou klienta).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Porucha Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pri poruche jedn\u00e9ho d\u00e1tov\u00e9ho centra (t.j. dvoch serverov) witness hlasuje za druh\u00fd. V d\u00f4sledku toho v druhom d\u00e1tovom centre pracuj\u00fa dva servery: na jednom be\u017e\u00ed master a na\u0148 ukazuje master float IP (na prij\u00edmanie read-write po\u017eiadaviek); a na druhom serveri pracuje slave so synchronnou replik\u00e1ciou a na\u0148 ukazuje jeden zo slave float IP (na read only po\u017eiadavky).<\/p>\n<p><\/p>\n<p>Prv\u00e1 vec, ktor\u00fa treba poznamena\u0165: pracovn\u00fdm slave float IP nebude v\u0161etko, ale iba jeden. A pre spr\u00e1vnu funk\u010dnos\u0165 s n\u00edm bude potrebn\u00e9, aby <em>sql proxy<\/em> presmeroval v\u0161etky po\u017eiadavky na jedin\u00fd zost\u00e1vaj\u00faci float IP; a ak nie, <em>sql proxy<\/em> m\u00f4\u017eete v URL na pripojenie uvies\u0165 v\u0161etky float IP slave oddelen\u00e9 \u010diarkou. V takom pr\u00edpade s <em>libpq<\/em> pripojenie bude na prv\u00fd pracovn\u00fd IP, ako je to nastaven\u00e9 v automatizovanom testovan\u00ed. Mo\u017eno, \u017ee v in\u00fdch kni\u017eniciach, ako napr\u00edklad JDBC, to tak fungova\u0165 nebude a je potrebn\u00e9 <em>sql proxy<\/em>. Je to tak preto, \u017ee float IP pre slave maj\u00fa zak\u00e1zan\u00e9 s\u00fa\u010dasne sa zvy\u0161ova\u0165 na jednom serveri, aby sa rovnomerne rozde\u013eovali medzi slave servery v pr\u00edpade, \u017ee ich pracuje nieko\u013eko.<\/p>\n<p><\/p>\n<p>Druh\u00e9: aj v pr\u00edpade zlyhania d\u00e1tov\u00e9ho centra zostane zachovan\u00e1 synchronn\u00e1 replik\u00e1cia. A aj ke\u010f d\u00f4jde k sekund\u00e1rnemu zlyhaniu, t.j. v zost\u00e1vaj\u00facom d\u00e1tovom centre zlyh\u00e1 jeden z dvoch serverov, klaster s\u00edce prestane poskytova\u0165 slu\u017eby, ale st\u00e1le si uchov\u00e1 inform\u00e1cie o v\u0161etk\u00fdch potvrden\u00fdch transakci\u00e1ch, ku ktor\u00fdm dal potvrdenie o commite (ned\u00f4jde k strate inform\u00e1ci\u00ed pri sekund\u00e1rnom zlyhan\u00ed).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 d\u00e1tov\u00e9 centr\u00e1)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Struktura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toto je klaster pre situ\u00e1ciu, ke\u010f s\u00fa tri plne funk\u010dn\u00e9 d\u00e1tov\u00e9 centr\u00e1, v ktor\u00fdch ka\u017ed\u00fd obsahuje plne funk\u010dn\u00fd datab\u00e1zov\u00fd server. V tomto pr\u00edpade <em>quorum device<\/em> nie je potrebn\u00fd. V jednom d\u00e1tovom centre funguje master, v dvoch ostatn\u00fdch \u2014 slaves. Replik\u00e1cia je synchronn\u00e1, typu ANY (slave1, slave2), \u010do znamen\u00e1, \u017ee klient dostane potvrdenie o commite, ke\u010f ktor\u00fdko\u013evek z slave odpovie ako prv\u00fd, \u017ee prijal commit. Na zdroje ukazuje jeden float IP pre mastera a dva pre slaves. Na rozdiel od Tuchanka4 s\u00fa v\u0161etky tri float IP odoln\u00e9 vo\u010di zlyhaniu. Pre vyva\u017eovanie SQL po\u017eiadaviek len na \u010d\u00edtanie m\u00f4\u017eete pou\u017ei\u0165 <em>sql proxy<\/em> (s oddelenou odolnos\u0165ou vo\u010di zlyhaniu), alebo polovici klientov priradi\u0165 jeden slave float IP a druhej polovici \u2014 druh\u00fd.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Zlyhanie Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pri zlyhan\u00ed jedn\u00e9ho z d\u00e1tov\u00fdch centier zostan\u00fa dve. V jednom je spusten\u00fd master a float IP od mastera, vo druhom \u2014 slave a oba slave float IP (na in\u0161tancii by mal by\u0165 zdvojen\u00fd z\u00e1sobn\u00edk zdrojov, aby prijal v\u0161etky pripojenia z oboch slave float IP). Medzi masterom a slave je synchronn\u00e1 replik\u00e1cia. Klaster tie\u017e uchov\u00e1 inform\u00e1cie o potvrden\u00fdch a schv\u00e1len\u00fdch transakci\u00e1ch (ned\u00f4jde k strate inform\u00e1ci\u00ed) v pr\u00edpade zni\u010denia dvoch d\u00e1tov\u00fdch centier (ak nie s\u00fa zni\u010den\u00e9 s\u00fa\u010dasne).<\/p>\n<p><\/p>\n<p><em>Podrobn\u00e9 opisy s\u00faborovej \u0161trukt\u00fary a nasadenia som sa rozhodol neuv\u00e1dza\u0165. Kto chce experimentova\u0165, m\u00f4\u017ee si v\u0161etko pre\u010d\u00edta\u0165 v README. Prip\u00e1jame len popis automatizovan\u00e9ho testovania.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Syst\u00e9m automatizovan\u00e9ho testovania<\/h1>\n<p><\/p>\n<p>Na overenie odolnosti klastrov s imit\u00e1ciou r\u00f4znych por\u00fach bol vytvoren\u00fd syst\u00e9m automatizovan\u00e9ho testovania. Sp\u00fa\u0161\u0165a sa skriptom <code>test\/failure<\/code>. Skript m\u00f4\u017ee prij\u00edma\u0165 ako parametre \u010d\u00edsla klastrov, ktor\u00e9 sa maj\u00fa testova\u0165. Napr\u00edklad tento pr\u00edkaz:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>bude testova\u0165 len druh\u00fd a tret\u00ed klaster. Ak nie s\u00fa parametre zadan\u00e9, testova\u0165 sa bud\u00fa v\u0161etky klastre. V\u0161etky klastre sa testuj\u00fa paralelne a v\u00fdsledok sa zobrazuje v paneli tmux. Tmux pou\u017e\u00edva vyhraden\u00fd tmux server, tak\u017ee skript je mo\u017en\u00e9 sp\u00fa\u0161\u0165a\u0165 z defaultn\u00e9ho tmux, vytvor\u00ed sa vnoren\u00fd tmux. Odpor\u00fa\u010dam pou\u017e\u00edva\u0165 termin\u00e1l v ve\u013ekom okne a s mal\u00fdm p\u00edsmom. Pred za\u010diatkom testovania sa v\u0161etky virtu\u00e1lne stroje vr\u00e1tia sp\u00e4\u0165 na snapshot v momente ukon\u010denia skriptu. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/b546bab1ebbbe365991e1ff3d1667237.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Termin\u00e1l je rozdelen\u00fd na st\u013apce pod\u013ea po\u010dtu testovan\u00fdch klastrov, predvolene (na sn\u00edmke) ich je \u0161tyri. Obsah st\u013apcov podrobne op\u00ed\u0161em na pr\u00edklade Tuchanka2. Panely na sn\u00edmke s\u00fa \u010d\u00edslovan\u00e9:<\/p>\n<p><\/p>\n<ol>\n<li>Tu sa zobrazuje \u0161tatistika testov. St\u013apce:\n<ul>\n<li><strong>failure<\/strong> \u2014 n\u00e1zov testu (funkcie v skripte), ktor\u00fd simuluje poruchu.<\/li>\n<li><strong>reaction<\/strong> \u2014 priemerne aritmetick\u00fd \u010das v sekund\u00e1ch, za ktor\u00fd klaster obnovil svoju funk\u010dnos\u0165. Meria sa od za\u010diatku pr\u00e1ce skriptu, ktor\u00fd simuluje poruchu, a\u017e do momentu, ke\u010f klaster obnov\u00ed svoju funk\u010dnos\u0165 a je schopn\u00fd pokra\u010dova\u0165 v poskytovan\u00ed slu\u017eieb. Ak je \u010das ve\u013emi kr\u00e1tky, napr\u00edklad \u0161es\u0165 sek\u00fand (to sa st\u00e1va v klastroch s viacer\u00fdmi otrokmi (Tuchanka3 a Tuchanka4)), znamen\u00e1 to, \u017ee porucha sa vyskytla na asynchr\u00f3nnom otrokovi a nijako neovplyvnila funk\u010dnos\u0165, nedo\u0161lo k prep\u00ednaniu stavu klastru.<\/li>\n<li><strong>deviation<\/strong> \u2014 zobrazuje rozptyl (presnos\u0165) hodnoty <strong>reaction<\/strong> met\u00f3dou \u00ab\u0161tandardn\u00e1 devi\u00e1cia\u00bb.<\/li>\n<li><strong>count<\/strong> \u2014 ko\u013ekokr\u00e1t bol tento test vykonan\u00fd.<\/li>\n<\/ul>\n<\/li>\n<li>Kr\u00e1tky denn\u00edk umo\u017e\u0148uje pos\u00fadi\u0165, \u010d\u00edm sa klaster v aktu\u00e1lnom momente zaober\u00e1. Zobrazuje sa \u010d\u00edslo iter\u00e1cie (testu), \u010dasov\u00e1 zna\u010dka a n\u00e1zov oper\u00e1cie. Pr\u00edli\u0161 dlh\u00e9 vykon\u00e1vanie (&gt; 5 min\u00fat) nazna\u010duje nejak\u00fd probl\u00e9m.<\/li>\n<li><strong>heart<\/strong> (srdce) \u2014 aktu\u00e1lny \u010das. Pre vizu\u00e1lnu hodnotenie funk\u010dnosti <em>majster<\/em> do jeho tabu\u013eky sa neust\u00e1le zapisuje aktu\u00e1lny \u010das pomocou float IP majstra. V pr\u00edpade \u00faspechu sa v\u00fdsledok zobrazuje na tomto paneli.<\/li>\n<li><strong>beat<\/strong> (pulz) \u2014 \"aktu\u00e1lny \u010das\", ktor\u00fd bol predt\u00fdm zaznamenan\u00fd skriptom <strong>heart<\/strong> v majstrovi, teraz sa \u010d\u00edta z <em>slu\u017eobn\u00edka<\/em> cez jeho float IP. Umo\u017e\u0148uje vizu\u00e1lne pos\u00fadi\u0165 funk\u010dnos\u0165 slu\u017eobn\u00edka a replik\u00e1cie. Na Tuchanka1 nie s\u00fa slu\u017eobn\u00edci s float IP (nie s\u00fa tu slu\u017eobn\u00edci poskytuj\u00faci slu\u017eby), ale s\u00fa tam dva in\u0161tancie (DB), preto tu bude zobrazen\u00e9 nie <strong>beat<\/strong>, a <strong>heart<\/strong> druh\u00e9ho in\u0161tancie.<\/li>\n<li>Monitorovanie stavu klasteru pomocou utilitky <code>pcs mon<\/code>. Zobrazuje \u0161trukt\u00faru, rozdelenie zdrojov medzi uzlami a \u010fal\u0161ie u\u017eito\u010dn\u00e9 inform\u00e1cie.<\/li>\n<li>Tu sa zobrazuje syst\u00e9mov\u00e9 monitorovanie z ka\u017edej virtu\u00e1lky klasteru. Tak\u00fdchto panelov m\u00f4\u017ee by\u0165 viac \u2014 ko\u013eko virtu\u00e1lok m\u00e1 klaster. Dva grafy <em>CPU Load<\/em> (v virtu\u00e1lkach po dva procesory), n\u00e1zov virtu\u00e1lky, <em>System Load<\/em> (naz\u00fdvan\u00fd ako Load Average, preto\u017ee je priemern\u00fd za 5, 10 a 15 min\u00fat), \u00fadaje o procesoch a rozdelenie pam\u00e4te.<\/li>\n<li>Trasovanie skriptu, ktor\u00fd vykon\u00e1va testovanie. V pr\u00edpade poruchy \u2014 n\u00e1hleho preru\u0161enia \u010dinnosti alebo nekone\u010dnej slu\u010dky \u010dakania \u2014 tu m\u00f4\u017eete vidie\u0165 pr\u00ed\u010dinu tohto spr\u00e1vania.<\/li>\n<\/ol>\n<p><\/p>\n<p>Testovanie sa vykon\u00e1va v dvoch etap\u00e1ch. Najprv skript prejde v\u0161etk\u00fdmi druhmi testov, n\u00e1hodne vyberaj\u00fac virtu\u00e1lku, na ktor\u00fa sa tento test aplikuje. Potom sa vykon\u00e1va nekone\u010dn\u00e1 slu\u010dka testovania, virtu\u00e1lky a poruchy sa ka\u017ed\u00fd raz vyberaj\u00fa n\u00e1hodne. N\u00e1hle ukon\u010denie testovacieho skriptu (doln\u00fd panel) alebo nekone\u010dn\u00e1 slu\u010dka \u010dakania na nie\u010do (&gt; 5 min\u00fat doba vykon\u00e1vania jednej oper\u00e1cie, to je vidite\u013en\u00e9 v trasovan\u00ed) nazna\u010duje, \u017ee niektor\u00fd z testov na tomto klastere zlyhal.<\/p>\n<p><\/p>\n<p>Ka\u017ed\u00fd test pozost\u00e1va z nasleduj\u00facich oper\u00e1ci\u00ed:<\/p>\n<p><\/p>\n<ol>\n<li>Spustenie funkcie, ktor\u00e1 simuluje poruchu.<\/li>\n<li><strong>Ready?<\/strong> \u2014 \u010dakanie na obnovenie funk\u010dnosti klasteru (ke\u010f s\u00fa poskytovan\u00e9 v\u0161etky slu\u017eby).<\/li>\n<li>Zobrazuje sa \u010das \u010dakania na obnovenie klasteru (<em>reaction<\/em>).<\/li>\n<li><strong>Fix<\/strong> \u2014 klaster sa \"opravia\". Po tom by sa mal vr\u00e1ti\u0165 do \u00faplne funk\u010dn\u00e9ho stavu a pripravenosti na \u010fal\u0161iu poruchu.<\/li>\n<\/ol>\n<p><\/p>\n<p>Tu je zoznam testov s popisom, \u010do robia:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: vytv\u00e1ra &quot;Out of memory&quot; pomocou fork bomb.<\/li>\n<li><strong>OutOfSpace<\/strong>: prepl\u0148uje disk. Test je v\u0161ak sk\u00f4r symbolick\u00fd, pri tej zanedbate\u013enej z\u00e1\u0165a\u017ei, ktor\u00e1 vznik\u00e1 pri testovan\u00ed, zlyhanie PostgreSQL pri preplnen\u00ed disku zvy\u010dajne nenast\u00e1va.<\/li>\n<li><strong>Postgres-KILL<\/strong>: zab\u00edja PostgreSQL pr\u00edkazom <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: pozastavuje PostgreSQL pr\u00edkazom <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \u201evyp\u00edna\u201c virtu\u00e1lny stroj pr\u00edkazom <code>VBoxManage controlvm &quot;virtu\u00e1lna ma\u0161ina&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: re\u0161tartuje virtu\u00e1lny stroj pr\u00edkazom <code>VBoxManage controlvm &quot;virtu\u00e1lna ma\u0161ina&quot; reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: pozastavuje d\u00e9mon SBD pr\u00edkazom <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: prostredn\u00edctvom SSH posiela na virtu\u00e1lny stroj pr\u00edkaz <code>systemctl poweroff<\/code>, syst\u00e9m korektne dokon\u010duje pr\u00e1cu.<\/li>\n<li><strong>UnLink<\/strong>: sie\u0165ov\u00e1 izol\u00e1cia, pr\u00edkaz <code>VBoxManage controlvm &quot;virtu\u00e1lna ma\u0161ina&quot; setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dokon\u010denie testovania bu\u010f pomocou \u0161tandardn\u00e9ho pr\u00edkazu tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, alebo pr\u00edkazu &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: v tomto pr\u00edpade testovanie kon\u010d\u00ed, tmux sa zatv\u00e1ra, virtu\u00e1lne stroje sa vyp\u00ednaj\u00fa.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Identifikovan\u00e9 probl\u00e9my po\u010das testovania<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>V s\u00fa\u010dasnosti <em>watchdog d\u00e9mon sbd<\/em> spravuje zastavenie pozorovan\u00fdch d\u00e9monov, ale nie ich zam\u0155zanie. A n\u00e1sledne, nespr\u00e1vne sa rie\u0161ia poruchy, ktor\u00e9 ved\u00fa k zam\u0155zaniu len <em>Corosync<\/em> a <em>Pacemaker<\/em>, ale pritom nezam\u0155zaj\u00fa <em>sbd<\/em>. Pre kontrolu <em>Corosync<\/em> u klienta <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> v GitHub <em>sbd<\/em>)<\/a><\/noindex>, akceptovan\u00e9 do vetvy <em>master<\/em>. S\u013e\u00fabili (v PR#83), \u017ee aj pre Pacemaker bude nie\u010do podobn\u00e9, d\u00fafam, \u017ee k <em>RedHat 8<\/em> to spravia. Ale tak\u00e9to \"poruchy\" s\u00fa teoretick\u00e9, \u013eahko sa imituj\u00fa umelo pomocou, napr\u00edklad, <code>killall -STOP corosync<\/code>, ale nikdy sa nevyskytuj\u00fa v re\u00e1lnom \u017eivote.<\/p>\n<p>\n<\/li>\n<li>\n<p>U <em>Pacemaker<\/em> v verzii pre <em>CentOS 7<\/em> nespr\u00e1vne nastaven\u00e9 <em>sync_timeout<\/em> u <em>quorum device<\/em>, v d\u00f4sledku \u010doho <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">pri zlyhan\u00ed jedn\u00e9ho uzla s ur\u010ditou pravdepodobnos\u0165ou sa re\u0161tartoval aj druh\u00fd uzol<\/a><\/noindex>, na ktor\u00fd mal prejs\u0165 master. Opraven\u00e9 zv\u00fd\u0161en\u00edm <em>sync_timeout<\/em> u <em>quorum device<\/em> po\u010das nasadzovania (v skripte <code>setup\/setup1<\/code>). T\u00e1to \u00faprava nebola prijat\u00e1 v\u00fdvoj\u00e1rmi <em>Pacemaker<\/em>, namiesto toho s\u013e\u00fabili prepracova\u0165 infra\u0161trukt\u00faru tak\u00fdm sp\u00f4sobom (v nejakom neur\u010ditom \u010dase), aby sa tento timeout vypo\u010d\u00edtaval automaticky.<\/p>\n<p>\n<\/li>\n<li>\n<p>Ak pri konfigur\u00e1cii datab\u00e1zy je uveden\u00e9, \u017ee v <code>LC_MESSAGES<\/code> (textov\u00e9 spr\u00e1vy) m\u00f4\u017ee by\u0165 pou\u017eit\u00fd Unicode, napr\u00edklad, <code>ru_RU.UTF-8<\/code>, tak pri spusten\u00ed <em>postgres<\/em> v prostred\u00ed, kde locale nie je UTF-8, povedzme v pr\u00e1zdnom prostred\u00ed (tu <em>pacemaker<\/em>+<em>pgsqlms<\/em>(paf) sp\u00fa\u0161\u0165a <em>postgres<\/em>), potom <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">v logu namiesto p\u00edsmen UTF-8 bud\u00fa znaky ot\u00e1zok<\/a><\/noindex>. V\u00fdvoj\u00e1ri PostgreSQL sa dodnes nedohodli, \u010do s t\u00fdm robi\u0165. Tento probl\u00e9m sa obch\u00e1dza, treba nastavi\u0165 <code>LC_MESSAGES=en_US.UTF-8<\/code> pri konfigur\u00e1cii (vytv\u00e1ran\u00ed) in\u0161tancie DB.<\/p>\n<p>\n<\/li>\n<li>\n<p>Ak je nastaven\u00fd wal_receiver_timeout (predvolene 60 sek\u00fand), pri teste PostgreSQL-STOP na masteri v klastroch tuchanka3 a tuchanka4 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">nedoch\u00e1dza k op\u00e4tovn\u00e9mu pripojeniu replik\u00e1cie k nov\u00e9mu masteru<\/a><\/noindex>. Replik\u00e1cia je tam synchronn\u00e1, tak\u017ee sa zastav\u00ed nielen pracovn\u00edk, ale aj nov\u00fd master. Rie\u0161en\u00edm je nastavi\u0165 wal_receiver_timeout=0 pri konfigur\u00e1cii PostgreSQL.<\/p>\n<p>\n<\/li>\n<li>\n<p>Pr\u00edle\u017eitostne som pozoroval zadr\u017eiavanie replik\u00e1cie v PostgreSQL pri teste ForkBomb (preplnenie pam\u00e4te). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Po ForkBomb niekedy roboty nemusia op\u00e4tovne nadviaza\u0165 spojenie s nov\u00fdm masterom<\/a><\/noindex>. Tak\u00e9to situ\u00e1cie som za\u017eil len v klastroch tuchanka3 a tuchanka4, kde kv\u00f4li synchronnej replik\u00e1cii zadr\u017eiaval master. Probl\u00e9m sa s\u00e1m vyrie\u0161il po dlh\u0161om \u010dase (pribli\u017ene dve hodiny). Potrebn\u00e9 je \u010fal\u0161ie presk\u00famanie, aby sa to napravil. Pod\u013ea sympt\u00f3mov to pripom\u00edna predch\u00e1dzaj\u00facu chybu vyvolan\u00fa inou pr\u00ed\u010dinou, ale s rovnak\u00fdmi n\u00e1sledkami.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Obr\u00e1zok kroganov je prevzat\u00fd z <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> s povolen\u00edm autora:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelovanie odoln\u00fdch klastrov zalo\u017een\u00fdch na PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/ded1ead387814d97d84d0fb89e025386.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Zdroj: <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\/sk\/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=\"sk_SK\" \/>\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\/sk\/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\udd47Modelovanie chybovzdorn\u00fdch klastrov na b\u00e1ze PostgreSQL a Pacemaker | ProHoster","description":"\u00davod Pred nejak\u00fdm \u010dasom sa mi dostala \u00faloha vyvin\u00fa\u0165 chybovzdorn\u00fd klaster pre PostgreSQL.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}