{"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\/cs\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi PostgreSQL a Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">\u00davod<\/h1>\n<p><\/p>\n<p>N\u011bjakou dobu zp\u011bt jsem dostal \u00fakol vyvinout vysoce dostupn\u00fd klastr pro <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, funguj\u00edc\u00ed ve v\u00edce datov\u00fdch centrech, propojen\u00fdch optick\u00fdmi vl\u00e1kny v r\u00e1mci jednoho m\u011bsta, a schopn\u00fd odolat v\u00fdpadku (nap\u0159\u00edklad v\u00fdpadku nap\u00e1jen\u00ed) jednoho datov\u00e9ho centra. Jako software, kter\u00fd zaji\u0161\u0165uje vysokou dostupnost, jsem zvolil <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, proto\u017ee je to ofici\u00e1ln\u00ed \u0159e\u0161en\u00ed od RedHat pro vytv\u00e1\u0159en\u00ed vysoce dostupn\u00fdch klastr\u016f. Je v\u00fdhodn\u00e9, \u017ee RedHat zaji\u0161\u0165uje jeho podporu, a \u017ee toto \u0159e\u0161en\u00ed je univerz\u00e1ln\u00ed (modul\u00e1rn\u00ed). S jeho pomoc\u00ed je mo\u017en\u00e9 zajistit vysokou dostupnost nejen pro PostgreSQL, ale i pro dal\u0161\u00ed slu\u017eby, bu\u010f pomoc\u00ed standardn\u00edch modul\u016f, nebo jejich vytvo\u0159en\u00edm na m\u00edru.<\/p>\n<p><\/p>\n<p>K tomu se objevila rozumn\u00e1 ot\u00e1zka: jak moc bude vysoce dostupn\u00fd klastr skute\u010dn\u011b odoln\u00fd? Abych to prozkoumal, vytvo\u0159il jsem testovac\u00ed stanici, kter\u00e1 simuluje r\u016fzn\u00e9 v\u00fdpadky na uzlech klastru, \u010dek\u00e1 na obnoven\u00ed funk\u010dnosti, obnovuje selh\u00e1vaj\u00edc\u00ed uzel a pokra\u010duje v testov\u00e1n\u00ed v cyklu. Tento projekt byl p\u016fvodn\u011b nazv\u00e1n hapgsql, ale \u010dasem m\u011b omrzelo jm\u00e9no, kter\u00e9 m\u00e1 jen jednu samohl\u00e1sku. Proto jsem za\u010dal naz\u00fdvat vysoce dostupn\u00e9 datab\u00e1ze (a float IP, kter\u00e9 na n\u011b ukazuj\u00ed) <strong>krogan<\/strong> (postava z po\u010d\u00edta\u010dov\u00e9 hry, jej\u00ed\u017e v\u0161echny d\u016fle\u017eit\u00e9 org\u00e1ny jsou replikov\u00e1ny), a uzly, klastry a samotn\u00fd projekt \u2014 <strong>tuchanka<\/strong> (planeta, kde \u017eij\u00ed krogani).<\/p>\n<p><\/p>\n<p>Nyn\u00ed veden\u00ed povolilo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">otev\u0159\u00edt projekt pro open source komunitu pod licenc\u00ed MIT<\/a><\/noindex>. README bude brzy p\u0159elo\u017eeno do angli\u010dtiny (proto\u017ee se o\u010dek\u00e1v\u00e1, \u017ee hlavn\u00edmi u\u017eivateli budou v\u00fdvoj\u00e1\u0159i Pacemaker a PostgreSQL), a starou ruskou verzi README jsem se rozhodl zpracovat (\u010d\u00e1ste\u010dn\u011b) ve form\u011b tohoto \u010dl\u00e1nku.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi 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>Klastury se implementuj\u00ed na virtu\u00e1ln\u00edch stroj\u00edch <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. Celkem bude nasazeno 12 virtu\u00e1ln\u00edch stroj\u016f (celkem 36GiB), kter\u00e9 tvo\u0159\u00ed 4 vysoce dostupn\u00e9 klastry (r\u016fzn\u00e9 varianty). Prvn\u00ed dva klastry se skl\u00e1daj\u00ed ze dvou server\u016f PostgreSQL, kter\u00e9 jsou um\u00edst\u011bny v r\u016fzn\u00fdch datov\u00fdch centrech, a jednoho spole\u010dn\u00e9ho serveru <em>witness<\/em> s <strong>quorum device<\/strong> (um\u00edst\u011bn\u00e9ho na levn\u00e9m virtu\u00e1ln\u00edm stroji ve t\u0159et\u00edm datov\u00e9m centru), kter\u00fd \u0159e\u0161\u00ed neur\u010ditost <strong>50%\/50%<\/strong>, d\u00e1v\u00e1 sv\u016fj hlas jedn\u00e9 ze stran. T\u0159et\u00ed klastr je ve t\u0159ech datov\u00fdch centrech: jeden master, dva slave, bez <strong>quorum device<\/strong>. \u010ctvrt\u00fd klastr se skl\u00e1d\u00e1 ze \u010dty\u0159 server\u016f PostgreSQL, po dvou v datacentru: jeden master a ostatn\u00ed repliky, a tak\u00e9 pou\u017e\u00edv\u00e1 <em>witness<\/em> s <strong>quorum device<\/strong>. \u010ctvrt\u00fd zvl\u00e1dne selh\u00e1n\u00ed dvou server\u016f nebo jednoho datacentra. Toto \u0159e\u0161en\u00ed m\u016f\u017ee b\u00fdt v p\u0159\u00edpad\u011b pot\u0159eby \u0161k\u00e1lov\u00e1no na v\u011bt\u0161\u00ed po\u010det replik.<\/p>\n<p><\/p>\n<p>Slu\u017eba p\u0159esn\u00e9ho \u010dasu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> tak\u00e9 je p\u0159econfugurov\u00e1n pro odolnost, ale pou\u017e\u00edv\u00e1 metodu takzvan\u00e9ho <code>ntpd<\/code> (<em>orphan mode<\/em>). Hlavn\u00ed server <em>witness<\/em> pln\u00ed roli centr\u00e1ln\u00edho NTP serveru, kter\u00fd rozd\u00e1v\u00e1 sv\u016fj \u010das v\u0161em klastr\u016fm a t\u00edm synchronizuje v\u0161echny servery mezi sebou. Pokud <em>witness<\/em> se porouch\u00e1 nebo bude izolov\u00e1n, jeden z server\u016f klastru za\u010dne distribuovat sv\u016fj \u010das (uvnit\u0159 klastru). Pomocn\u00fd cachingov\u00fd <strong>HTTP proxy<\/strong> tak\u00e9 je nasazen na <em>witness<\/em>, pomoc\u00ed n\u011bho\u017e maj\u00ed ostatn\u00ed virtu\u00e1ln\u00ed stroje p\u0159\u00edstup k Yum repozit\u00e1\u0159\u016fm. Ve skute\u010dnosti budou takov\u00e9 slu\u017eby, jako p\u0159esn\u00fd \u010das a proxy, pravd\u011bpodobn\u011b um\u00edst\u011bny na vyhrazen\u00fdch serverech, zat\u00edmco v testovac\u00edm prost\u0159ed\u00ed jsou um\u00edst\u011bny na <em>witness<\/em> pouze pro \u00fasporu po\u010dtu virtu\u00e1ln\u00edch stroj\u016f a m\u00edsta.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Verze<\/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\">Struktura klastr\u016f<\/h1>\n<p><\/p>\n<p>V\u0161echny klastry jsou ur\u010deny pro um\u00edst\u011bn\u00ed v n\u011bkolika datacentrech, spojeny do jedn\u00e9 ploch\u00e9 s\u00edt\u011b a m\u011bly by odol\u00e1vat selh\u00e1n\u00ed nebo s\u00ed\u0165ov\u00e9 izolaci jednoho datacentra. Proto <strong>nemo\u017en\u00e9<\/strong> je nutn\u00e9 pou\u017e\u00edt pro ochranu p\u0159ed <strong>split-brain<\/strong> standardn\u00ed technologii Pacemaker, kter\u00e1 se naz\u00fdv\u00e1 <em>STONITH<\/em> (Shoot The Other Node In The Head) nebo <em>fencing<\/em>. Jej\u00ed podstata: pokud uzly v klastru za\u010dnou m\u00edt podez\u0159en\u00ed, \u017ee s n\u011bjak\u00fdm uzlem je n\u011bco v nepo\u0159\u00e1dku, neodpov\u00edd\u00e1 nebo se chov\u00e1 nespr\u00e1vn\u011b, vynut\u00ed si jeho odpojen\u00ed pomoc\u00ed \"vn\u011bj\u0161\u00edch\" za\u0159\u00edzen\u00ed, jako nap\u0159\u00edklad \u0159\u00eddic\u00ed karta IPMI nebo UPS. Ale to bude fungovat pouze v p\u0159\u00edpadech, kdy p\u0159i jednostrann\u00e9m selh\u00e1n\u00ed serveru IPMI nebo UPS nad\u00e1le funguj\u00ed. Zde je pl\u00e1nov\u00e1na ochrana proti mnohem katastrof\u00e1ln\u011bj\u0161\u00edmu selh\u00e1n\u00ed, kdy sel\u017ee (nap\u0159\u00edklad se odpoj\u00ed od proudu) cel\u00e9 datacentrum. A p\u0159i takov\u00e9m selh\u00e1n\u00ed v\u0161echna <em>stonith<\/em>-za\u0159\u00edzen\u00ed (IPMI, UPS atd.) tak\u00e9 nebudou fungovat.<\/p>\n<p><\/p>\n<p>M\u00edsto toho je z\u00e1kladem syst\u00e9mu my\u0161lenka kv\u00f3ra. V\u0161echny uzly maj\u00ed hlas a pracovat mohou pouze ty, kter\u00e9 vid\u00ed v\u00edce ne\u017e polovinu v\u0161ech uzl\u016f. Toto mno\u017estv\u00ed \"polovina + 1\" se naz\u00fdv\u00e1 <strong>kv\u00f3rum<\/strong>. Pokud kv\u00f3rum nen\u00ed dosa\u017eeno, uzel rozhodne, \u017ee se nach\u00e1z\u00ed v s\u00ed\u0165ov\u00e9 izolaci a mus\u00ed odpojit sv\u00e9 zdroje, tj. to je takov\u00e1 <strong>ochrana p\u0159ed split-brain<\/strong>. Pokud software, kter\u00fd za takov\u00e9 chov\u00e1n\u00ed odpov\u00edd\u00e1, nefunguje, m\u011bl by se spustit watchdog, nap\u0159\u00edklad na b\u00e1zi IPMI.<\/p>\n<p><\/p>\n<p>Pokud je po\u010det uzl\u016f sud\u00fd (klastr ve dvou datov\u00fdch centrech), m\u016f\u017ee nastat takzvan\u00e1 neur\u010ditost <strong>50%\/50%<\/strong> (<em>pades\u00e1t na pades\u00e1t<\/em>), kdy s\u00ed\u0165ov\u00e1 izolace d\u011bl\u00ed klastr p\u0159esn\u011b na polovinu. Proto se pro sud\u00fd po\u010det uzl\u016f p\u0159id\u00e1v\u00e1 <strong>quorum device<\/strong> \u2014 nen\u00e1ro\u010dn\u00fd d\u00e9mon, kter\u00fd m\u016f\u017ee b\u00fdt spu\u0161t\u011bn na nejlevn\u011bj\u0161\u00edm virtu\u00e1ln\u00edm stroji ve t\u0159et\u00edm datov\u00e9m centru. D\u00e1v\u00e1 sv\u016fj hlas jednomu ze segment\u016f (kter\u00fd vid\u00ed), a t\u00edm roz\u0159e\u0161\u00ed neur\u010ditost 50%\/50%. Server, na kter\u00e9m bude spu\u0161t\u011bn quorum device, jsem nazval <em>witness<\/em> (terminologie z repmgr, l\u00edb\u00ed se mi).<\/p>\n<p><\/p>\n<p>Zdroje mohou p\u0159ech\u00e1zet z m\u00edsta na m\u00edsto, nap\u0159\u00edklad z nefunk\u010dn\u00edch server\u016f na funk\u010dn\u00ed, nebo na p\u0159\u00edkaz administr\u00e1tor\u016f. Aby klienti v\u011bd\u011bli, kde se nach\u00e1zej\u00ed pot\u0159ebn\u00e9 zdroje (kam se p\u0159ipojit?), pou\u017e\u00edvaj\u00ed se <em>plovouc\u00ed IP<\/em> (<strong>float IP<\/strong>). To jsou IP, kter\u00e9 Pacemaker m\u016f\u017ee p\u0159esouvat mezi uzly (v\u0161echno se nach\u00e1z\u00ed v ploch\u00e9 s\u00edti). Ka\u017ed\u00e1 z nich symbolizuje zdroj (slu\u017ebu) a bude se nach\u00e1zet tam, kam je t\u0159eba se p\u0159ipojit, abyste z\u00edskali p\u0159\u00edstup k t\u00e9to slu\u017eb\u011b (v na\u0161em p\u0159\u00edpad\u011b k DB).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (sch\u00e9ma s t\u011bsn\u011bn\u00edm)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Struktura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>My\u0161lenka byla v tom, \u017ee m\u00e1me mnoho mal\u00fdch datab\u00e1z\u00ed s n\u00edzkou z\u00e1t\u011b\u017e\u00ed, pro kter\u00e9 nen\u00ed v\u00fdhodn\u00e9 udr\u017eovat vyhrazen\u00fd slave server v re\u017eimu hot standby pro read only transakce (nen\u00ed t\u0159eba takov\u00e9ho pl\u00fdtv\u00e1n\u00ed zdroji).<\/p>\n<p><\/p>\n<p>V ka\u017ed\u00e9m datov\u00e9m centru je jeden server. Na ka\u017ed\u00e9m serveru jsou dv\u011b instance PostgreSQL (v terminologii PostgreSQL se naz\u00fdvaj\u00ed klastr, ale abych p\u0159ede\u0161el z\u00e1m\u011bn\u011b, budu je naz\u00fdvat instancemi (podobn\u011b jako u dal\u0161\u00edch DB), a klastr ozna\u010d\u00edm pouze pro klastry Pacemaker). Jedna instance funguje v re\u017eimu master a pouze ona poskytuje slu\u017eby (pouze na n\u00ed sm\u011b\u0159uje float IP). Druh\u00e1 instance funguje jako slave pro druh\u00e9 datov\u00e9 centrum a slu\u017eby poskytne pouze tehdy, pokud jej\u00ed master sel\u017ee. Proto\u017ee v\u011bt\u0161inu \u010dasu poskytuje slu\u017eby (prov\u00e1d\u00ed dotazy) pouze jedna z obou instanc\u00ed (master), jsou v\u0161echny zdroje serveru optimalizov\u00e1ny na master (vy\u010dle\u0148uje se pam\u011b\u0165 pro cache shared_buffers atd.), ale tak, aby i na druhou instanci zb\u00fdvalo dostatek zdroj\u016f (i pro suboptim\u00e1ln\u00ed funkci p\u0159es cache souborov\u00e9ho syst\u00e9mu) pro p\u0159\u00edpad selh\u00e1n\u00ed jednoho z datov\u00fdch center. Slave neposkytuje slu\u017eby (neprov\u00e1d\u00ed read only dotazy) p\u0159i norm\u00e1ln\u00edm chodu klastru, aby nedoch\u00e1zelo k boji o zdroje s masterem na t\u00e9\u017ee ma\u0161in\u011b.<\/p>\n<p><\/p>\n<p>V p\u0159\u00edpad\u011b dvou uzl\u016f je dostupnost mo\u017en\u00e1 pouze p\u0159i asynchronn\u00ed replikaci, proto\u017ee p\u0159i synchronn\u00ed selh\u00e1n\u00ed slava dojde k zastaven\u00ed mastera.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Selh\u00e1n\u00ed witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selh\u00e1n\u00ed witness (<em>quorum device<\/em>) se budu zab\u00fdvat pouze u klastru Tuchanka1, u v\u0161ech ostatn\u00edch bude stejn\u00fd p\u0159\u00edb\u011bh. P\u0159i selh\u00e1n\u00ed witness ve struktu\u0159e klastru se nic nezm\u011bn\u00ed, v\u0161echno bude fungovat tak, jak fungovalo. Ale kvorum se stane 2 z 3, a proto jak\u00e9koliv dal\u0161\u00ed selh\u00e1n\u00ed se stane fat\u00e1ln\u00ed pro klastr. Budeme muset urgentn\u011b opravit.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Selh\u00e1n\u00ed Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selh\u00e1n\u00ed jednoho z datov\u00fdch center pro Tuchanka1. V tomto p\u0159\u00edpad\u011b <em>witness<\/em> dod\u00e1v\u00e1 sv\u016fj hlas druh\u00e9mu uzlu ve druh\u00e9m datov\u00e9m centru. Tam se b\u00fdval\u00fd slave m\u011bn\u00ed na mastera, tak\u017ee na jednom serveru pracuj\u00ed oba masterov\u00e9 a na n\u011b sm\u011b\u0159uj\u00ed oba jejich float IP.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka2-klassicheskaya\">Tuchanka2 (klasick\u00e1)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-1\">Struktura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi 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 ze dvou uzl\u016f. Na jednom b\u011b\u017e\u00ed master, na druh\u00e9m slave. Oba mohou prov\u00e1d\u011bt dotazy (slave pouze read only), proto na obou sm\u011b\u0159uj\u00ed float IP: krogan2 \u2014 na mastera, krogan2s1 \u2014 na slava. Dostupnost bude jak u mastera, tak u slava.<\/p>\n<p><\/p>\n<p>V p\u0159\u00edpad\u011b dvou uzl\u016f je dostupnost mo\u017en\u00e1 pouze p\u0159i asynchronn\u00ed replikaci, proto\u017ee p\u0159i synchronn\u00ed selh\u00e1n\u00ed slava dojde k zastaven\u00ed mastera.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Selh\u00e1n\u00ed Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0159i selh\u00e1n\u00ed jednoho z datov\u00fdch center <em>witness<\/em> hlasuje pro druh\u00fd. Na jedin\u00e9m funk\u010dn\u00edm datov\u00e9m centru bude spu\u0161t\u011bn master a na n\u011bj budou ukazovat oba float IP: master a slave. Samoz\u0159ejm\u011b, instance mus\u00ed b\u00fdt nakonfigurov\u00e1na tak, aby m\u011bla dostatek zdroj\u016f (limit\u016f p\u0159ipojen\u00ed atd.) pro sou\u010dasn\u00e9 zpracov\u00e1n\u00ed v\u0161ech p\u0159ipojen\u00ed a po\u017eadavk\u016f jak od master, tak od slave float IP. To znamen\u00e1, \u017ee p\u0159i norm\u00e1ln\u00edm fungov\u00e1n\u00ed by m\u011bla m\u00edt dostate\u010dnou rezervu limit\u016f.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (mnoho otrok\u016f)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Struktura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi 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 jin\u00fd extr\u00e9m. Existuj\u00ed DB, na kter\u00e9 sm\u011b\u0159uje velmi mnoho read-only dotaz\u016f (typick\u00fd p\u0159\u00edpad vysoce zat\u00ed\u017een\u00e9 str\u00e1nky). Tuchanka4 \u2014 to je situace, kdy m\u016f\u017ee b\u00fdt t\u0159i nebo v\u00edce otrok\u016f pro zpracov\u00e1n\u00ed takov\u00fdch dotaz\u016f, ale p\u0159esto ne p\u0159\u00edli\u0161 mnoho. P\u0159i velmi velk\u00e9m po\u010dtu otrok\u016f bude t\u0159eba vymyslet hierarchick\u00fd syst\u00e9m replikace. V minim\u00e1ln\u00edm p\u0159\u00edpad\u011b (na obr\u00e1zku) se v ka\u017ed\u00e9m ze dvou datov\u00fdch center nach\u00e1z\u00ed dva servery, na ka\u017ed\u00e9m z nich s jednou instanc\u00ed PostgreSQL.<\/p>\n<p><\/p>\n<p>Dal\u0161\u00ed zvl\u00e1\u0161tnost\u00ed tohoto sch\u00e9matu je, \u017ee zde ji\u017e m\u016f\u017eeme zorganizovat jednu synchronn\u00ed replikaci. Je nastavena tak, aby replikovala, pokud mo\u017eno, do jin\u00e9ho datov\u00e9ho centra a ne na replikaci ve stejn\u00e9m datov\u00e9m centru, kde je i master. Na master a na ka\u017ed\u00fd slave ukazuje float IP. Opr\u00e1vn\u011bn\u011b, mezi otroky bude t\u0159eba prov\u00e1d\u011bt vyva\u017eov\u00e1n\u00ed dotaz\u016f n\u011bjak\u00fdm <em>sql proxy<\/em>, nap\u0159\u00edklad, na stran\u011b klienta. R\u016fzn\u00e9mu typu klient\u016f m\u016f\u017ee b\u00fdt pot\u0159eba r\u016fzn\u00fd typ <em>sql proxy<\/em>, a pouze v\u00fdvoj\u00e1\u0159i klient\u016f v\u011bd\u00ed, kdo jak\u00fd pot\u0159ebuje. Tato funk\u010dnost m\u016f\u017ee b\u00fdt realizov\u00e1na jak extern\u00edm d\u00e9monem, tak knihovnou klienta (connection pool), atd. V\u0161e toto p\u0159esahuje r\u00e1mec t\u00e9matu dostupn\u00e9ho datab\u00e1zov\u00e9ho clustera (dostupnost <em>SQL proxy<\/em> bude mo\u017en\u00e9 realizovat nez\u00e1visle, spolu s dostupnost\u00ed klienta).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Selh\u00e1n\u00ed Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0159i selh\u00e1n\u00ed jednoho datov\u00e9ho centra (tj. dvou server\u016f) sv\u011bdek hlasuje pro druh\u00fd. V d\u016fsledku toho ve druh\u00e9m datov\u00e9m centru pracuj\u00ed dva servery: na jednom b\u011b\u017e\u00ed master, a na n\u011bj ukazuje master float IP (pro p\u0159\u00edjem read-write dotaz\u016f); a na druh\u00e9m serveru b\u011b\u017e\u00ed slave se synchronn\u00ed replikac\u00ed, a na n\u011bj ukazuje jeden z otrock\u00fdch float IP (pro read-only dotazy).<\/p>\n<p><\/p>\n<p>Prvn\u00ed, co je t\u0159eba poznamenat: pracovn\u00ed otrock\u00fd float IP nebude pro v\u0161echny, ale pouze pro jeden. A pro spr\u00e1vnou funkci s n\u00edm bude t\u0159eba, aby <em>sql proxy<\/em> p\u0159esm\u011broval v\u0161echny po\u017eadavky na jedinou zb\u00fdvaj\u00edc\u00ed float IP; a pokud <em>sql proxy<\/em> ne, je mo\u017en\u00e9 uv\u00e9st v\u0161echny float IP slave odd\u011blen\u00e9 \u010d\u00e1rkou v URL pro p\u0159ipojen\u00ed. V takov\u00e9m p\u0159\u00edpad\u011b bude <em>libpq<\/em> p\u0159ipojen\u00ed provedeno k prvn\u00edmu pracovn\u00edm IP, jak je to nastaveno v syst\u00e9mu automatick\u00e9ho testov\u00e1n\u00ed. Mo\u017en\u00e1, \u017ee v jin\u00fdch knihovn\u00e1ch, jako je JDBC, to tak fungovat nebude a bude pot\u0159ebn\u00e9 <em>sql proxy<\/em>. Je to tak ud\u011bl\u00e1no, proto\u017ee pro slave float IP je nastavena prohibice na sou\u010dasn\u00e9 zv\u00fd\u0161en\u00ed na jednom serveru, aby se rovnom\u011brn\u011b rozlo\u017eily na slave servery, pokud jich pracuje n\u011bkolik.<\/p>\n<p><\/p>\n<p>Druh\u00e9: i v p\u0159\u00edpad\u011b selh\u00e1n\u00ed datacentra bude zachov\u00e1na synchronn\u00ed replikace. A i kdy\u017e dojde ke sekund\u00e1rn\u00edmu selh\u00e1n\u00ed, tedy kdy\u017e v zb\u00fdvaj\u00edc\u00edm datacentru sel\u017ee jeden ze dvou server\u016f, cluster sice p\u0159estane poskytovat slu\u017eby, ale i tak si uchov\u00e1 informace o v\u0161ech potvrzen\u00fdch transakc\u00edch, na kter\u00e9 poskytl potvrzen\u00ed o commitu (nebude doch\u00e1zet ke ztr\u00e1t\u011b informac\u00ed p\u0159i sekund\u00e1rn\u00edm selh\u00e1n\u00ed).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 datacentra)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Struktura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To je cluster pro situaci, kdy jsou t\u0159i pln\u011b funguj\u00edc\u00ed datacentra, v ka\u017ed\u00e9m z nich\u017e je pln\u011b funk\u010dn\u00ed datab\u00e1zov\u00fd server. V tomto p\u0159\u00edpad\u011b <em>quorum device<\/em> nen\u00ed pot\u0159eba. V jednom datacentru pracuje master, v dvou dal\u0161\u00edch \u2014 slaves. Replikace je synchronn\u00ed, typu ANY (slave1, slave2), tedy klientovi p\u0159ijde potvrzen\u00ed commitu, kdy\u017e jak\u00fdkoli ze slave prvn\u00edch odpov\u00ed, \u017ee p\u0159ijal commit. Na zdroje ukazuje jeden float IP pro mastera a dva pro slaves. Na rozd\u00edl od Tuchanka4 jsou v\u0161echny t\u0159i float IP odoln\u00e9 v\u016f\u010di v\u00fdpadk\u016fm. Pro vyva\u017eov\u00e1n\u00ed read-only SQL dotaz\u016f lze pou\u017e\u00edt <em>sql proxy<\/em> (s individu\u00e1ln\u00ed odolnost\u00ed v\u016f\u010di v\u00fdpadk\u016fm), nebo prvn\u00ed polovin\u011b klient\u016f p\u0159id\u011blit jeden slave float IP a druh\u00e9 polovin\u011b \u2014 druh\u00fd.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Selh\u00e1n\u00ed Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi PostgreSQL a Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0159i selh\u00e1n\u00ed jednoho datacentra z\u016fstanou dv\u011b. V jednom je master a float IP od mastera, ve druh\u00e9m \u2014 slave a oba slave float IP (na instance mus\u00ed b\u00fdt dvojn\u00e1sobek zdroj\u016f, aby p\u0159ijal v\u0161echna p\u0159ipojen\u00ed z obou slave float IP). Mezi masterem a slaven prob\u00edh\u00e1 synchronn\u00ed replikace. Tak\u00e9 cluster uchov\u00e1 informace o potvrzen\u00fdch a schv\u00e1len\u00fdch transakc\u00edch (nebude doch\u00e1zet ke ztr\u00e1t\u011b informac\u00ed) v p\u0159\u00edpad\u011b zni\u010den\u00ed dvou datacenter (pokud nebyla zni\u010dena sou\u010dasn\u011b).<\/p>\n<p><\/p>\n<p><em>Podrobn\u00fd popis souborov\u00e9 struktury a nasazen\u00ed jsem se rozhodl nezahrnout. Kdo se chce zab\u00fdvat detaily, m\u016f\u017ee si to p\u0159e\u010d\u00edst v README. Uv\u00e1d\u00edm pouze popis automatick\u00e9ho testov\u00e1n\u00ed.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Syst\u00e9m automatick\u00e9ho testov\u00e1n\u00ed<\/h1>\n<p><\/p>\n<p>Pro ov\u011b\u0159en\u00ed odolnosti klastr\u016f s simulac\u00ed r\u016fzn\u00fdch poruch byl vytvo\u0159en syst\u00e9m automatick\u00e9ho testov\u00e1n\u00ed. Spou\u0161t\u00ed se skriptem <code>test\/failure<\/code>. Skript m\u016f\u017ee p\u0159ij\u00edmat jako parametry \u010d\u00edsla klastr\u016f, kter\u00e9 chcete testovat. Nap\u0159\u00edklad tento p\u0159\u00edkaz:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>bude testovat pouze druh\u00fd a t\u0159et\u00ed klastr. Pokud parametry nejsou uvedeny, budou testov\u00e1ny v\u0161echny klastry. V\u0161echny klastry se testuj\u00ed paraleln\u011b a v\u00fdsledek se zobrazuje na panelu tmux. Tmux pou\u017e\u00edv\u00e1 vyhrazen\u00fd tmux server, tak\u017ee skript lze spustit z b\u011b\u017en\u00e9ho tmux, co\u017e vytvo\u0159\u00ed vno\u0159en\u00fd tmux. Doporu\u010duji pou\u017e\u00edvat termin\u00e1l v \u0161irok\u00e9m okn\u011b a s mal\u00fdm p\u00edsmem. P\u0159ed zah\u00e1jen\u00edm testov\u00e1n\u00ed se v\u0161echny virtu\u00e1ln\u00ed stroje vr\u00e1t\u00ed na sn\u00edmek na okam\u017eik dokon\u010den\u00ed skriptu. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi 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 rozd\u011blen na sloupce podle po\u010dtu testovan\u00fdch klastr\u016f, defaultn\u011b (na screenshotu) jich je \u010dty\u0159icet. Obsah sloupc\u016f pop\u00ed\u0161u na p\u0159\u00edkladu Tuchanka2. Panely na screenshotu jsou o\u010d\u00edslov\u00e1ny:<\/p>\n<p><\/p>\n<ol>\n<li>Zde se zobrazuje statistika test\u016f. Sloupce:\n<ul>\n<li><strong>failure<\/strong> \u2014 n\u00e1zev testu (funkce ve skriptu), kter\u00fd simuluje poruchu.<\/li>\n<li><strong>reaction<\/strong> \u2014 pr\u016fm\u011brn\u00e1 doba v sekund\u00e1ch, za kterou klastr obnovil svou funk\u010dnost. M\u011b\u0159eno od za\u010d\u00e1tku b\u011bhu skriptu, kter\u00fd simuluje poruchu, a\u017e do okam\u017eiku, kdy klastr obnovuje svou funk\u010dnost a je schopen pokra\u010dovat v poskytov\u00e1n\u00ed slu\u017eeb. Pokud je \u010das velmi kr\u00e1tk\u00fd, nap\u0159\u00edklad \u0161est sekund (to se st\u00e1v\u00e1 u klastr\u016f s n\u011bkolika otroky (Tuchanka3 a Tuchanka4)), znamen\u00e1 to, \u017ee porucha byla na asynchronn\u00edm otroku a nijak neovlivnila funk\u010dnost, nebyly \u017e\u00e1dn\u00e9 p\u0159ep\u00edn\u00e1n\u00ed stavu klastru.<\/li>\n<li><strong>deviation<\/strong> \u2014 ukazuje rozptyl (p\u0159esnost) hodnoty <strong>reaction<\/strong> metodou \u201estandardn\u00ed odchylka\u201c.<\/li>\n<li><strong>count<\/strong> \u2014 kolikr\u00e1t byl tento test proveden.<\/li>\n<\/ul>\n<\/li>\n<li>Kr\u00e1tk\u00fd den\u00edk umo\u017e\u0148uje posoudit, \u010demu se klastr v aktu\u00e1ln\u00edm okam\u017eiku v\u011bnuje. Zobrazuje \u010d\u00edslo iterace (testu), \u010dasovou zna\u010dku a n\u00e1zev operace. P\u0159\u00edli\u0161 dlouh\u00e9 prov\u00e1d\u011bn\u00ed (&gt; 5 minut) nazna\u010duje n\u011bjak\u00fd probl\u00e9m.<\/li>\n<li><strong>heart<\/strong> (srdce) \u2014 aktu\u00e1ln\u00ed \u010das. Pro vizu\u00e1ln\u00ed hodnocen\u00ed funk\u010dnosti <em>mist\u0159i<\/em> do jeho tabulky se neust\u00e1le zapisuje aktu\u00e1ln\u00ed \u010das s pou\u017eit\u00edm float IP mistra. V p\u0159\u00edpad\u011b \u00fasp\u011bchu se v\u00fdsledek zobrazuje v t\u00e9to panelu.<\/li>\n<li><strong>beat<\/strong> (pulz) \u2014 \u201eaktu\u00e1ln\u00ed \u010das\u201c, kter\u00fd byl d\u0159\u00edve zaznamen\u00e1n skriptem <strong>heart<\/strong> do mistra, nyn\u00ed se \u010dte z <em>otrok<\/em> p\u0159es jeho float IP. Umo\u017e\u0148uje vizu\u00e1ln\u011b hodnotit funk\u010dnost otroka a replikace. V Tuchanka1 nejsou otroci s float IP (\u017e\u00e1dn\u00ed otroci neposkytuj\u00edc\u00ed slu\u017eby), ale jsou tam dv\u011b instance (DB), proto zde nebude zobrazov\u00e1no <strong>beat<\/strong>, a <strong>heart<\/strong> druh\u00e9 instance.<\/li>\n<li>Monitorov\u00e1n\u00ed stavu clusteru pomoc\u00ed utilitky <code>pcs mon<\/code>. Zobrazuje strukturu, rozlo\u017een\u00ed zdroj\u016f mezi uzly a dal\u0161\u00ed u\u017eite\u010dn\u00e9 informace.<\/li>\n<li>Zde se zobrazuje syst\u00e9mov\u00e9 monitorov\u00e1n\u00ed z ka\u017ed\u00e9 virtu\u00e1lky clusteru. Takov\u00fdch panel\u016f m\u016f\u017ee b\u00fdt v\u00edce \u2014 kolik virtu\u00e1lek je v clusteru. Dva grafy <em>Z\u00e1t\u011b\u017e CPU<\/em> (ve virtu\u00e1lk\u00e1ch jsou dva procesory), n\u00e1zev virtu\u00e1lky, <em>Z\u00e1t\u011b\u017e syst\u00e9mu<\/em> (pojmenov\u00e1no jako Load Average, proto\u017ee je pr\u016fm\u011brov\u00e1no za 5, 10 a 15 minut), data dle proces\u016f a rozlo\u017een\u00ed pam\u011bti.<\/li>\n<li>Sledov\u00e1n\u00ed skriptu prov\u00e1d\u011bj\u00edc\u00edho testov\u00e1n\u00ed. V p\u0159\u00edpad\u011b z\u00e1vady \u2014 n\u00e1hl\u00e9ho p\u0159eru\u0161en\u00ed \u010dinnosti nebo nekone\u010dn\u00e9 \u010dekac\u00ed smy\u010dky \u2014 zde bude mo\u017en\u00e9 vid\u011bt p\u0159\u00ed\u010dinu takov\u00e9ho chov\u00e1n\u00ed.<\/li>\n<\/ol>\n<p><\/p>\n<p>Testov\u00e1n\u00ed prob\u00edh\u00e1 ve dvou f\u00e1z\u00edch. Nejprve skript proch\u00e1z\u00ed v\u0161emi variantami test\u016f, n\u00e1hodn\u011b vyb\u00edr\u00e1 virtu\u00e1lku, na kterou se tento test aplikuje. Pot\u00e9 se prov\u00e1d\u00ed nekone\u010dn\u00e1 smy\u010dka testov\u00e1n\u00ed, virtu\u00e1lky a z\u00e1vada jsou ka\u017ed\u00fdkr\u00e1t vyb\u00edr\u00e1ny n\u00e1hodn\u011b. N\u00e1hl\u00e9 ukon\u010den\u00ed testovac\u00edho skriptu (doln\u00ed panel) nebo nekone\u010dn\u00e1 smy\u010dka \u010dek\u00e1n\u00ed na cokoliv (&gt; 5 minut doba trv\u00e1n\u00ed jedn\u00e9 operace, to je vid\u011bt v trasov\u00e1n\u00ed) \u0159\u00edk\u00e1, \u017ee n\u011bjak\u00fd z test\u016f na tomto clusteru selhal.<\/p>\n<p><\/p>\n<p>Ka\u017ed\u00fd test se skl\u00e1d\u00e1 z n\u00e1sleduj\u00edc\u00edch operac\u00ed:<\/p>\n<p><\/p>\n<ol>\n<li>Spu\u0161t\u011bn\u00ed funkce, kter\u00e1 simuluje z\u00e1vadu.<\/li>\n<li><strong>P\u0159ipraven?<\/strong> \u2014 \u010dek\u00e1 na obnoven\u00ed funk\u010dnosti clusteru (kdy\u017e se poskytuj\u00ed v\u0161echny slu\u017eby).<\/li>\n<li>Zobrazuje se doba \u010dek\u00e1n\u00ed na obnoven\u00ed clusteru (<em>reaction<\/em>).<\/li>\n<li><strong>Opravit<\/strong> \u2014 cluster se \"oprava\". Po \u010dem by m\u011bl vr\u00e1tit se do pln\u011b funk\u010dn\u00edho stavu a p\u0159ipravenosti na dal\u0161\u00ed z\u00e1vadu.<\/li>\n<\/ol>\n<p><\/p>\n<p>Zde je seznam test\u016f s popisem, co d\u011blaj\u00ed:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: vytv\u00e1\u0159\u00ed \"Out of memory\" pomoc\u00ed fork-bomby.<\/li>\n<li><strong>OutOfSpace<\/strong>: zapln\u00ed disk. Test je sp\u00ed\u0161e symbolick\u00fd, vzhledem k minim\u00e1ln\u00edmu zat\u00ed\u017een\u00ed, kter\u00e9 vznik\u00e1 b\u011bhem testov\u00e1n\u00ed. P\u0159i zapln\u011bn\u00ed disku obvykle nedoch\u00e1z\u00ed k selh\u00e1n\u00ed PostgreSQL.<\/li>\n<li><strong>Postgres-KILL<\/strong>: zabije PostgreSQL p\u0159\u00edkazem <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: pozastav\u00ed PostgreSQL p\u0159\u00edkazem <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \u201evyp\u00edn\u00e1\u201c virtu\u00e1ln\u00ed stroj p\u0159\u00edkazem <code>VBoxManage controlvm \"virtu\u00e1ln\u00ed stroj\" poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: restartuje virtu\u00e1ln\u00ed stroj p\u0159\u00edkazem <code>VBoxManage controlvm \"virtu\u00e1ln\u00ed stroj\" reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: pozastav\u00ed d\u00e9mon SBD p\u0159\u00edkazem <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: po\u0161le na virtu\u00e1ln\u00ed stroj p\u0159\u00edkaz p\u0159es SSH <code>systemctl poweroff<\/code>, syst\u00e9m spr\u00e1vn\u011b ukon\u010duje provoz.<\/li>\n<li><strong>UnLink<\/strong>: s\u00ed\u0165ov\u00e1 izolace, p\u0159\u00edkaz <code>VBoxManage controlvm \"virtu\u00e1ln\u00ed stroj\" setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ukon\u010den\u00ed testov\u00e1n\u00ed bu\u010f pomoc\u00ed standardn\u00edho p\u0159\u00edkazu tmux \"kill-window\" <strong>Ctrl-b &amp;<\/strong>, nebo p\u0159\u00edkazem \"detach-client\" <strong>Ctrl-b d<\/strong>: p\u0159i\u010dem\u017e testov\u00e1n\u00ed kon\u010d\u00ed, tmux se uzav\u00edr\u00e1, virtu\u00e1ln\u00ed stroje se vyp\u00ednaj\u00ed.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Probl\u00e9my zji\u0161t\u011bn\u00e9 b\u011bhem testov\u00e1n\u00ed<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>V sou\u010dasn\u00e9 dob\u011b <em>d\u00e9mon watchdog sbd<\/em> prov\u00e1d\u00ed zastaven\u00ed sledovan\u00fdch d\u00e9mon\u016f, ale ne jejich zamrznut\u00ed. A n\u00e1sledkem toho nedoch\u00e1z\u00ed k spr\u00e1vn\u00e9 reakci na poruchy, kter\u00e9 vedou k zamrznut\u00ed pouze <em>Corosync<\/em> a <em>Pacemaker<\/em>, ale ani\u017e by do\u0161lo k pozastaven\u00ed <em>sbd<\/em>. Pro ov\u011b\u0159en\u00ed <em>Corosync<\/em> ji\u017e existuje <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (na GitHubu u <em>sbd<\/em>)<\/a><\/noindex>, p\u0159ijat\u00fd do v\u011btve <em>master<\/em>. Sl\u00edbili (v PR#83), \u017ee pro Pacemaker bude n\u011bco podobn\u00e9ho, douf\u00e1m, \u017ee k <em>RedHat 8<\/em> to ud\u011blaj\u00ed. Ale takov\u00e9 \u201eporuchy\u201c jsou hypotetick\u00e9, snadno se imituj\u00ed um\u011ble pomoc\u00ed nap\u0159\u00edklad <code>killall -STOP corosync<\/code>, ale nikdy se nevyskytuj\u00ed ve skute\u010dn\u00e9m \u017eivot\u011b.<\/p>\n<p>\n<\/li>\n<li>\n<p>V <em>Pacemaker<\/em> verzi pro <em>CentOS 7<\/em> je \u0161patn\u011b nastaven <em>sync_timeout<\/em> u <em>quorum device<\/em>, v d\u016fsledku \u010deho\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">p\u0159i selh\u00e1n\u00ed jednoho uzlu s ur\u010ditou pravd\u011bpodobnost\u00ed restartoval i druh\u00fd uzel<\/a><\/noindex>, na kter\u00fd m\u011bl p\u0159ej\u00edt master. Opravil se zv\u00fd\u0161en\u00edm <em>sync_timeout<\/em> u <em>quorum device<\/em> b\u011bhem nasazen\u00ed (ve skriptu <code>setup\/setup1<\/code>). Tato oprava nebyla akceptov\u00e1na v\u00fdvoj\u00e1\u0159i <em>Pacemaker<\/em>, m\u00edsto toho sl\u00edbili p\u0159epracovat infrastrukturu tak, aby byl tento \u010dasov\u00fd limit automaticky vypo\u010d\u00edt\u00e1v\u00e1n.<\/p>\n<p>\n<\/li>\n<li>\n<p>Pokud je p\u0159i konfiguraci datab\u00e1ze uvedeno, \u017ee v <code>LC_MESSAGES<\/code> (textov\u00e9 zpr\u00e1vy) m\u016f\u017ee b\u00fdt pou\u017eit Unicode, nap\u0159\u00edklad, <code>ru_RU.UTF-8<\/code>, pak p\u0159i spu\u0161t\u011bn\u00ed <em>Postgres<\/em> v prost\u0159ed\u00ed, kde locale nen\u00ed UTF-8, dejme tomu, v pr\u00e1zdn\u00e9m prost\u0159ed\u00ed (zde <em>pacemaker<\/em>+<em>pgsqlms<\/em>(paf) spou\u0161t\u00ed <em>Postgres<\/em>), pak <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">v logu m\u00edsto p\u00edsmen UTF-8 budou otazn\u00edky.<\/a><\/noindex>V\u00fdvoj\u00e1\u0159i PostgreSQL se nikdy nedohodli, co s t\u00edmto d\u011blat. \u0158e\u0161\u00ed se to, je pot\u0159eba nastavit <code>LC_MESSAGES=cs_CZ.UTF-8<\/code> p\u0159i konfiguraci (vytv\u00e1\u0159en\u00ed) instance datab\u00e1ze.<\/p>\n<p>\n<\/li>\n<li>\n<p>Pokud je nastaven wal_receiver_timeout (v\u00fdchoz\u00ed hodnotu m\u00e1 60s), pak p\u0159i testu PostgreSQL-STOP na prim\u00e1rn\u00ed instanci v clusterech tuchanka3 a tuchanka4 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">nen\u00ed obnoveno p\u0159ipojen\u00ed replikace k nov\u00e9mu prim\u00e1rn\u00edmu serveru<\/a><\/noindex>. Replikace je synchronn\u00ed, tak\u017ee se zastavuje nejen pracovn\u00ed instance, ale i nov\u00fd prim\u00e1rn\u00ed server. Obch\u00e1z\u00ed se to nastaven\u00edm wal_receiver_timeout=0 p\u0159i konfiguraci PostgreSQL.<\/p>\n<p>\n<\/li>\n<li>\n<p>Z\u0159\u00eddka se objevilo zamrznut\u00ed replikace PostgreSQL p\u0159i testu ForkBomb (p\u0159epln\u011bn\u00ed pam\u011bti). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Po ForkBomb mohou pracovn\u00ed instance n\u011bkdy neobnovit p\u0159ipojen\u00ed k nov\u00e9mu prim\u00e1rn\u00edmu serveru<\/a><\/noindex>. S t\u00edmto jsem se setkal pouze v clusterech tuchanka3 a tuchanka4, kde kv\u016fli synchronn\u00ed replikaci prim\u00e1rn\u00ed server zamrzl. Probl\u00e9m se s\u00e1m vy\u0159e\u0161il po n\u011bjak\u00e9 dob\u011b (asi za dv\u011b hodiny). Je pot\u0159eba dal\u0161\u00edho zkoum\u00e1n\u00ed, aby se to opravilo. Podle symptom\u016f to vypad\u00e1 jako p\u0159edchoz\u00ed chyba, kterou zp\u016fsobuje jin\u00e1 p\u0159\u00ed\u010dina, ale se stejn\u00fdmi n\u00e1sledky.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Obr\u00e1zek krogan byl p\u0159evzat z <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> se souhlasem autora:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modelov\u00e1n\u00ed odoln\u00fdch cluster\u016f na b\u00e1zi 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.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Modelov\u00e1n\u00ed vysoce dostupn\u00fdch cluster\u016f na b\u00e1zi PostgreSQL a Pacemaker | ProHoster","description":"\u00davod P\u0159ed n\u011bjak\u00fdm \u010dasem jsem dostal \u00fakol vyvinout vysoce dostupn\u00fd cluster pro PostgreSQL.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}