{"id":90103,"date":"2020-07-29T13:42:32","date_gmt":"2020-07-29T11:42:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij"},"modified":"2020-07-29T13:42:32","modified_gmt":"2020-07-29T11:42:32","slug":"patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","title":{"rendered":"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/6404cba13214f499d1f347cca0aacbe7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Scopul principal al Patroni este de a asigura disponibilitatea ridicat\u0103 pentru PostgreSQL. Dar Patroni este doar un template, nu un instrument gata f\u0103cut (a\u0219a cum este specificat \u00een documenta\u021bie). La prima vedere, dup\u0103 ce configur\u0103m Patroni \u00eentr-un laborator de testare, putem observa c\u00e2t de minunat este acest instrument \u0219i c\u00e2t de u\u0219or gestioneaz\u0103 tentativele noastre de a distruge clusterul. Cu toate acestea, \u00een practic\u0103, \u00een medii de produc\u021bie, nu totul decurge at\u00e2t de frumos \u0219i elegant, cum se \u00eent\u00e2mpl\u0103 \u00een laboratoarele de testare.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/ff445e6d76a2ad46a232b705e104446f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voi povesti pu\u021bin despre mine. Am \u00eenceput ca administrator de sistem. Am lucrat \u00een dezvoltarea web. Din 2014, lucrez la Data Egret. Compania se ocup\u0103 cu consultan\u021ba \u00een domeniul Postgres. \u0218i noi ne concentr\u0103m pe Postgres, lucr\u00e2nd cu acesta \u00een fiecare zi, astfel \u00eenc\u00e2t avem diferite expertize legate de exploatarea acestuia. <\/p>\n<p><\/p>\n<p>\u0218i la sf\u00e2r\u0219itul anului 2018, am \u00eenceput treptat s\u0103 folosim Patroni. Am acumulat un anumit nivel de experien\u021b\u0103. L-am diagnosticat, l-am optimizat \u0219i am ajuns la cele mai bune practici. Iar \u00een aceast\u0103 prezentare voi vorbi despre acestea.<\/p>\n<p><\/p>\n<p>Pe l\u00e2ng\u0103 Postgres, \u00eemi place Linux. \u00cemi place s\u0103 m\u0103 ocup cu el \u0219i s\u0103 explorez, \u00eemi place s\u0103 compilez kerneluri. \u00cemi place virtualizarea, containerele, Docker, Kubernetes. M\u0103 intereseaz\u0103 toate acestea deoarece se resimt vechile obiceiuri de administrator. \u00cemi place s\u0103 m\u0103 ocup de monitorizare. \u0218i \u00eemi plac lucrurile legate de administrarea PostgreSQL, adic\u0103 replicarea, backup-ul. \u00cen timpul liber, scriu \u00een Go. Nu sunt inginer software, scriu doar pentru mine \u00een Go. \u0218i \u00eemi face pl\u0103cere. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/02cfd9293af5a8410c91e39afe2c75e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Cred c\u0103 mul\u021bi dintre voi \u0219tiu c\u0103 \u00een Postgres nu exist\u0103 HA (Disponibilitate Ridicat\u0103) din fabric\u0103. Pentru a ob\u021bine HA, trebuie s\u0103 instala\u021bi ceva, s\u0103 configura\u021bi, s\u0103 depune\u021bi eforturile necesare \u0219i s\u0103 ob\u021bine\u021bi rezultatul. <\/li>\n<li>Exist\u0103 c\u00e2teva instrumente, iar Patroni este unul dintre ele, care rezolv\u0103 HA \u00eentr-un mod destul de grozav \u0219i eficient. Dar dup\u0103 ce am instalat totul \u00eentr-un laborator de testare \u0219i l-am pornit, putem observa c\u0103 totul func\u021bioneaz\u0103. Putem reproduce anumite probleme \u0219i putem vedea cum le gestioneaz\u0103 Patroni. \u0218i vom constata c\u0103 totul func\u021bioneaz\u0103 minunat. <\/li>\n<li>Dar \u00een practic\u0103 ne-am confruntat cu diverse probleme. Iar despre aceste probleme voi vorbi.<\/li>\n<li>Voi povesti cum le-am diagnosticat, ce am ajustat \u2013 ne-a ajutat sau nu. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/7126b45b40dd08521e80a3c150382bec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Nu voi povesti despre cum s\u0103 instalez Patroni, deoarece poate fi g\u0103sit pe internet, se pot consulta fi\u0219ierele de configura\u021bie pentru a \u00een\u021belege cum se porne\u0219te \u0219i cum se configureaz\u0103 totul. Po\u021bi s\u0103 te familiarizezi cu schemele, arhitecturile, g\u0103sind informa\u021bii despre acestea pe internet. <\/li>\n<li>Nu voi vorbi despre experien\u021bele altora. Voi vorbi doar despre problemele cu care ne-am confruntat noi. <\/li>\n<li>\u0218i nu voi discuta despre problemele din afara Patroni \u0219i PostgreSQL. De exemplu, problemele legate de echilibrarea \u00eenc\u0103rc\u0103rii, c\u00e2nd clusterele noastre au c\u0103zut, despre acestea nu voi vorbi. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/3f8d179e7c78ce83e8842ef5c72fe30d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i un mic disclaimer \u00eenainte de a \u00eencepe prezentarea noastr\u0103. <\/p>\n<p><\/p>\n<p>Toate aceste probleme cu care ne-am confruntat au ap\u0103rut \u00een primele 6-7-8 luni de utilizare. Cu timpul, am ajuns la propriile noastre bune practici. \u0218i problemele au disp\u0103rut. Aceast\u0103 prezentare a fost planificat\u0103 acum aproximativ \u0219ase luni, c\u00e2nd totul era \u00eenc\u0103 proasp\u0103t \u00een minte \u0219i \u00eemi aminteam foarte bine. <\/p>\n<p><\/p>\n<p>\u00cen timpul preg\u0103tirii prezent\u0103rii, am revizuit vechile postmortem-uri, am verificat jurnalele. Unele detalii ar fi putut fi uitate, sau unele detalii ar fi putut s\u0103 nu fie suficient cercetate \u00een analiza problemelor, a\u0219a c\u0103 \u00een unele momente poate p\u0103rea c\u0103 problemele nu au fost examinate complet sau exist\u0103 o lips\u0103 de informa\u021bii. De aceea, v\u0103 rog s\u0103-mi ierta\u021bi acest aspect. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/30d414284a41fcbc3bf417c9da28ca52.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce este Patroni?<\/p>\n<p><\/p>\n<ul>\n<li>Este un \u0219ablon pentru construirea HA. A\u0219a este scris \u00een documenta\u021bie. \u0218i din punctul meu de vedere, este o clarificare foarte corect\u0103. Patroni nu este o solu\u021bie miraculoas\u0103 care va rezolva toate problemele tale, adic\u0103 trebuie s\u0103 depui efort pentru a \u00eencepe s\u0103 func\u021bioneze \u0219i s\u0103 aduc\u0103 beneficii. <\/li>\n<li>Este un serviciu agen\u021bie care se instaleaz\u0103 pe fiecare serviciu cu baza de date \u0219i care este, \u00eentr-un fel, un sistem init pentru PostgreSQL-ul t\u0103u. Acesta porne\u0219te PostgreSQL, \u00eel opre\u0219te, \u00eel reporne\u0219te, schimb\u0103 configura\u021bia \u0219i modific\u0103 topologia cluster-ului t\u0103u. <\/li>\n<li>Prin urmare, pentru a p\u0103stra starea cluster-ului, imaginea sa actual\u0103, a\u0219a cum arat\u0103, este nevoie de un tip de stocare. \u0218i din acest punct de vedere, Patroni a optat pentru stocarea st\u0103rii \u00eentr-un sistem extern. Acesta este un sistem distribuit de stocare a configura\u021biei. Acestea pot fi Etcd, Consul, ZooKeeper, sau Etcd-ul din Kubernetes, adic\u0103 una dintre aceste op\u021biuni. <\/li>\n<li>Una dintre caracteristicile Patroni este c\u0103 ob\u021bii un failover automat din cutie, doar prin configurare. Comparativ cu Repmgr, unde failover-ul este inclus, \u00een Repmgr avem un switchover, dar dac\u0103 dorim un failover automat, trebuie s\u0103-l configur\u0103m suplimentar. Patroni vine cu failover automat din cutie.<\/li>\n<li>\u0218i mai sunt multe alte lucruri. De exemplu, gestionarea configura\u021biilor, ad\u0103ugarea de replici noi, backup-uri etc. Dar acestea sunt \u00een afara prezent\u0103rii, nu voi vorbi despre ele. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/fed0f1ce931df99ca76ae1116f8098cc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i un mic rezumat este c\u0103 principala sarcin\u0103 a Patroni este s\u0103 efectueze un failover automat bine \u0219i fiabil, astfel \u00eenc\u00e2t clusterul nostru s\u0103 r\u0103m\u00e2n\u0103 func\u021bional \u0219i aplica\u021bia s\u0103 nu observe modific\u0103rile \u00een topologia clusterului. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/fac52620957efa47ced330e7cc8084e0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar atunci c\u00e2nd \u00eencepem s\u0103 folosim Patroni, sistemul nostru devine un pic mai complex. Dac\u0103 \u00eenainte aveam Postgres, acum, folosind Patroni, ob\u021binem Patroni \u00een sine, DCS-ul, unde este stocat starea. \u0218i toate acestea trebuie s\u0103 func\u021bioneze \u00eentr-un fel. De aceea, ce se poate defecta?<\/p>\n<p><\/p>\n<p>Se poate defecta:<\/p>\n<p><\/p>\n<ul>\n<li>Postgres se poate defecta. Acesta poate fi un master sau o replic\u0103, oricare dintre ele poate ie\u0219i din func\u021biune. <\/li>\n<li>Se poate defecta \u00eensu\u0219i Patroni. <\/li>\n<li>Se poate defecta DCS-ul, unde este stocat starea.<\/li>\n<li>\u0218i se poate defecta re\u021beaua. <\/li>\n<\/ul>\n<p><\/p>\n<p>Toate aceste probleme le voi analiza \u00een prezentare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/1aeaf46d37bf1935b514b0581e0dbd0b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voi analiza cazurile pe m\u0103sur\u0103 ce devin mai complexe, nu din perspectiva c\u0103 un caz implic\u0103 multe componente, ci din perspectiva sentimentului subiectiv c\u0103 acest caz a fost complicat pentru mine, c\u0103 a fost dificil de descompus... \u0219i invers, un caz a fost simplu \u0219i a fost u\u0219or de analizat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/65b0c98bf2284610e955ced5eb998f39.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i primul caz este cel mai simplu. Este cazul \u00een care am luat un cluster de baze de date \u0219i pe acela\u0219i cluster am desf\u0103\u0219urat sistemul nostru de stocare DCS. Aceasta este cea mai comun\u0103 eroare. Este o eroare de construc\u021bie a arhitecturii, adic\u0103 combinarea diferitelor componente \u00eentr-un singur loc. <\/p>\n<p><\/p>\n<p>A\u0219adar, a avut loc un failover, s\u0103 vedem ce s-a \u00eent\u00e2mplat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/244b69d623fe2205c2d9ed2aa4620067.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i aici ne intereseaz\u0103 momentul \u00een care a avut loc failover-ul. Adic\u0103, ne intereseaz\u0103 acel moment \u00een care a avut loc schimbarea st\u0103rii clusterului. <\/p>\n<p><\/p>\n<p>Dar failover-ul nu este \u00eentotdeauna instantaneu, adic\u0103 nu dureaz\u0103 o unitate de timp, poate fi prelungit. Poate dura mult timp.<\/p>\n<p><\/p>\n<p>Prin urmare, acesta are un timp de \u00eenceput \u0219i un timp de finalizare, adic\u0103 este un eveniment de durat\u0103. \u00cemp\u0103r\u021bim toate evenimentele \u00een trei intervale: avem timp \u00eenainte de failover, timpul during failover \u0219i dup\u0103 failover. Adic\u0103, analiz\u0103m toate evenimentele \u00een aceast\u0103 linie de timp. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/a0ed61afe55d1a157147e0d80b17e5d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i primul lucru atunci c\u00e2nd a avut loc failoverul, c\u0103ut\u0103m cauza, ce s-a \u00eent\u00e2mplat, ce a dus la failover. <\/p>\n<p><\/p>\n<p>Dac\u0103 ne uit\u0103m la loguri, acestea vor fi logurile clasice Patroni. Ele ne informeaz\u0103 c\u0103 serverul a devenit master \u0219i rolul de master a fost transferat pe acest nod. Aici este eviden\u021biat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/9998c69f7d0d4358b277f4e0e7b4350f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mai departe, trebuie s\u0103 \u00een\u021belegem de ce s-a produs failoverul, adic\u0103 ce evenimente au avut loc care au determinat rolul de master s\u0103 se mute de pe un nod pe altul. \u00cen acest caz, totul este simplu. Avem o eroare de interac\u021biune cu sistemul de stocare. Masterul a realizat c\u0103 nu poate lucra cu DCS, adic\u0103 a ap\u0103rut o problem\u0103 de interac\u021biune. \u0218i spune c\u0103 nu mai poate fi master \u0219i renun\u021b\u0103 la atribu\u021bii. Aceast\u0103 linie \u201edemoted self\u201d spune exact despre asta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/4a8eca27689546b4b0fc3c666a3c37c4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dac\u0103 examin\u0103m evenimentele care au precedat failoverul, atunci putem vedea acele cauze care au reprezentat o problem\u0103 pentru continuarea activit\u0103\u021bii masterului. <\/p>\n<p><\/p>\n<p>Dac\u0103 ne uit\u0103m la logurile Patroni, vom observa c\u0103 avem multe erori, timp de a\u0219teptare, adic\u0103 agentul Patroni nu poate comunica cu DCS. \u00cen acest caz, este agentul Consul, cu care se comunic\u0103 pe portul 8500. <\/p>\n<p><\/p>\n<p>\u0218i problema aici const\u0103 \u00een faptul c\u0103 Patroni \u0219i baza de date sunt pornite pe acela\u0219i host. \u0218i pe acest nod au fost pornite serverele Consul. Cre\u00e2nd o \u00eenc\u0103rc\u0103tur\u0103 pe server, am creat probleme \u0219i pentru <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/ro\/server\/\"   title=\"servere\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1515\">servere<\/a> Consul. Acestea nu au putut comunica corect. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/0d8dba6641809560e6b32825d481e30b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dup\u0103 un timp, c\u00e2nd sarcina a sc\u0103zut, Patroni nostru a reu\u0219it din nou s\u0103 comunice cu agen\u021bii. Activitatea normal\u0103 a fost reluat\u0103. \u0218i acela\u0219i server Pgdb-2 a devenit din nou master. Adic\u0103, a fost o mic\u0103 revenire, din cauza c\u0103reia nodul a renun\u021bat la atribu\u021bii de master, iar apoi le-a preluat din nou, adic\u0103 totul a revenit la cum a fost. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/131b93e0bd83099e1b99b53742419e13.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i aceasta poate fi interpretat\u0103 ca o eroare fals\u0103, sau poate fi v\u0103zut\u0103 c\u0103 Patroni a ac\u021bionat corect. Adic\u0103, a realizat c\u0103 nu poate men\u021bine starea clusterului \u0219i a renun\u021bat la atribu\u021bii.<\/p>\n<p><\/p>\n<p>\u0218i aici problema a ap\u0103rut pentru c\u0103 serverele Consul se afl\u0103 pe aceea\u0219i infrastructur\u0103 ca bazele de date. Prin urmare, orice \u00eenc\u0103rcare: fie c\u0103 este vorba despre \u00eenc\u0103rcarea pe discuri sau procesoare, aceasta afecteaz\u0103 \u0219i interac\u021biunea cu clusterul Consul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/142c7cf839c8da078451f7ba9d5499e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am decis c\u0103 acestea nu trebuie s\u0103 coexiste, a\u0219a c\u0103 am alocat un cluster separat pentru Consul. Patroni a func\u021bionat deja cu un Consul separat, adic\u0103 un cluster Postgres separat \u0219i un cluster Consul separat. Aceasta este o instruc\u021biune de baz\u0103 despre cum trebuie s\u0103 distribui\u021bi \u0219i s\u0103 men\u021bine\u021bi toate aceste lucruri, astfel \u00eenc\u00e2t s\u0103 nu coexiste. <\/p>\n<p><\/p>\n<p>Ca o op\u021biune, putem ajusta parametrii ttl, loop_wait, retry_timeout, adic\u0103 s\u0103 \u00eencerc\u0103m s\u0103 supravie\u021buim acestor v\u00e2rfuri temporare de \u00eenc\u0103rcare prin cre\u0219terea acestor parametri. Dar nu este cea mai potrivit\u0103 op\u021biune, deoarece aceast\u0103 \u00eenc\u0103rcare poate fi de lung\u0103 durat\u0103. \u0218i pur \u0219i simplu vom dep\u0103\u0219i limitele acestor parametri. \u0218i s-ar putea s\u0103 nu ajute deloc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/c51f35dcd88b1c792acec231c0c6c66c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prima problem\u0103, dup\u0103 cum a\u021bi \u00een\u021beles, este simpl\u0103. Am luat DCS-ul \u0219i l-am pus \u00eempreun\u0103 cu baza, am ob\u021binut o problem\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/cc2a98d9790441577fb4080406cbc53f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A doua problem\u0103 este similar\u0103 cu prima. Este asem\u0103n\u0103toare prin faptul c\u0103 din nou avem probleme de interac\u021biune cu sistemul DCS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/e5c01b105adca48cc620085db8dd2d2b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dac\u0103 ne uit\u0103m la jurnale, vom observa din nou o eroare de comunicare. \u0218i Patroni spune c\u0103 nu pot interac\u021biona cu DCS, prin urmare, actualul master trece \u00een modul replic\u0103.<\/p>\n<p><\/p>\n<p>Fostul master devine replic\u0103, aici Patroni lucreaz\u0103 a\u0219a cum trebuie. El porne\u0219te pg_rewind pentru a r\u0103sfoi jurnalul de tranzac\u021bii \u0219i apoi se conecteaz\u0103 la noul master, urm\u00e2nd s\u0103 ajung\u0103 din urm\u0103 noul master. Aici Patroni func\u021bioneaz\u0103 a\u0219a cum este corect. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/29255f4790abb15b64dbf9ee0b41c7fc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aici trebuie s\u0103 g\u0103sim locul care a precedat erorile, adic\u0103 acele erori care au fost cauza pentru care a avut loc eroarea de fi\u0219ier. \u00cen acest sens, lucrul cu jurnalele Patroni este destul de convenabil. La intervale regulate, el scrie acelea\u0219i mesaje. \u0218i dac\u0103 \u00eencepem s\u0103 derul\u0103m rapid aceste jurnale, vom observa c\u0103 jurnalele s-au schimbat, ceea ce \u00eenseamn\u0103 c\u0103 au ap\u0103rut probleme. Ne \u00eentoarcem rapid la acel loc \u0219i vedem ce se \u00eent\u00e2mpl\u0103. <\/p>\n<p><\/p>\n<p>\u0218i \u00een situa\u021bii normale, jurnalele arat\u0103 cam a\u0219a. Se verific\u0103 proprietarul bloc\u0103rii. \u0218i dac\u0103 proprietarul, de exemplu, s-a schimbat, atunci pot ap\u0103rea anumite evenimente la care Patroni trebuie s\u0103 reac\u021bioneze. Dar \u00een acest caz, avem totul \u00een regul\u0103. C\u0103ut\u0103m acel loc unde au \u00eenceput erorile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/f48ebd22a405f5b2900621451c68f543.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i dac\u0103 derul\u0103m \u00eenapoi la momentul \u00een care au \u00eenceput s\u0103 apar\u0103 erorile, observ\u0103m c\u0103 a avut loc un auto-failover. \u0218i deoarece erorile noastre au fost legate de interac\u021biunea cu DCS \u0219i \u00een cazul nostru am utilizat Consul, ne uit\u0103m \u0219i la logurile Consul pentru a vedea ce s-a \u00eent\u00e2mplat acolo. <\/p>\n<p><\/p>\n<p>Compar\u00e2nd aproximativ momentul failover-ului cu timestamp-urile din logurile Consul, observ\u0103m c\u0103 vecinii din clusterul Consul au \u00eenceput s\u0103 se \u00eendoiasc\u0103 de existen\u021ba altor membri ai clusterului Consul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/63b02ac5b4f5a34a2822f1eee2b1f2f8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dac\u0103 ne uit\u0103m \u0219i la logurile altor agen\u021bi Consul, se poate vedea c\u0103 acolo se \u00eent\u00e2mpl\u0103 un colaps re\u021bea. To\u021bi membrii clusterului Consul se \u00eendoiesc de existen\u021ba celorlal\u021bi. Acesta a fost un factor care a dus la failover. <\/p>\n<p><\/p>\n<p>Dac\u0103 analiz\u0103m ce s-a \u00eent\u00e2mplat \u00eenainte de aceste erori, putem observa c\u0103 exist\u0103 diverse erori, cum ar fi deadline, RPC failed, adic\u0103 clar exist\u0103 o problem\u0103 \u00een interac\u021biunea membrilor clusterului Consul \u00eentre ei. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/b15c912f2afb49d9d85e7bb9361ce449.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cel mai simplu r\u0103spuns ar fi s\u0103 repar\u0103m re\u021beaua. Dar pentru mine, afl\u00e2ndu-m\u0103 la tribun\u0103, este u\u0219or s\u0103 fac aceast\u0103 afirma\u021bie. \u00cens\u0103 situa\u021bia este astfel \u00eenc\u00e2t nu \u00eentotdeauna clientul \u00ee\u0219i poate permite s\u0103 repare re\u021beaua. El poate locui \u00een DC \u0219i poate s\u0103 nu aib\u0103 capacitatea de a repara re\u021beaua sau de a influen\u021ba echipamentele. Prin urmare, sunt necesare alte op\u021biuni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/1dbdb66233acc3bc321a30a1c5fe14f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Exist\u0103 op\u021biuni:<\/p>\n<p><\/p>\n<ul>\n<li>Cea mai simpl\u0103 op\u021biune, despre care cred c\u0103 este men\u021bionat\u0103 chiar \u00een documenta\u021bie, este s\u0103 dezactiv\u0103m verific\u0103rile Consul, adic\u0103 pur \u0219i simplu s\u0103 furniz\u0103m un array gol. \u0218i spunem agentului Consul s\u0103 nu utilizeze nicio verificare. Prin aceste verific\u0103ri, putem ignora aceste furtuni de re\u021bea \u0219i s\u0103 nu ini\u021biem failover. <\/li>\n<li>O alt\u0103 op\u021biune este s\u0103 revizuim raft_multiplier. Acest parametru apar\u021bine serverului Consul. Implicit, este setat la valoarea 5. Aceast\u0103 valoare este recomandat\u0103 \u00een documenta\u021bie pentru medii de staging. Practic, aceasta influen\u021beaz\u0103 frecven\u021ba schimbului de mesaje \u00eentre membrii re\u021belei Consul. Acest parametru influen\u021beaz\u0103 viteza comunic\u0103rii \u00eentre membrii clusterului Consul. \u0218i pentru produc\u021bie, se recomand\u0103 reducerea sa pentru a permite nodurilor s\u0103 schimbe mesaje mai frecvent. <\/li>\n<li>O alt\u0103 variant\u0103 pe care am \u00eenceput s\u0103 o folosim este cre\u0219terea priorit\u0103\u021bii proceselor Consul \u00een compara\u021bie cu celelalte procese din planificatorul de procese al sistemului de operare. Exist\u0103 un parametru numit \u201enice\u201d, care determin\u0103 exact prioritatea proceselor luat\u0103 \u00een considerare de planificatorul OS. Am redus valoarea nice pentru agen\u021bii Consul, adic\u0103 le-am crescut prioritatea, astfel \u00eenc\u00e2t sistemul de operare s\u0103 aloce mai mult timp proceselor Consul pentru a-\u0219i executa codul. \u00cen cazul nostru, aceasta a rezolvat problema. <\/li>\n<li>O alt\u0103 variant\u0103 este s\u0103 nu folose\u0219ti Consul. Am un prieten care este un mare sus\u021bin\u0103tor al Etcd. \u0218i ne cert\u0103m regulat despre care este mai bun, Etcd sau Consul. Dar, \u00een ceea ce prive\u0219te ce este mai bun, de obicei ajungem la concluzia c\u0103 Consul are un agent care trebuie s\u0103 fie rulat pe fiecare nod cu baza de date. Adic\u0103 interac\u021biunea dintre Patroni \u0219i clusterul Consul se face prin acest agent. \u0218i acest agent devine un punct slab. Dac\u0103 se \u00eent\u00e2mpl\u0103 ceva cu agentul, Patroni nu mai poate func\u021biona cu clusterul Consul. \u0218i aceasta este o problem\u0103. \u00cen cazul Etcd, nu exist\u0103 niciun agent. Patroni poate lucra direct cu lista serverelor Etcd \u0219i poate comunica deja cu ele. \u00cen aceast\u0103 privin\u021b\u0103, dac\u0103 folose\u0219ti Etcd \u00een compania ta, acesta ar fi, probabil, cea mai bun\u0103 alegere comparativ cu Consul. Dar noi, la clien\u021bii no\u0219tri, suntem adesea limita\u021bi de ceea ce a ales \u0219i folose\u0219te clientul. \u0218i, \u00een cea mai mare parte, Consul este folosit de to\u021bi clien\u021bii. <\/li>\n<li>Iar ultimul punct este s\u0103 revizuim valorile parametrilor. Putem cre\u0219te aceste valori, sper\u00e2nd c\u0103 problemele noastre temporare de re\u021bea vor fi scurte \u0219i nu vor dep\u0103\u0219i intervalul acestor parametrii. Astfel, putem reduce agresivitatea lui Patroni \u00een executarea failover-ului automat atunci c\u00e2nd apar probleme de re\u021bea.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/f0043050da20f6368dabf66ec9a4eade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cred c\u0103 mul\u021bi dintre cei care folosesc Patroni sunt familiariza\u021bi cu acest comanda. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/9f78f59dab166e47ac78436802156d04.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aceast\u0103 comand\u0103 arat\u0103 starea curent\u0103 a clusterului. \u0218i, la prima vedere, aceast\u0103 imagine poate p\u0103rea normal\u0103. Avem un master, avem o replic\u0103, nu exist\u0103 \u00eent\u00e2rziere \u00een replicare. Dar aceast\u0103 imagine este normal\u0103 doar p\u00e2n\u0103 c\u00e2nd nu \u0219tim c\u0103 \u00een acest cluster ar trebui s\u0103 fie trei noduri, nu dou\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/a39c891f8620ba210b6bce0727e0fa8b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A\u0219adar, a avut loc o auto-\u00eenc\u0103rcare de fi\u0219iere. Dup\u0103 aceast\u0103 auto-\u00eenc\u0103rcare, replica noastr\u0103 a disp\u0103rut. Trebuie s\u0103 afl\u0103m de ce a disp\u0103rut \u0219i s\u0103 o readucem, s\u0103 o restabilim. \u0218i ne \u00eentoarcem din nou \u00een jurnale pentru a vedea de ce a avut loc auto-\u00eenc\u0103rcarea.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/e6e67d46cb20c8d7e58c7505157f68e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen acest caz, a doua replic\u0103 a devenit master. Aici totul este \u00een regul\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/b86ccea68b0c6013a23bbd2804e48320.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trebuie s\u0103 ne uit\u0103m acum la replica care a c\u0103zut \u0219i care nu se afl\u0103 \u00een cluster. Deschidem jurnalele Patroni \u0219i vedem c\u0103 a avut loc o problem\u0103 \u00een timpul conect\u0103rii la cluster la etapa pg_rewind. Pentru a ne conecta la cluster, trebuie s\u0103 revenim \u00een jurnalul de tranzac\u021bii, s\u0103 cerem jurnalul de tranzac\u021bii necesar de la master \u0219i s\u0103-l ajungem pe master. <\/p>\n<p><\/p>\n<p>\u00cen acest caz, nu avem jurnal de tranzac\u021bii \u0219i replica nu se poate porni. A\u0219adar, oprim Postgres cu o eroare. \u0218i de aceea nu se afl\u0103 \u00een cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/dadbd44b766674b719d85781ef7f0caa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trebuie s\u0103 \u00een\u021belegem de ce nu se afl\u0103 \u00een cluster \u0219i de ce nu au existat jurnale. Ne \u00eendrept\u0103m spre noul master \u0219i vedem ce are \u00een jurnale. Se dovede\u0219te c\u0103, atunci c\u00e2nd s-a efectuat pg_rewind, a avut loc un checkpoint. \u0218i o parte din jurnalele vechi de tranzac\u021bii au fost pur \u0219i simplu redenumite. Atunci c\u00e2nd vechiul master a \u00eencercat s\u0103 se conecteze la noul master \u0219i s\u0103 cear\u0103 aceste jurnale, ele deja fuseser\u0103 redenumite, de fapt nu au existat.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/f2d5c37324f9436b2bdad1290612d86f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am comparat timestamp-urile c\u00e2nd s-au \u00eent\u00e2mplat aceste evenimente. Iar diferen\u021ba era de doar 150 de milisecunde, adic\u0103 \u00een 369 de milisecunde s-a finalizat checkpoint-ul \u0219i segmentele WAL au fost redenumite. \u0218i la 517, dup\u0103 150 de milisecunde, s-a pornit rewind-ul pe vechea replic\u0103. Adic\u0103, cu adev\u0103rat 150 de milisecunde ne-au fost suficiente pentru ca replica s\u0103 nu se poat\u0103 conecta \u0219i s\u0103 func\u021bioneze. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/99dd80deb8466bfc3aff568456e07102.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce op\u021biuni avem?<\/p>\n<p><\/p>\n<p>Ini\u021bial, am folosit sloturi de replicare. Ni s-a p\u0103rut c\u0103 este bine. De\u0219i \u00een prima etap\u0103 a exploat\u0103rii am dezactivat sloturile. Ne-am g\u00e2ndit c\u0103, dac\u0103 sloturile vor acumula multe segmente WAL, putem provoca o c\u0103dere a master-ului. Acesta va c\u0103dea. Ne-am chinuit o vreme f\u0103r\u0103 sloturi. \u0218i ne-am dat seama c\u0103 avem nevoie de sloturi, a\u0219a c\u0103 le-am recuperat. <\/p>\n<p><\/p>\n<p>Dar exist\u0103 o problem\u0103, c\u0103 atunci c\u00e2nd masterul trece la replic\u0103, acesta \u0219terge sloturile \u0219i odat\u0103 cu sloturile \u0219terge segmentele WAL. Pentru a exclude apari\u021bia acestei probleme, am decis s\u0103 cre\u0219tem parametrul wal_keep_segments. Implicit este de 8 segmente. L-am crescut la 1.000 \u0219i am verificat c\u00e2t spa\u021biu liber avem. \u0218i am c\u00e2\u0219tigat 16 gigaocte\u021bi pentru wal_keep_segments. Adic\u0103, \u00een timpul comut\u0103rii, avem \u00eentotdeauna un surplus de 16 gigaocte\u021bi de jurnale de tranzac\u021bii pe toate nodurile.<\/p>\n<p><\/p>\n<p>\u0218i plus \u2013 este de actualitate \u0219i pentru sarcini de \u00eentre\u021binere de lung\u0103 durat\u0103. S\u0103 presupunem c\u0103 trebuie s\u0103 actualiz\u0103m una dintre replici. Iar noi dorim s\u0103 o oprim. Trebuie s\u0103 actualiz\u0103m software-ul, poate sistemul de operare, altceva. \u0218i c\u00e2nd oprim replica, pentru acea replic\u0103 se \u0219terge \u0219i slotul. \u0218i dac\u0103 utiliz\u0103m un wal_keep_segments mic, \u00een absen\u021ba prelungit\u0103 a replicii, jurnalele de tranzac\u021bii vor fi pierdute. Vom reporni replica, aceasta va solicita acele jurnale de tranzac\u021bii de unde se oprise, dar la master poate s\u0103 nu existe. \u0218i replica nu se va putea conecta. De aceea, men\u021binem un stoc mare de jurnale.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/dad55c828128ce92f649a99cc53ce54b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/63e70f0b098567f3a6d4fd66a0c293bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Avem o baz\u0103 de date de produc\u021bie. Acolo func\u021bioneaz\u0103 deja proiecte. <\/p>\n<p><\/p>\n<p>A avut loc o eroare de sistem. Am intrat \u0219i am verificat \u2013 totul \u00een regul\u0103, replicile sunt la locul lor, nu exist\u0103 \u00eent\u00e2rziere \u00een replicare. Nu sunt erori \u00een jurnale, totul este \u00een regul\u0103. <\/p>\n<p><\/p>\n<p>Echipa de produs spune c\u0103 ar trebui s\u0103 existe unele date, dar le vedem dintr-o singur\u0103 surs\u0103, iar \u00een baz\u0103 nu le vedem. \u0218i trebuie s\u0103 \u00een\u021belegem ce s-a \u00eent\u00e2mplat cu ele. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/568ca9aa31680d5e0c9d4ed9693b14e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este clar c\u0103 pg_rewind le-a \u0219ters. Ne-am dat seama imediat, dar am mers s\u0103 verific\u0103m ce s-a \u00eent\u00e2mplat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/a8fee389201d96e81761cd276c5265c3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen jurnale, putem g\u0103si \u00eentotdeauna c\u00e2nd s-a \u00eent\u00e2mplat eroarea de sistem, cine a devenit master \u0219i putem determina cine a fost vechiul master \u0219i c\u00e2nd a dorit s\u0103 devin\u0103 replic\u0103, adic\u0103 avem nevoie de aceste jurnale pentru a stabili volumul jurnalele de tranzac\u021bii care au fost pierdute.<\/p>\n<p><\/p>\n<p>Vechea noastr\u0103 ma\u0219in\u0103 a fost repornit\u0103. Patroni era \u00eenregistrat pentru pornire automat\u0103. Patroni s-a activat. Apoi, a pornit Postgres. Mai exact, \u00eenainte de lansarea lui Postgres \u0219i \u00eenainte de a-l transforma \u00een replic\u0103, Patroni a ini\u021biat procesul pg_rewind. Astfel, a \u0219ters o parte din jurnalele de tranzac\u021bii, a desc\u0103rcat altele noi \u0219i s-a conectat. Aici, Patroni a func\u021bionat excelent, conform a\u0219tept\u0103rilor. Clusterul nostru s-a recuperat. Aveam 3 noduri, dup\u0103 failover, am avut 3 noduri \u2013 totul a fost grozav. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/b747a24f53e20ed098c2dc0afc79bead.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am pierdut o parte din date. Trebuie s\u0103 \u00een\u021belegem c\u00e2t am pierdut. C\u0103ut\u0103m momentul exact \u00een care a avut loc rewind. Putem g\u0103si acest lucru din jurnalele de \u00eenregistrare. Rewind a \u00eenceput, a f\u0103cut ceva acolo \u0219i s-a \u00eencheiat.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/5b7bacffb52e3ccd529a3a734c441295.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trebuie s\u0103 g\u0103sim pozi\u021bia din jurnalul de tranzac\u021bii la care s-a oprit vechiul master. \u00cen acest caz \u2013 acesta este marcajul respectiv. \u0218i avem nevoie de un al doilea marcaj, adic\u0103 distan\u021ba la care se diferen\u021biaz\u0103 vechiul master de noul. <\/p>\n<p><\/p>\n<p>Folosim diferen\u021ba pg_wal_lsn_diff \u0219i compar\u0103m aceste dou\u0103 marcaje. \u00cen acest caz ob\u021binem 17 megabi\u021bi. Este mult sau pu\u021bin, fiecare decide pentru sine. Pentru unii, 17 megabi\u021bi reprezint\u0103 pu\u021bin, pentru al\u021bii este mult \u0219i inacceptabil. Aici fiecare \u00ee\u0219i define\u0219te individual \u00een func\u021bie de nevoile afacerii. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/55335fce85961e159459c38300a0ad12.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar ce am stabilit pentru noi? <\/p>\n<p><\/p>\n<p>\u00cen primul r\u00e2nd, trebuie s\u0103 ne decidem \u2013 avem \u00eentotdeauna nevoie de pornirea automat\u0103 Patroni dup\u0103 repornirea sistemului? De cele mai multe ori, trebuie s\u0103 ne conect\u0103m la vechiul master, s\u0103 vedem c\u00e2t de departe a ajuns. Poate trebuie s\u0103 inspect\u0103m segmentele jurnalului de tranzac\u021bii, s\u0103 vedem ce este acolo. \u0218i s\u0103 \u00een\u021belegem \u2013 putem pierde aceste date sau trebuie s\u0103 pornim vechiul master \u00een mod standalone pentru a recupera aceste date. <\/p>\n<p><\/p>\n<p>\u0218i doar dup\u0103 aceea trebuie s\u0103 lu\u0103m decizii dac\u0103 putem s\u0103 abandon\u0103m aceste date sau dac\u0103 le putem recupera, conect\u00e2nd acest nod ca replic\u0103 \u00een clusterele noastre.<\/p>\n<p><\/p>\n<p>\u00cen plus, exist\u0103 parametrul \u201emaximum_lag_on_failover\u201d. Din c\u00e2te mi-aduc aminte, acest parametru are valoarea de 1 megabit \u00een mod implicit. <\/p>\n<p><\/p>\n<p>Cum func\u021bioneaz\u0103? Dac\u0103 replica noastr\u0103 este cu 1 megabit \u00een urm\u0103 \u00een raport cu lag-ul de replicare, atunci aceast\u0103 replic\u0103 nu particip\u0103 la alegeri. \u0218i dac\u0103 apare un failover, Patroni verific\u0103 ce replici sunt \u00een \u00eent\u00e2rziere. Dac\u0103 sunt \u00een urm\u0103 cu un num\u0103r mare de jurnale de tranzac\u021bii, ele nu pot deveni master. Aceasta este o func\u021bie de protec\u021bie foarte bun\u0103 care ajut\u0103 la prevenirea pierderii unei cantit\u0103\u021bi mari de date. <\/p>\n<p><\/p>\n<p>Dar exist\u0103 o problem\u0103 \u00een faptul c\u0103 lag-ul de replicare \u00een clusterul Patroni \u0219i DCS este actualizat la intervale specificate. Cred c\u0103 valoarea ttl implicit este de 30 de secunde.<\/p>\n<p><\/p>\n<p>Prin urmare, poate exista o situa\u021bie \u00een care \u00eent\u00e2rzierea replic\u0103rii pentru replicile din DCS este una, dar \u00een realitate poate fi complet diferit\u0103 sau poate chiar s\u0103 nu existe deloc \u00eent\u00e2rziere, adic\u0103 acest proces nu este \u00een timp real. \u0218i nu reflect\u0103 \u00eentotdeauna imaginea real\u0103. Nu ar trebui s\u0103 construim o logic\u0103 complex\u0103 pe baza acesteia. <\/p>\n<p><\/p>\n<p>\u0218i riscul de pierderi r\u0103m\u00e2ne \u00eentotdeauna. \u0218i \u00een cel mai r\u0103u caz o formul\u0103, iar \u00een cazul mediu o alt\u0103 formul\u0103. Adic\u0103, atunci c\u00e2nd planific\u0103m implementarea Patroni \u0219i evalu\u0103m c\u00e2te date b\u0103m putea pierde, trebuie s\u0103 ne baz\u0103m pe aceste formule \u0219i s\u0103 avem o idee despre c\u00e2te date putem pierde. <\/p>\n<p><\/p>\n<p>\u0218i exist\u0103 o veste bun\u0103. C\u00e2nd vechiul master a avansat, el poate avansa datorit\u0103 unor procese de fundal. Adic\u0103, a existat un auto-vacuum, a scris datele, le-a salvat \u00een jurnalul de tranzac\u021bii. \u0218i aceste date putem s\u0103 le ignor\u0103m cu u\u0219urin\u021b\u0103 \u0219i s\u0103 le pierdem. Nu este nicio problem\u0103 \u00een asta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/a86e8971ab4ef41b89af9cf0bdf519ba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i a\u0219a arat\u0103 jurnalele \u00een cazul \u00een care este setat maximum_lag_on_failover \u0219i a avut loc un failover, iar un nou master trebuie ales. Replica se evalueaz\u0103 ca incapabil\u0103 s\u0103 participe la alegeri. \u0218i refuz\u0103 participarea \u00een cursa pentru lider. A\u0219teapt\u0103 s\u0103 fie ales un nou master, pentru a se conecta ulterior la el. Aceasta este o m\u0103sur\u0103 suplimentar\u0103 \u00eempotriva pierderii de date.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/f760788e5951facdd08b2069037830fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/c32f26e7526e1873f3bfd7d3693fcc72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aici echipa de produs ne-a informat c\u0103 produsul lor \u00eent\u00e2mpin\u0103 probleme \u00een lucrul cu Postgres. \u00cen acela\u0219i timp, nu se poate accesa masterul, deoarece nu este disponibil prin SSH. \u0218i auto-failover-ul nu se \u00eent\u00e2mpl\u0103. <\/p>\n<p><\/p>\n<p>Acest host a fost for\u021bat s\u0103 se reporneasc\u0103. Din cauza repornirii a avut loc un auto-failover, de\u0219i ar fi putut fi realizat \u0219i un failover manual, a\u0219a cum \u00een\u021beleg acum. \u0218i dup\u0103 repornire, vom verifica ce s-a \u00eent\u00e2mplat cu masterul actual. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/95efb82e0647a396a21683cd53a69547.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De asemenea, \u0219tiam dinainte c\u0103 aveam probleme cu discurile, adic\u0103 deja \u0219tiam din monitorizare unde s\u0103 c\u0103ut\u0103m \u0219i ce s\u0103 c\u0103ut\u0103m. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/367aaab607d833d96a573ddbbbced502.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am intrat \u00een jurnalul postgres, am \u00eenceput s\u0103 vedem ce se \u00eent\u00e2mpl\u0103. Am observat comitente care dureaz\u0103 c\u00e2te una, dou\u0103, trei secunde, ceea ce nu este normal. Am observat c\u0103 auto-vacuum-ul se porne\u0219te foarte lent \u0219i ciudat. \u0218i am v\u0103zut fi\u0219iere temporare pe disc. Adic\u0103, acestea sunt toate semnele problemelor cu discurile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/7e0cfce7a81901ef9ef736c3fefc8dce.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am verificat \u00een logul dmesg al sistemului (jurnalul mesajelor kernel). \u0218i am constatat c\u0103 avem probleme cu unul dintre disque. Subsistemul de stocare era un RAID software. Am privit \u00een \/proc\/mdstat \u0219i am observat c\u0103 ne lipse\u0219te un disk. Adic\u0103, avem un RAID din 8 disque, iar unul lipse\u0219te. Dac\u0103 ne uit\u0103m cu aten\u021bie la slide, putem observa c\u0103 avem sde absent. Practic, un disk a fost pierdut. Aceasta a declan\u0219at problemele de stocare, iar aplica\u021biile au avut de suferit \u00een interac\u021biunea cu clusterul Postgres.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/4b09b3aa761cb504fa79173ef280faac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen aceast\u0103 situa\u021bie, Patroni nu ne-ar fi ajutat, deoarece Patroni nu are sarcina de a monitoriza starea serverului sau a disque-ului. Trebuie s\u0103 monitoriz\u0103m astfel de situa\u021bii cu un sistem de monitorizare extern. Am ad\u0103ugat rapid monitorizarea disque-urilor \u00een monitorizarea extern\u0103. <\/p>\n<p><\/p>\n<p>A fost o idee \u2013 ne-ar fi putut ajuta fencing-ul sau un watchdog software? Ne-am g\u00e2ndit c\u0103 este pu\u021bin probabil s\u0103 ne ajute \u00een aceast\u0103 situa\u021bie, deoarece \u00een timpul problemelor Patroni a continuat s\u0103 interac\u021bioneze cu clusterul DCS \u0219i nu a observat nicio problem\u0103. Adic\u0103, din perspectiva DCS \u0219i Patroni, totul p\u0103rea \u00een regul\u0103, de\u0219i, de fapt, existau probleme cu disque-urile \u0219i accesibilitatea bazei de date. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/15fdac78535355d4eb889efcc27efc46.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Din punctul meu de vedere, aceasta este una dintre cele mai ciudate probleme pe care le-am investigat mult timp, am citit foarte multe loguri \u0219i am numit-o cluster-simulant. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/b5259774931c290eda6673deb14b6c48.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Problema era c\u0103 vechiul master nu putea deveni o replic\u0103 normal\u0103, adic\u0103 Patroni \u00eel pornea, Patroni ar\u0103ta c\u0103 acest nod este prezent ca replic\u0103, dar, \u00een acela\u0219i timp, nu era o replic\u0103 normal\u0103. Acum ve\u021bi \u00een\u021belege de ce. Aceasta a fost p\u0103strat\u0103 din analiza acelei probleme. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/c35a5d102a46764bbf96e5a75ee88171.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i de unde a \u00eenceput totul? A \u00eenceput, la fel ca \u00een problema anterioar\u0103, cu \u00eent\u00e2rzieri de disk. Aveam comenzi de un commit pe secund\u0103, dou\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/435c1b350a89f288e0e10ca9d5a2ec6e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Au fost \u00eentreruperi ale conexiunilor, adic\u0103 clien\u021bii se deconectau. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/920cb1f3f3b40578e15e6ff711e85c50.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Au fost blocaje de diferite grade de severitate. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/285d6292d89b928a85e95602ee57d38a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i, prin urmare, subsistemul de stocare nu era foarte reactiv. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/ebe71d49360e7f604ecd6a3c8276cb73.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i cel mai misterios pentru mine a fost cererea de oprire imediat\u0103. Postgres are trei moduri de oprire:<\/p>\n<p><\/p>\n<ul>\n<li>Este mod graceful, c\u00e2nd a\u0219tept\u0103m ca to\u021bi clien\u021bii s\u0103 se deconecteze de la sine. <\/li>\n<li>Exist\u0103 un mod fast, c\u00e2nd \u00eei for\u021b\u0103m pe clien\u021bi s\u0103 se deconecteze, deoarece ne preg\u0103tim s\u0103 ne oprim. <\/li>\n<li>\u0218i immediate. \u00cen acest caz, immediate nici m\u0103car nu \u00eei informeaz\u0103 pe clien\u021bi c\u0103 trebuie s\u0103 se deconecteze, pur \u0219i simplu se opre\u0219te f\u0103r\u0103 avertisment. Iar tuturor clien\u021bilor, sistemul de operare le trimite un mesaj RST (mesaj TCP, c\u0103 conexiunea a fost \u00eentrerupt\u0103 \u0219i clientului nu \u00eei mai r\u0103m\u00e2ne nimic de f\u0103cut). <\/li>\n<\/ul>\n<p><\/p>\n<p>Cine a trimis acest semnal? Procesele \u00een fundal Postgres nu se trimit \u00eentre ele astfel de semnale, adic\u0103 este vorba de un kill -9. Ele nu \u00ee\u0219i trimit \u00eentre ele asemenea semnale, ci doar reac\u021bioneaz\u0103 la acestea, adic\u0103 este o repornire de urgen\u021b\u0103 a Postgres. Cine l-a trimis, nu \u0219tiu. <\/p>\n<p><\/p>\n<p>Am verificat comanda \u201elast\u201d \u0219i am v\u0103zut o persoan\u0103 care s-a conectat la acest server \u00eempreun\u0103 cu noi, dar mi-a fost jen\u0103 s\u0103 \u00eentreb. Poate c\u0103 a fost un kill -9. A\u0219 fi v\u0103zut \u00een loguri kill -9, deoarece Postgres scrie c\u0103 a primit kill -9, dar nu am v\u0103zut asta \u00een loguri. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/fe8e844649cea3384ebfde86e36eba44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pe m\u0103sur\u0103 ce am investigat mai departe, am observat c\u0103 Patroni nu a scris \u00een log pentru o perioad\u0103 destul de lung\u0103 \u2013 54 de secunde. \u0218i dac\u0103 compar timestamp-urile, aici au fost aproximativ 54 de secunde f\u0103r\u0103 mesaje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/ffb1c4db3d7de591d77d56ed2fcc4f2a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i \u00een acest interval a avut loc un failover automat. Patroni a func\u021bionat din nou perfect. Maestrul nostru vechi a fost indisponibil, ceva se \u00eent\u00e2mpla cu el. \u0218i au \u00eenceput alegerile pentru un nou maestru. Aici totul a func\u021bionat bine. pgsql01 a devenit noul lider. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/6b2457653e9f77af44cd64b4aff021a0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Avem o replic\u0103 care a devenit maestru. \u0218i exist\u0103 o a doua replic\u0103. Iar cu cea de-a doua replic\u0103 au fost probleme. \u00cencerca s\u0103 se reconfigureze. Din c\u00e2te \u00een\u021beleg, \u00eencerca s\u0103 schimbe recovery.conf, s\u0103 reporneasc\u0103 Postgres \u0219i s\u0103 se conecteze la noul maestru. La fiecare 10 secunde trimite mesaje c\u0103 \u00eencearc\u0103, dar nu reu\u0219e\u0219te. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/381818f189e19c3e1154074b4652f837.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i \u00een timpul acestor \u00eencerc\u0103ri, un semnal de immediate-shutdown ajunge la vechiul maestru. Maestrul se reporne\u0219te. \u0218i de asemenea, recuperarea se opre\u0219te, deoarece vechiul maestru iese din func\u021biune. Adic\u0103, replica nu se poate conecta la el, deoarece este \u00een modul de oprire. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/d8a8cde925fa8fe601d44ab908ae69dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La un moment dat a func\u021bionat, dar replicarea nu s-a activat. <\/p>\n<p><\/p>\n<p>Am o singur\u0103 ipotez\u0103, c\u0103 \u00een recovery.conf era adresa vechiului maestru. \u0218i c\u00e2nd a ap\u0103rut noul maestru, a doua replic\u0103 continua s\u0103 \u00eencerce s\u0103 se conecteze la vechiul maestru. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/425ea3af1f1e186f4760e1fb1f5419fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C\u00e2nd Patroni a pornit pe a doua replic\u0103, nodul s-a pornit, dar nu a putut s\u0103 se conecteze prin replicare. \u0218i a ap\u0103rut o \u00eent\u00e2rziere \u00een replicare care ar\u0103ta cam a\u0219a. Adic\u0103 toate cele trei noduri erau la locul lor, dar al doilea nod \u00eent\u00e2rziase. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/f564eacd9944666c9a3f5bea634ede6b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen acest timp, dac\u0103 ne uit\u0103m la logurile scrise, am putut observa c\u0103 replicarea nu se poate ini\u021bia deoarece jurnalele de tranzac\u021bii sunt diferite. \u0218i acele jurnale de tranzac\u021bii oferite de maestru, men\u021bionate \u00een recovery.conf, pur \u0219i simplu nu se potrivesc cu nodul nostru curent. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/6b09947d157c9ef0a190da2df2cb5892.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i aici am f\u0103cut o gre\u0219eal\u0103. Ar fi trebuit s\u0103 merg s\u0103 verific ce este \u00een recovery.conf, pentru a-mi verifica ipoteza c\u0103 ne conect\u0103m la un alt maestru. Dar, la acea vreme, abia \u00eenv\u0103\u021bam despre asta \u0219i acest lucru nu mi-a venit \u00een minte, ori am v\u0103zut c\u0103 replica \u00eent\u00e2rzie \u0219i va trebui s\u0103 o reconectez, adic\u0103 am abordat totul \u00eentr-un mod destul de superficial. A fost gre\u0219eala mea. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/159f2256fd81428fd0d82a255528887d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dup\u0103 30 de minute a venit administratorul, adic\u0103 am repornit Patroni pe replic\u0103. Eu deja renun\u021basem la ea, credeam c\u0103 va trebui s\u0103 o reconectez. \u0218i m-am g\u00e2ndit \u2013 o s\u0103 repornesc Patroni, poate va ie\u0219i ceva bun. A \u00eenceput procesul de recuperare. \u0218i baza de date s-a deschis, era gata s\u0103 accepte conexiuni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/aeac98750386c8389d39e006a229cc85.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Replicarea a pornit. Dar dup\u0103 un minut s-a oprit cu o eroare care spunea c\u0103 jurnalele de tranzac\u021bii nu se potrivesc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/17eaba000a79c80c29d1bc3902de05e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M-am g\u00e2ndit c\u0103 voi reporni din nou. Am repornit din nou Patroni, \u0219i nu am repornit Postgres, ci am repornit tocmai Patroni \u00een speran\u021ba c\u0103 va porni baza de date ca prin magie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/a85b38e033c45ad73da317f41e0ef24a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Replicarea a pornit din nou, dar marcajele din jurnalul de tranzac\u021bii erau diferite, nu erau cele care erau \u00een timpul \u00eencerc\u0103rii anterioare de pornire. Replicarea s-a oprit din nou. \u0218i mesajul era deja pu\u021bin diferit. \u0218i nu era foarte informativ pentru mine. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/fd90d708230bd54af685786c7e361ee1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i atunci mi-a venit \u00een minte \u2013 ce ar fi dac\u0103 a\u0219 reporni Postgres, \u00een acela\u0219i timp s\u0103 fac un checkpoint pe maestru, pentru a mi\u0219ca punctul \u00een jurnalul de tranzac\u021bii pu\u021bin mai departe, astfel \u00eenc\u00e2t recuperarea s\u0103 \u00eenceap\u0103 dintr-un alt moment? Plus c\u0103 mai aveam resurse WAL disponibile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/19e67f95d1a74141a013947c9aa39e38.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am repornit Patroni, am f\u0103cut c\u00e2teva checkpoints pe maestru, c\u00e2teva puncte de restart pe replic\u0103, c\u00e2nd s-a deschis. \u0218i asta a ajutat. M-am g\u00e2ndit mult de ce a ajutat \u0219i cum a func\u021bionat. \u0218i replicarea a fost ini\u021biat\u0103. \u0218i replicarea nu s-a mai \u00eentrerupt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/418ca59a681be84f51ed374a73a759c9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aceast\u0103 problem\u0103 pentru mine este una dintre cele mai misterioase, asupra c\u0103reia \u00eenc\u0103 m\u0103 g\u00e2ndesc, ce se \u00eent\u00e2mpla de fapt. <\/p>\n<p><\/p>\n<p>Ce concluzii putem trasa de aici? Patroni poate func\u021biona a\u0219a cum este planificat, f\u0103r\u0103 erori. Dar aceasta nu ofer\u0103 o garan\u021bie de 100%, c\u0103 totul este \u00een regul\u0103. Replica poate porni, dar poate fi \u00een stare semi-func\u021bional\u0103, iar aplica\u021bia nu poate lucra cu o astfel de replic\u0103, deoarece acolo vor fi date vechi. <\/p>\n<p><\/p>\n<p>Dup\u0103 fiecare failover, trebuie s\u0103 verific\u0103m \u00eentotdeauna dac\u0103 totul este \u00een regul\u0103 cu clusterul, adic\u0103 avem num\u0103rul necesar de replici \u0219i nu exist\u0103 \u00eent\u00e2rziere \u00een replicare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/aca7047ff33d3efe14071b798b554091.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pe parcursul analizei acestor probleme, voi formula recomand\u0103ri. Am \u00eencercat s\u0103 le combin \u00een dou\u0103 slide-uri. Probabil, toate povestirile ar fi putut fi unite \u00een dou\u0103 slide-uri \u0219i doar acestea s\u0103 fie prezentate.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/d4ad31b26d83c8846fe4097a11d70849.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C\u00e2nd folosi\u021bi Patroni, trebuie s\u0103 ave\u021bi monitorizare. Trebuie s\u0103 \u0219ti\u021bi \u00eentotdeauna c\u00e2nd a avut loc un failover automat, pentru c\u0103 dac\u0103 nu \u0219ti\u021bi c\u0103 a avut loc un failover automat, nu controla\u021bi clusterul. \u0218i asta este r\u0103u.<\/p>\n<p><\/p>\n<p>Dup\u0103 fiecare failover, trebuie s\u0103 verific\u0103m manual clusterul. Trebuie s\u0103 ne asigur\u0103m c\u0103 avem \u00eentotdeauna num\u0103rul corect de replici, c\u0103 nu exist\u0103 \u00eent\u00e2rziere \u00een replicare, c\u0103 \u00een loguri nu sunt erori legate de replicarea \u00een flux, de Patroni, de sistemul DCS.<\/p>\n<p><\/p>\n<p>Automatizarea poate func\u021biona cu succes, Patroni este un instrument foarte bun. Poate func\u021biona, dar acest lucru nu va duce clusterul \u00een starea dorit\u0103. \u0218i dac\u0103 nu afl\u0103m despre asta, vom avea probleme.<\/p>\n<p><\/p>\n<p>\u0218i Patroni nu este o solu\u021bie miraculoas\u0103. Trebuie s\u0103 avem o \u00een\u021belegere a modului \u00een care func\u021bioneaz\u0103 Postgres, cum func\u021bioneaz\u0103 replicarea \u0219i cum interac\u021bioneaz\u0103 Patroni cu Postgres, precum \u0219i modul \u00een care are loc comunicarea \u00eentre noduri. Acest lucru este necesar pentru a putea rezolva manual problemele ap\u0103rute.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/ea4162df3561d2ea7001f2ef6788eaaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum abordeaz\u0103 diagnosticarea? S-a \u00eent\u00e2mplat c\u0103 lucr\u0103m cu diferi\u021bi clien\u021bi \u0219i nimeni nu are un stack ELK, a\u0219a c\u0103 trebuie s\u0103 ne descurc\u0103m cu logurile, deschiz\u00e2nd 6 consoluri \u0219i 2 tab-uri. \u00centr-un tab, sunt logurile Patroni pentru fiecare nod, iar \u00een cel\u0103lalt tab sunt logurile Consul sau Postgres, dup\u0103 caz. Este foarte greu s\u0103 diagnostichez aceasta. <\/p>\n<p><\/p>\n<p>Ce abord\u0103ri am dezvoltat? \u00cen primul r\u00e2nd, am grij\u0103 s\u0103 privesc c\u00e2nd a avut loc failover-ul. Pentru mine, acesta este un punct de cotitur\u0103. M\u0103 uit la ce s-a \u00eent\u00e2mplat \u00eenainte de failover, \u00een timpul failover-ului \u0219i dup\u0103 failover. Failover-ul are dou\u0103 marcaje: ora de \u00eenceput \u0219i ora de sf\u00e2r\u0219it. <\/p>\n<p><\/p>\n<p>Apoi, m\u0103 uit \u00een jurnalele de evenimente \u00eenainte de failover, ceea ce a precedat failover-ul, adic\u0103 caut motivele pentru care a avut loc failover-ul. <\/p>\n<p><\/p>\n<p>\u0218i asta ofer\u0103 o imagine clar\u0103 despre ce s-a \u00eent\u00e2mplat \u0219i ce se poate face \u00een viitor pentru a preveni astfel de circumstan\u021be (\u0219i, prin urmare, a evita un failover).<\/p>\n<p><\/p>\n<p>\u0218i unde ne uit\u0103m de obicei? M\u0103 uit la:<\/p>\n<p><\/p>\n<ul>\n<li>\u00cen primul r\u00e2nd, la jurnalele Patroni. <\/li>\n<li>Apoi, m\u0103 uit la jurnalele Postgres sau la jurnalele DCS, \u00een func\u021bie de ce am g\u0103sit \u00een jurnalele Patroni. <\/li>\n<li>\u0218i jurnalele sistemului ofer\u0103 de asemenea uneori informa\u021bii despre ce a cauzat failover-ul. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/a53618e366020e1a550d852fc308c188.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum privesc eu Patroni? \u00cemi place foarte mult Patroni. \u00cen opinia mea, este cea mai bun\u0103 solu\u021bie disponibil\u0103 ast\u0103zi. \u0218tiu multe alte produse. Acestea sunt Stolon, Repmgr, Pg_auto_failover, PAF. 4 instrumente. Le-am \u00eencercat pe toate. Patroni mi-a pl\u0103cut cel mai mult. <\/p>\n<p><\/p>\n<p>Dac\u0103 cineva m\u0103 \u00eentreab\u0103: \u201eRecomand Patroni?\u201d. Voi r\u0103spunde c\u0103 da, pentru c\u0103 \u00eemi place Patroni. \u0218i cred c\u0103 am \u00eenv\u0103\u021bat s\u0103-l configurez. <\/p>\n<p><\/p>\n<p>Dac\u0103 sunte\u021bi interesa\u021bi s\u0103 vede\u021bi ce alte probleme pot ap\u0103rea cu Patroni, \u00een afar\u0103 de cele pe care le-am men\u021bionat, mereu pute\u021bi vizita pagina <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\/issues\/\">issues<\/a><\/noindex> de pe GitHub. Acolo sunt multe pove\u0219ti diferite \u0219i se discut\u0103 despre multe probleme interesante. \u0218i, \u00een final, unele bug-uri au fost raportate \u0219i rezolvate, adic\u0103 este o lectur\u0103 interesant\u0103. <\/p>\n<p><\/p>\n<p>Acolo sunt pove\u0219ti interesante despre cum oamenii \u00ee\u0219i dau singuri \u00een picior. Foarte instructiv. Cite\u0219ti \u0219i \u00een\u021belegi c\u0103 nu trebuie s\u0103 faci a\u0219a. Mi-am pus o bif\u0103. <\/p>\n<p><\/p>\n<p>\u0218i a\u0219 dori s\u0103 mul\u021bumesc companiei Zalando pentru c\u0103 dezvolt\u0103 acest proiect, adic\u0103 lui Alexandru Cucushkin \u0219i lui Aleksei Kliukin. Aleksei Kliukin este unul dintre co-autori, nu mai lucreaz\u0103 la Zalando, dar sunt dou\u0103 persoane care au \u00eenceput s\u0103 lucreze cu acest produs. <\/p>\n<p><\/p>\n<p>\u0218i consider c\u0103 Patroni este o solu\u021bie foarte tare. Sunt mul\u021bumit c\u0103 exist\u0103, este interesant de folosit. \u0218i mul\u021bumesc tuturor contribuitorilor care scriu patch-uri pentru Patroni. Sper c\u0103 Patroni va deveni mai matur, mai tare \u0219i mai eficient pe m\u0103sur\u0103 ce \u00eemb\u0103tr\u00e2ne\u0219te. Este deja func\u021bional, dar sper c\u0103 va deveni \u0219i mai bun. A\u0219adar, dac\u0103 planifica\u021bi s\u0103 folosi\u021bi Patroni, nu v\u0103 teme\u021bi. Este o solu\u021bie bun\u0103, o pute\u021bi implementa \u0219i folosi. <\/p>\n<p><\/p>\n<p>Asta este tot. Dac\u0103 ave\u021bi \u00eentreb\u0103ri, \u00eentreba\u021bi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea e\u0219ecurilor Patroni sau Cum s\u0103 pici clusterul t\u0103u PostgreSQL. Aleksei Lesovski\" src=\"\/wp-content\/uploads\/2020\/07\/85c2fef2455999b48413c9fc3b235ed6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00centreb\u0103ri<\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc pentru prezentare! Dac\u0103 dup\u0103 failover tot trebuie s\u0103 ne uit\u0103m acolo foarte atent, atunci de ce avem nevoie de un failover automat?<\/em> <\/p>\n<p><\/p>\n<p>Pentru c\u0103 este o nou\u0103 tehnologie. Lucr\u0103m cu ea de doar un an. Mai bine s\u0103 ne asigur\u0103m. Vrem s\u0103 intr\u0103m \u0219i s\u0103 vedem dac\u0103 totul a func\u021bionat a\u0219a cum trebuie. Este un nivel de ne\u00eencredere matur \u2013 mai bine s\u0103 verific\u0103m \u0219i s\u0103 ne asigur\u0103m. <\/p>\n<p><\/p>\n<p><em>De exemplu, am intrat diminea\u021ba \u0219i am verificat, nu?<\/em><\/p>\n<p><\/p>\n<p>Nu diminea\u021ba, de obicei afl\u0103m despre auto-failover aproape imediat. Primim notific\u0103ri, vedem c\u0103 a avut loc un auto-failover. Intru practic imediat \u0219i verific. Dar toate aceste verific\u0103ri ar trebui s\u0103 fie externalizate la nivelul de monitorizare. Dac\u0103 apel\u0103m la Patroni prin API REST, exist\u0103 un istoric. Din istoric putem observa timpii \u00een care a avut loc failover-ul. Pe baza acestuia putem crea un sistem de monitorizare. Putem observa isticul, c\u00e2te evenimente au avut loc. Dac\u0103 am avut o cre\u0219tere a evenimentelor, \u00eenseamn\u0103 c\u0103 a avut loc un auto-failover. Putem verifica. Sau automatizarea noastr\u0103 \u00een monitorizare a verificat c\u0103 toate replicile sunt la locul lor, nu este \u00eent\u00e2rziere \u0219i totul este \u00een regul\u0103. <\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc!<\/em><\/p>\n<p><\/p>\n<p><em>\u00ce\u021bi mul\u021bumesc foarte mult pentru povestea minunat\u0103! Dac\u0103 am mutat clusterul DCS undeva departe de clusterul Postgres, trebuie s\u0103 \u00eentre\u021binem acest cluster periodic? Care sunt cele mai bune practici pentru a opri anumite p\u0103r\u021bi ale clusterului DCS, pentru a face ceva cu ele etc.? Cum func\u021bioneaz\u0103 \u00eentreaga structur\u0103 \u00een acest caz? \u0218i cum ar trebui s\u0103 facem aceste lucruri?<\/em><\/p>\n<p><\/p>\n<p>Pentru o companie a fost necesar s\u0103 cre\u0103m o matrice a problemelor, care s\u0103 descrie ce se \u00eent\u00e2mpl\u0103 dac\u0103 unul sau mai multe componente e\u0219ueaz\u0103. Pe baza acestei matrici analiz\u0103m secven\u021bial toate componentele \u0219i construim scenarii pentru cazurile de e\u0219ec ale acestora. \u00cen consecin\u021b\u0103, pentru fiecare scenariu de e\u0219ec, putem avea un plan de ac\u021biune pentru recuperare. \u0218i \u00een cazul DCS, acesta este parte a infrastructurii standard. Administratorul se ocup\u0103 de administrare, iar noi ne baz\u0103m pe administratori, care se ocup\u0103 de aceasta \u0219i pe abilit\u0103\u021bile lui de a remedia problemele \u00een caz de urgen\u021b\u0103. Dac\u0103 DCS nu este disponibil, \u00eel implement\u0103m noi, dar \u00een acest caz nu ne monitoriz\u0103m foarte mult, deoarece nu ne asum\u0103m r\u0103spunderea pentru infrastructur\u0103, dar oferim recomand\u0103ri cu privire la ce \u0219i cum ar trebui s\u0103 monitoriz\u0103m. <\/p>\n<p><\/p>\n<p><em>Adic\u0103, am \u00een\u021beles corect c\u0103 trebuie s\u0103 dezactiv\u0103m Patroni, s\u0103 dezactiv\u0103m failover-ul, s\u0103 dezactiv\u0103m totul \u00eenainte de a face ceva cu gazdele?<\/em><\/p>\n<p><\/p>\n<p>Acesta depinde de c\u00e2te noduri avem \u00een clusterul DCS. Dac\u0103 sunt multe noduri \u0219i dac\u0103 dezactiv\u0103m doar unul dintre noduri (replica), atunci clusterul p\u0103streaz\u0103 cvorumul. \u0218i Patroni r\u0103m\u00e2ne func\u021bional. \u0218i nimic nu se declan\u0219eaz\u0103. Dac\u0103 avem opera\u021biuni complexe care afecteaz\u0103 mai multe noduri, absen\u021ba c\u0103rora poate distruge cvorumul, atunci - da, poate merit\u0103 s\u0103 punem Patroni pe pauz\u0103. Are comanda corespunz\u0103toare - patronictl pause, patronictl resume. Pur \u0219i simplu punem pe pauz\u0103, iar failover-ul automat nu se activeaz\u0103 \u00een acest timp. Facem \u00eentre\u021binere pe clusterul DCS, apoi ridic\u0103m pauza \u0219i continu\u0103m activitatea.<\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc foarte mult!<\/em><\/p>\n<p><\/p>\n<p><em>V\u0103 mul\u021bumesc mult pentru prezentare! Cum consider\u0103 echipa de produs c\u0103 poate fi pierdut\u0103 informa\u021bia?<\/em> <\/p>\n<p><\/p>\n<p>Echipele de produs nu \u00eei pas\u0103, dar \u0219efii de echip\u0103 se \u00eengrijoreaz\u0103. <\/p>\n<p><\/p>\n<p><em>Ce garan\u021bii sunt disponibile acolo?<\/em><\/p>\n<p><\/p>\n<p>Garan\u021biile sunt foarte dificile. Exist\u0103 o prezentare de Alexandr Kukushkin \u201eCum s\u0103 calcul\u0103m RPO \u0219i RTO\u201d, adic\u0103 timpul de recuperare \u0219i c\u00e2t de multe date putem pierde. Cred c\u0103 trebuie s\u0103 g\u0103sim aceste slide-uri \u0219i s\u0103 le studiem. Din c\u00e2te \u00eemi amintesc, acolo sunt pa\u0219i specifici despre cum s\u0103 facem aceste calcule. C\u00e2te tranzac\u021bii putem pierde, c\u00e2te date putem pierde. Ca op\u021biune putem folosi replicarea sincron\u0103 la nivelul Patroni, dar este o sabie cu dou\u0103 t\u0103i\u0219uri: fie avem fiabilitate a datelor, fie pierdem \u00een vitez\u0103. Exist\u0103 replicare sincron\u0103, dar nici aceasta nu garanteaz\u0103 o protec\u021bie de 100% \u00eempotriva pierderii de date.<\/p>\n<p><\/p>\n<p><em>Alexei, mul\u021bumesc pentru prezentarea excelent\u0103! Ave\u021bi experien\u021b\u0103 \u00een utilizarea Patroni pentru protec\u021bie de nivel zero? Adic\u0103, \u00een combina\u021bie cu standby sincron? Aceasta este prima \u00eentrebare. \u0218i a doua \u00eentrebare. A\u021bi folosit diferite solu\u021bii. Noi am folosit Repmgr, dar f\u0103r\u0103 failover automat \u0219i acum pl\u0103nuim s\u0103 conect\u0103m failover-ul automat. \u0218i lu\u0103m \u00een considerare Patroni ca solu\u021bie alternativ\u0103. Ce pute\u021bi spune ca avantaje \u00een compara\u021bie cu Repmgr?<\/em><\/p>\n<p><\/p>\n<p>Prima \u00eentrebare a fost despre replicile sincrone. Nimeni dintre noi nu folose\u0219te replicarea sincron\u0103, pentru c\u0103 tuturor le este fric\u0103 (Deja o folosesc c\u00e2\u021biva clien\u021bi, nu au observat probleme de performan\u021b\u0103 \u00een principiu - <em>Comentariul prezentatorului<\/em>). Dar pentru noi, am stabilit regula ca \u00een clusterul de replicare sincron\u0103 s\u0103 fie minimum trei noduri, pentru c\u0103, dac\u0103 avem dou\u0103 noduri \u0219i masterul sau replica ie\u0219e\u0219tep din func\u021biune, Patroni transform\u0103 acest nod \u00een mod Standalone, astfel \u00eenc\u00e2t aplica\u021bia s\u0103 continue s\u0103 func\u021bioneze. \u00cen acest caz exist\u0103 riscuri de pierdere a datelor.<\/p>\n<p><\/p>\n<p>Referitor la a doua \u00eentrebare, am folosit Repmgr \u0219i continu\u0103m s\u0103-l folosim \u00een unele cazuri la clien\u021bi din motive istorice. Ce se poate spune? \u00cen Patroni, failover-ul automat este integrat, \u00een timp ce \u00een Repmgr, acesta vine ca o op\u021biune suplimentar\u0103 care trebuie activat\u0103. Trebuie s\u0103 pornim daemonul Repmgr pe fiecare nod \u0219i atunci putem configura failover-ul automat. <\/p>\n<p><\/p>\n<p>Repmgr verific\u0103 dac\u0103 nodurile Postgres sunt active. Procesele Repmgr verific\u0103 existen\u021ba reciproc\u0103, ceea ce nu este un mod foarte eficient, deoarece pot ap\u0103rea cazuri complicate de izolare a re\u021belei \u00een care un mare cluster Repmgr se poate diviza \u00een mai multe mici \u0219i continua s\u0103 func\u021bioneze. Nu am urm\u0103rit Repmgr de mult timp, poate c\u0103 au rezolvat asta... sau poate nu. Dar extragerea informa\u021biilor despre starea clusterului \u00een DCS, a\u0219a cum face Stolon, Patroni, este cea mai viabil\u0103 op\u021biune. <\/p>\n<p><\/p>\n<p><em>Alexei, am o \u00eentrebare, poate fi considerat\u0103 naiv\u0103. \u00cen unul dintre primele exemple DCS a\u021bi mutat de pe ma\u0219ina local\u0103 pe un nod de distan\u021b\u0103. \u00cen\u021belegem c\u0103 re\u021beaua este un element care are propriile sale particularit\u0103\u021bi, ea tr\u0103ie\u0219te de la sine. \u0218i ce se \u00eent\u00e2mpl\u0103 dac\u0103 dintr-un anumit motiv clusterul DCS devine inaccesibil? Nu voi detalia cauzele, pot fi multe: de la gre\u0219elile re\u021belistilor p\u00e2n\u0103 la problemele reale.<\/em> <\/p>\n<p><\/p>\n<p>Nu am men\u021bionat asta cu voce tare, dar clusterul DCS trebuie s\u0103 fie, de asemenea, tolerant la defecte, adic\u0103 s\u0103 aib\u0103 un num\u0103r impar de noduri, astfel \u00eenc\u00e2t s\u0103 poat\u0103 fi ob\u021binut un quorum. Ce se \u00eent\u00e2mpl\u0103 dac\u0103 clusterul DCS devine inaccesibil sau nu poate ob\u021bine quorumul, adic\u0103 exist\u0103 o \u00eemp\u0103r\u021bire a re\u021belei sau o defec\u021biune a nodurilor? \u00cen acest caz, clusterul Patroni trece \u00een modul de citire. Clusterul Patroni nu poate determina starea clusterului \u0219i ce s\u0103 fac\u0103. Nu se poate conecta la DCS \u0219i salva noua stare a clusterului, prin urmare \u00eentreg clusterul trece \u00een modul de citire. \u0218i a\u0219teapt\u0103 fie o interven\u021bie manual\u0103 din partea operatorului, fie restaurarea DCS.<\/p>\n<p><\/p>\n<p><em>Pe scurt, DCS devine pentru noi un serviciu la fel de important ca \u0219i baza de date \u00een sine?<\/em><\/p>\n<p><\/p>\n<p>Da, da. \u00cen foarte multe companii moderne, Service Discovery este o parte integrant\u0103 a infrastructurii. Acesta este implementat chiar \u00eenainte ca baza de date s\u0103 apar\u0103 \u00een infrastructur\u0103. Cu alte cuvinte, infrastructura a fost lansat\u0103, datacenterele au fost desf\u0103\u0219urate, iar noi avem deja Service Discovery. Dac\u0103 este vorba despre Consul, atunci pe acesta poate fi construit \u0219i DNS-ul. Dac\u0103 este Etcd, atunci poate face parte din clusterul Kubernetes, \u00een care se va desf\u0103\u0219ura tot restul. Mi se pare c\u0103 Service Discovery este deja o parte indispensabil\u0103 a infrastructurilor moderne. \u0218i la aceasta se g\u00e2ndesc mult mai devreme dec\u00e2t la bazele de date. <\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc!<\/em><\/p>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/512768\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c Patroni \u2014 \u044d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 High Availability \u0434\u043b\u044f PostgreSQL. \u041d\u043e Patroni \u2014 \u044d\u0442\u043e \u043b\u0438\u0448\u044c template, \u0430 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 (\u0447\u0442\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0438 \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438). \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0432 Patroni \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043b\u0430\u0431\u0435, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u043a\u0430\u043a \u043e\u043d \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0448\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0440\u0430\u0437\u0432\u0430\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":90104,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-90103","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Patroni Failure Stories or How to crash your PostgreSQL cluster. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041b\u0435\u0441\u043e\u0432\u0441\u043a\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij\" \/>\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-07-29T11:42:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-29T11:42:32+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\udd47Pove\u0219tile despre e\u0219ecurile Patroni sau Cum s\u0103 creezi o criz\u0103 \u00een clusterul t\u0103u PostgreSQL. Alexey Lesovski | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Patroni Failure Stories or How to crash your PostgreSQL cluster. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041b\u0435\u0441\u043e\u0432\u0441\u043a\u0438\u0439 | ProHoster","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","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-07-29T11:42:32+00:00","article:modified_time":"2020-07-29T11:42:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"90103","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:58:48","updated":"2026-02-09 16:50:35","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/90103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=90103"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/90103\/revisions"}],"predecessor-version":[{"id":158759,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/90103\/revisions\/158759"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/90104"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=90103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=90103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=90103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}