{"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\/sv\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","title":{"rendered":"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/6404cba13214f499d1f347cca0aacbe7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Huvudsyftet med Patroni \u00e4r att s\u00e4kerst\u00e4lla h\u00f6g tillg\u00e4nglighet f\u00f6r PostgreSQL. Men Patroni \u00e4r bara en mall, inte ett f\u00e4rdigt verktyg (vilket ocks\u00e5 anges i dokumentationen). Vid f\u00f6rsta anblicken, n\u00e4r man st\u00e4ller in Patroni i en testmilj\u00f6, kan man se hur bra det \u00e4r som verktyg och hur enkelt det hanterar v\u00e5ra f\u00f6rs\u00f6k att f\u00f6rst\u00f6ra klustret. Men i praktiken, i produktionsmilj\u00f6er, g\u00e5r det inte alltid s\u00e5 vackert och elegant som i testmilj\u00f6n.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/ff445e6d76a2ad46a232b705e104446f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag ska ber\u00e4tta lite om mig sj\u00e4lv. Jag b\u00f6rjade som systemadministrat\u00f6r. Jag har arbetat med webbutveckling. Sedan 2014 arbetar jag p\u00e5 Data Egret. F\u00f6retaget sysslar med konsultverksamhet inom Postgres. Vi underh\u00e5ller just Postgres och arbetar med Postgres varje dag, s\u00e5 vi har olika expertiser relaterade till drift. <\/p>\n<p><\/p>\n<p>I slutet av 2018 b\u00f6rjade vi l\u00e5ngsamt anv\u00e4nda Patroni. Och vi har samlat p\u00e5 oss en viss erfarenhet. Vi har p\u00e5 n\u00e5got s\u00e4tt diagnostiserat det, optimerat det, och kommit fram till v\u00e5ra b\u00e4sta metoder. I den h\u00e4r presentationen kommer jag att ber\u00e4tta om dem.<\/p>\n<p><\/p>\n<p>F\u00f6rutom Postgres \u00e4lskar jag Linux. Jag gillar att gr\u00e4va i det och utforska, \u00e4lskar att kompilera k\u00e4rnor. Jag gillar virtualisering, containrar, Docker, Kubernetes. Allt detta intresserar mig eftersom det p\u00e5verkas av gamla administrativa vanor. Jag \u00e4lskar att \u00e4gna mig \u00e5t \u00f6vervakningar. Och jag \u00e4lskar postgres-relaterade uppgifter som administration, det vill s\u00e4ga replikering, s\u00e4kerhetskopiering. P\u00e5 min fritid skriver jag i Go. Jag \u00e4r ingen mjukvaruingenj\u00f6r, jag skriver bara f\u00f6r mig sj\u00e4lv i Go. Och det ger mig gl\u00e4dje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/02cfd9293af5a8410c91e39afe2c75e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Jag tror m\u00e5nga av er vet att Postgres inte har HA (h\u00f6g tillg\u00e4nglighet) ur l\u00e5dan. F\u00f6r att f\u00e5 HA m\u00e5ste man installera n\u00e5got, konfigurera det, l\u00e4gga ner en viss anstr\u00e4ngning och f\u00e5 det. <\/li>\n<li>Det finns flera verktyg och Patroni \u00e4r ett av dem, som l\u00f6ser HA ganska bra och effektivt. Men n\u00e4r vi s\u00e4tter upp allt i testmilj\u00f6n och k\u00f6r det, kan vi se att allt fungerar, vi kan \u00e5terskapa vissa problem och se hur Patroni hanterar dem. Och vi kommer att se att allt fungerar utm\u00e4rkt. <\/li>\n<li>Men i praktiken har vi st\u00f6tt p\u00e5 olika problem. Och jag kommer att ber\u00e4tta om dessa problem.<\/li>\n<li>Jag ska ber\u00e4tta hur vi diagnostiserade detta, vad vi justerade \u2013 om det hj\u00e4lpte oss eller inte. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/7126b45b40dd08521e80a3c150382bec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Jag kommer inte att ber\u00e4tta hur man installerar Patroni, f\u00f6r det kan man enkelt googla p\u00e5 n\u00e4tet, eller titta p\u00e5 konfigurationsfilerna f\u00f6r att f\u00f6rst\u00e5 hur allt startar och st\u00e4lls in. Man kan \u00e4ven f\u00f6rst\u00e5 scheman och arkitekturer genom att hitta information om detta online. <\/li>\n<li>Jag kommer inte att prata om andras erfarenheter. Jag kommer endast att ber\u00e4tta om de problem vi har st\u00f6tt p\u00e5. <\/li>\n<li>Och jag kommer inte att prata om problem som ligger utanf\u00f6r Patroni och PostgreSQL. Om det till exempel r\u00f6r sig om problem relaterade till belastningsutj\u00e4mning, n\u00e4r v\u00e5r kluster kollapsade, kommer jag inte att ber\u00e4tta om det. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/3f8d179e7c78ce83e8842ef5c72fe30d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och en liten disclaimer innan vi b\u00f6rjar v\u00e5r presentation. <\/p>\n<p><\/p>\n<p>Alla dessa problem som vi st\u00f6tte p\u00e5 intr\u00e4ffade under de f\u00f6rsta 6-7-8 m\u00e5naderna av drifts\u00e4ttning. Med tiden kom vi fram till v\u00e5ra interna b\u00e4sta metoder. Och problemen f\u00f6rsvann. D\u00e4rf\u00f6r presenterades f\u00f6redraget f\u00f6r ungef\u00e4r ett halv\u00e5r sedan, n\u00e4r detta fortfarande var f\u00e4rskt i minnet och jag kom ih\u00e5g allt klart. <\/p>\n<p><\/p>\n<p>Under f\u00f6rberedelserna av f\u00f6redraget har jag redan g\u00e5tt igenom gamla postmortem-rapporter och tittat p\u00e5 loggar. Och vissa detaljer kan ha gl\u00f6mts bort, eller vissa detaljer kan ha varit otillr\u00e4ckligt unders\u00f6kta under problemanalysen, s\u00e5 det kan verka som om vissa problem inte har behandlats helt eller att det finns brist p\u00e5 information. S\u00e5 jag ber om urs\u00e4kt f\u00f6r det. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/30d414284a41fcbc3bf417c9da28ca52.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vad \u00e4r Patroni?<\/p>\n<p><\/p>\n<ul>\n<li>Det \u00e4r en mall f\u00f6r att skapa h\u00f6g tillg\u00e4nglighet (HA). S\u00e5 st\u00e5r det i dokumentationen. Och fr\u00e5n min synvinkel \u00e4r det en mycket korrekt precisering. Patroni \u00e4r inte en silverkula som l\u00f6ser alla dina problem, det vill s\u00e4ga att det kr\u00e4vs anstr\u00e4ngning f\u00f6r att f\u00e5 det att fungera och ge nytta. <\/li>\n<li>Det \u00e4r en agenttj\u00e4nst som installeras p\u00e5 varje tj\u00e4nst med databasen, och som fungerar som en slags init-system f\u00f6r din Postgres. Den startar Postgres, stoppar den, startar om den, \u00e4ndrar konfiguration och f\u00f6r\u00e4ndrar topologin av din kluster. <\/li>\n<li>F\u00f6r att lagra klusterstatus, dess nuvarande representation och hur det ser ut, beh\u00f6vs ett lagringsutrymme. Och i detta avseende har Patroni valt att lagra tillst\u00e5ndet i ett externt system. Det \u00e4r ett system f\u00f6r distribuerad konfigurationlagring. Det kan vara Etcd, Consul, ZooKeeper eller Kubernetes' Etcd, det vill s\u00e4ga n\u00e5got av dessa alternativ. <\/li>\n<li>En av funktionerna i Patroni \u00e4r att du f\u00e5r en auto-failover direkt ur l\u00e5dan, bara genom att konfigurera det. J\u00e4mf\u00f6r man med Repmgr s\u00e5 ing\u00e5r failover d\u00e4r som en del av paketet. Med Repmgr f\u00e5r vi en switchover, men om vi vill ha en auto-failover m\u00e5ste vi konfigurera det separat. I Patroni finns auto-failover redan inbyggt.<\/li>\n<li>Och det finns m\u00e5nga andra saker. Till exempel, hantering av konfigurationer, installation av nya repliker, s\u00e4kerhetskopiering, osv. Men det ligger utanf\u00f6r f\u00f6redraget, s\u00e5 det kommer jag inte att t\u00e4cka. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/fed0f1ce931df99ca76ae1116f8098cc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En liten sammanfattning \u00e4r att den huvudsakliga uppgiften med Patroni \u00e4r att p\u00e5 ett bra och p\u00e5litligt s\u00e4tt genomf\u00f6ra auto-failover s\u00e5 att klustret f\u00f6rblir funktionellt och applikationen inte m\u00e4rker n\u00e5gra f\u00f6r\u00e4ndringar i kluster-topologin. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/fac52620957efa47ced330e7cc8084e0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men n\u00e4r vi b\u00f6rjar anv\u00e4nda Patroni blir v\u00e5rt system lite mer komplext. Om vi tidigare hade Postgres s\u00e5 f\u00e5r vi nu Patroni, en DCS d\u00e4r status lagras. Allt detta m\u00e5ste fungera p\u00e5 n\u00e5got s\u00e4tt. S\u00e5 vad kan g\u00e5 fel?<\/p>\n<p><\/p>\n<p>Det som kan g\u00e5 fel:<\/p>\n<p><\/p>\n<ul>\n<li>Postgres kan g\u00e5 fel. Det kan vara master eller en replika, n\u00e5got av dem kan sluta fungera. <\/li>\n<li>Sj\u00e4lva Patroni kan g\u00e5 fel. <\/li>\n<li>DCS:en d\u00e4r statusen lagras kan g\u00e5 fel.<\/li>\n<li>Och n\u00e4tverket kan ocks\u00e5 g\u00e5 fel. <\/li>\n<\/ul>\n<p><\/p>\n<p>Alla dessa punkter kommer jag att diskutera i f\u00f6redraget. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/1aeaf46d37bf1935b514b0581e0dbd0b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag kommer att g\u00e5 igenom fallen i takt med att de blir mer komplexa, inte utifr\u00e5n perspektivet att fallet involverar m\u00e5nga komponenter. Utan utifr\u00e5n subjektiva k\u00e4nslor, d\u00e4r ett fall k\u00e4ndes sv\u00e5rt och det var utmanande att analysera... och omv\u00e4nt, ett annat fall k\u00e4ndes enkelt och var l\u00e4tt att analysera. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/65b0c98bf2284610e955ced5eb998f39.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det f\u00f6rsta fallet \u00e4r det enklaste. Det \u00e4r det fallet d\u00e4r vi har tagit en databas-kluster och p\u00e5 samma kluster har vi installerat v\u00e5r DCS-lagring. Det h\u00e4r \u00e4r det vanligaste misstaget. Det \u00e4r ett arkitekturfel, dvs. att kombinera olika komponenter p\u00e5 ett och samma st\u00e4lle. <\/p>\n<p><\/p>\n<p>S\u00e5, en failover intr\u00e4ffade, l\u00e5t oss ta reda p\u00e5 vad som h\u00e4nde. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/244b69d623fe2205c2d9ed2aa4620067.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e4r \u00e4r vi intresserade av n\u00e4r failovern intr\u00e4ffade. Det vill s\u00e4ga, vi \u00e4r intresserade av den tidpunkten n\u00e4r statusf\u00f6r\u00e4ndringen i klustret intr\u00e4ffade. <\/p>\n<p><\/p>\n<p>Men failovern \u00e4r inte alltid \u00f6gonblicklig, dvs. den tar inte en enhet av tid, utan den kan dra ut p\u00e5 tiden. Den kan vara l\u00e5ngvarig.<\/p>\n<p><\/p>\n<p>D\u00e4rf\u00f6r har det b\u00e5de en starttid och en sluttid, det vill s\u00e4ga det \u00e4r en l\u00e5ngvarig h\u00e4ndelse. Vi delar in alla h\u00e4ndelser i tre intervall: vi har tiden f\u00f6re failover, under failover och efter failover. Det vill s\u00e4ga vi betraktar alla h\u00e4ndelser p\u00e5 denna tidslinje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a0ed61afe55d1a157147e0d80b17e5d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och det f\u00f6rsta vi g\u00f6r n\u00e4r failovern intr\u00e4ffar \u00e4r att s\u00f6ka orsaken till vad som h\u00e4nde, vad som ledde till failovern. <\/p>\n<p><\/p>\n<p>Om vi tittar p\u00e5 loggarna, s\u00e5 \u00e4r det klassiska Patroni-loggar. D\u00e4r informerar den oss om att servern har blivit master och rollen som master har \u00f6verg\u00e5tt till denna nod. H\u00e4r \u00e4r det markerat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/9998c69f7d0d4358b277f4e0e7b4350f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vidare beh\u00f6ver vi f\u00f6rst\u00e5 varf\u00f6r failovern intr\u00e4ffade, vilket vill s\u00e4ga vilka h\u00e4ndelser som ledde till att rollen som master flyttades fr\u00e5n en nod till en annan. Och i det h\u00e4r fallet \u00e4r det v\u00e4ldigt enkelt. Vi har ett fel i kommunikationen med lagringssystemet. Mastern ins\u00e5g att den inte kunde arbeta med DCS, det vill s\u00e4ga det uppstod n\u00e5got problem i kommunikationen. Och den s\u00e4ger att den inte kan vara master l\u00e4ngre och avs\u00e4ger sig sina befogenheter. Denna rad \"demoted self\" handlar just om det. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/4a8eca27689546b4b0fc3c666a3c37c4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om vi tittar p\u00e5 h\u00e4ndelserna som f\u00f6regick failovern, kan vi se just de orsaker som blev problematiska f\u00f6r att mastern skulle kunna forts\u00e4tta att arbeta. <\/p>\n<p><\/p>\n<p>Om vi tittar p\u00e5 Patroni-loggarna, ser vi att vi har massor av olika fel, timeoutar, det vill s\u00e4ga Patroni-agenten kan inte arbeta med DCS. I det h\u00e4r fallet \u00e4r det Consul-agenten med vilken vi kommunicerar via port 8500. <\/p>\n<p><\/p>\n<p>Och problemet h\u00e4r \u00e4r att Patroni och databasen k\u00f6rs p\u00e5 samma v\u00e4rd. Och p\u00e5 denna nod k\u00f6rdes ocks\u00e5 Consul-servrarna. Genom att belasta servern skapade vi problem \u00e4ven f\u00f6r <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sv\/server\/\"   title=\"servrar\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1515\">servrar<\/a> Consul. De kunde inte kommunicera normalt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/0d8dba6641809560e6b32825d481e30b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Efter en viss tid, n\u00e4r belastningen hade minskat, kunde v\u00e5r Patroni \u00e5terigen kommunicera med agenterna. Den normala driften \u00e5terupptogs. Och samma server Pgdb-2 blev \u00e5ter master. Det vill s\u00e4ga det blev en liten flip som gjorde att noden avsade sig sina befogenheter som master och sedan tog dem \u00e5ter, det vill s\u00e4ga allt \u00e5tergick till det normala. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/131b93e0bd83099e1b99b53742419e13.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och detta kan ses som en falsk aktivering, eller s\u00e5 kan det ses som att Patroni gjorde allt r\u00e4tt. Det vill s\u00e4ga den ins\u00e5g att den inte kunde uppr\u00e4tth\u00e5lla klusterstatusen och avsade sig sina befogenheter.<\/p>\n<p><\/p>\n<p>Och h\u00e4r uppstod problemet eftersom Consul-servrarna finns p\u00e5 samma utrustning som databaserna. D\u00e4rf\u00f6r p\u00e5verkar all belastning, oavsett om det \u00e4r belastning p\u00e5 diskar eller processorer, interaktionen med Consul-klustret.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/142c7cf839c8da078451f7ba9d5499e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och vi best\u00e4mde att detta inte skulle leva tillsammans, s\u00e5 vi skapade en separat kluster f\u00f6r Consul. Och Patroni fungerade redan med en separat Consul, det vill s\u00e4ga det fanns en separat Postgres-kluster och en separat Consul-kluster. Det h\u00e4r \u00e4r en grundl\u00e4ggande instruktion f\u00f6r hur man ska dela upp allt detta och h\u00e5lla det separerat s\u00e5 att det inte lever tillsammans. <\/p>\n<p><\/p>\n<p>Som ett alternativ kan man justera parametrarna ttl, loop_wait, retry_timeout, det vill s\u00e4ga f\u00f6rs\u00f6ka \u00f6vervinna dessa kortvariga belastningsspikar genom att \u00f6ka dessa parametrar. Men detta \u00e4r inte det mest l\u00e4mpliga alternativet, eftersom denna belastning kan vara l\u00e5ngvarig. Och vi kommer helt enkelt att \u00f6verskrida gr\u00e4nserna f\u00f6r dessa parametrar. Och detta kan kanske inte hj\u00e4lpa helt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/c51f35dcd88b1c792acec231c0c6c66c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det f\u00f6rsta problemet, som ni f\u00f6rst\u00e5r, \u00e4r enkelt. Vi tog och lade DCS tillsammans med databasen, vilket ledde till ett problem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/cc2a98d9790441577fb4080406cbc53f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det andra problemet liknar det f\u00f6rsta. Det liknar det genom att vi \u00e5terigen har interaktionsproblem med DCS-systemet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/e5c01b105adca48cc620085db8dd2d2b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om vi tittar p\u00e5 loggarna ser vi att vi \u00e5terigen f\u00e5r kommunikationsfel. Och Patroni s\u00e4ger att jag inte kan interagera med DCS, d\u00e4rf\u00f6r g\u00e5r den aktuella masterinstansen in i replikeringsl\u00e4ge.<\/p>\n<p><\/p>\n<p>Den gamla mastern blir en replik, h\u00e4r fungerar Patroni som det ska. Den k\u00f6r pg_rewind f\u00f6r att backa transaktionsloggen och sedan ansluta till den nya mastern f\u00f6r att hinna ikapp den nya mastern. H\u00e4r fungerar Patroni som den ska. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/29255f4790abb15b64dbf9ee0b41c7fc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e4r m\u00e5ste vi hitta den plats som f\u00f6regick filsystemet, det vill s\u00e4ga de fel som orsakat problemet med filsystemet. I detta avseende \u00e4r det ganska bekv\u00e4mt att arbeta med loggarna i Patroni. Den skriver samma meddelanden med best\u00e4mda intervall. Och om vi b\u00f6rjar bl\u00e4ddra snabbt genom dessa loggar, ser vi att loggarna har \u00e4ndrats, vilket betyder att n\u00e5gra problem har b\u00f6rjat. Vi g\u00e5r snabbt tillbaka till den platsen och ser vad som h\u00e4nder. <\/p>\n<p><\/p>\n<p>Och i en normal situation ser loggarna ut ungef\u00e4r s\u00e5 h\u00e4r. \u00c4garen av l\u00e5set kontrolleras. Och om \u00e4garen exempelvis har \u00e4ndrats kan vissa h\u00e4ndelser intr\u00e4ffa som Patroni m\u00e5ste reagera p\u00e5. Men i detta fall har vi allt i ordning. Vi letar efter den punkt d\u00e4r felen b\u00f6rjade. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f48ebd22a405f5b2900621451c68f543.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och n\u00e4r vi bl\u00e4ddrar fram till den punkt d\u00e4r felen b\u00f6rjade dyka upp, ser vi att vi har haft en auto-failover. Eftersom v\u00e5ra fel var relaterade till interaktionen med DCS och i v\u00e5rt fall anv\u00e4nde vi Consul, kollar vi \u00e4ven loggarna i Consul f\u00f6r att se vad som h\u00e4nde d\u00e4r. <\/p>\n<p><\/p>\n<p>Genom att ungef\u00e4r matcha tiden f\u00f6r failovern med tiden i Consuls loggar, ser vi att v\u00e5ra grannar i Consul-klustret b\u00f6rjade tvivla p\u00e5 existensen av andra deltagare i Consul-klustret.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/63b02ac5b4f5a34a2822f1eee2b1f2f8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och om vi dessutom tittar p\u00e5 loggarna fr\u00e5n andra Consul-agenter, ser vi ocks\u00e5 att det verkar ske en viss n\u00e4tverkssammanbrott. Och alla deltagare i Consul-klustret tvivlar p\u00e5 varandras existens. Detta ledde till failovern. <\/p>\n<p><\/p>\n<p>Om vi tittar p\u00e5 vad som h\u00e4nde f\u00f6re dessa fel, kan vi se att det finns olika typer av fel, till exempel deadline, RPC-fel, det vill s\u00e4ga tydligt ett problem med interaktionen mellan deltagarna i Consul-klustret. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/b15c912f2afb49d9d85e7bb9361ce449.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det enklaste svaret \u00e4r att reparera n\u00e4tverket. Men f\u00f6r mig, medan jag st\u00e5r p\u00e5 podiet, \u00e4r det l\u00e4tt att p\u00e5st\u00e5 detta. Men omst\u00e4ndigheterna \u00e4r s\u00e5dana att best\u00e4llaren inte alltid kan till\u00e5ta sig att reparera n\u00e4tverket. Han kan bo i datacentret och kan sakna m\u00f6jligheter att laga n\u00e4tverket eller p\u00e5verka utrustningen. Och d\u00e4rf\u00f6r beh\u00f6ver vi andra alternativ. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/1dbdb66233acc3bc321a30a1c5fe14f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alternativ finns:<\/p>\n<p><\/p>\n<ul>\n<li>Det enklaste alternativet, som st\u00e5r skrivet, tror jag till och med i dokumentationen, \u00e4r att st\u00e4nga av Consul-kontroller, det vill s\u00e4ga att helt enkelt \u00f6verf\u00f6ra en tom array. Och vi s\u00e4ger till Consul-agenten att inte anv\u00e4nda n\u00e5gra kontroller. Genom dessa kontroller kan vi ignorera dessa n\u00e4tverksstormar och undvika att initiera failovern. <\/li>\n<li>Ett annat alternativ \u00e4r att dubbelkolla raft_multiplier. Detta \u00e4r en parameter f\u00f6r sj\u00e4lva Consul-servern. Som standard \u00e4r den inst\u00e4lld p\u00e5 v\u00e4rde 5. Detta v\u00e4rde rekommenderas enligt dokumentationen f\u00f6r staging-milj\u00f6er. I sj\u00e4lva verket p\u00e5verkar detta frekvensen av meddelandeutbyte mellan deltagarna i Consul-n\u00e4tverket. I praktiken p\u00e5verkar denna parameter hastigheten p\u00e5 kommunikationen mellan deltagarna i Consul-klustret. Och f\u00f6r produktion rekommenderas det att minska den s\u00e5 att noderna oftare utbyter meddelanden. <\/li>\n<li>Ett annat alternativ som vi har b\u00f6rjat anv\u00e4nda \u00e4r att \u00f6ka prioriteten f\u00f6r Consul-processer bland andra processer f\u00f6r operativsystemets schemal\u00e4ggare. Det finns en parameter som heter \"nice\", som definierar processen prioritet som tas i beaktande av OS-schemal\u00e4ggaren vid schemal\u00e4ggning. Vi justerade och s\u00e4nkte v\u00e4rdet f\u00f6r nice f\u00f6r Consul-agenterna, det vill s\u00e4ga vi h\u00f6jde prioriteten, s\u00e5 att operativsystemet ger Consul-processerna mer tid f\u00f6r att arbeta och k\u00f6ra sin kod. I v\u00e5rt fall l\u00f6ste detta v\u00e5rt problem. <\/li>\n<li>Ett annat alternativ \u00e4r att inte anv\u00e4nda Consul. Jag har en v\u00e4n som \u00e4r stor anh\u00e4ngare av Etcd. Och vi diskuterar regelbundet vilken som \u00e4r b\u00e4ttre, Etcd eller Consul. Men n\u00e4r det kommer till vilket som \u00e4r b\u00e4ttre, brukar vi vanligtvis vara \u00f6verens om att Consul har en agent som m\u00e5ste k\u00f6ras p\u00e5 varje nod med databasen. Det vill s\u00e4ga, interaktionen mellan Patroni och Consul-klustret g\u00e5r genom denna agent. Och den h\u00e4r agenten blir en flaskhals. Om det h\u00e4nder n\u00e5got med agenten kan inte Patroni arbeta med Consul-klustret. Och detta \u00e4r ett problem. N\u00e4r det g\u00e4ller Etcd finns det ingen agent. Patroni kan arbeta direkt med listan \u00f6ver Etcd-servrar och kommunicera med dem. I det avseendet, om du anv\u00e4nder Etcd i ditt f\u00f6retag, s\u00e5 \u00e4r Etcd f\u00f6rmodligen det b\u00e4sta valet j\u00e4mf\u00f6rt med Consul. Men vi \u00e4r alltid begr\u00e4nsade av vad kunden har valt och anv\u00e4nder. Och hos v\u00e5ra kunder har vi mestadels Consul. <\/li>\n<li>Och den sista punkten \u00e4r att se \u00f6ver v\u00e4rdena f\u00f6r parametrarna. Vi kan \u00f6ka dessa parametrar st\u00f6rre i hopp om att v\u00e5ra kortvariga n\u00e4tverksproblem kommer att vara kortvariga och inte \u00f6verstiga intervallen f\u00f6r dessa parametrar. P\u00e5 s\u00e5 s\u00e4tt kan vi minska aggressiviteten hos Patroni vid genomf\u00f6randet av autofailover om n\u00e4tverksproblem uppst\u00e5r.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f0043050da20f6368dabf66ec9a4eade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag tror att m\u00e5nga som anv\u00e4nder Patroni \u00e4r bekanta med detta kommando. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/9f78f59dab166e47ac78436802156d04.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detta kommando visar den aktuella statusen f\u00f6r klustret. Och vid f\u00f6rsta anblicken kan denna bild verka normal. Vi har en master, vi har en replik, och det finns ingen replikationsf\u00f6rdr\u00f6jning. Men denna bild \u00e4r normal endast s\u00e5 l\u00e4nge vi inte vet att det i detta kluster borde finnas tre noder, inte tv\u00e5. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a39c891f8620ba210b6bce0727e0fa8b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e4rmed intr\u00e4ffade en auto failover. Efter denna auto failover f\u00f6rsvann v\u00e5r replik. Vi beh\u00f6ver ta reda p\u00e5 varf\u00f6r den f\u00f6rsvann och f\u00e5 tillbaka den, \u00e5terst\u00e4lla den. Och vi g\u00e5r \u00e5terigen igenom loggarna och unders\u00f6ker varf\u00f6r vi hade en auto failover.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/e6e67d46cb20c8d7e58c7505157f68e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I det h\u00e4r fallet blev den andra repliken master. Allt \u00e4r i ordning h\u00e4r. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/b86ccea68b0c6013a23bbd2804e48320.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi beh\u00f6ver titta p\u00e5 repliken som kopplades bort och som inte \u00e4r i klustret. Vi \u00f6ppnar Patroni-loggarna och ser att vi hade ett problem vid anslutningen till klustret under pg_rewind-stadiet. F\u00f6r att ansluta till klustret m\u00e5ste man rulla tillbaka transaktionsloggen, beg\u00e4ra den n\u00f6dv\u00e4ndiga transaktionsloggen fr\u00e5n mastern och d\u00e4rigenom hinna ikapp mastern. <\/p>\n<p><\/p>\n<p>I det h\u00e4r fallet har vi ingen transaktionslogg och repliken kan inte starta. D\u00e4rmed stoppar vi Postgres med ett fel. D\u00e4rf\u00f6r finns den inte i klustret. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/dadbd44b766674b719d85781ef7f0caa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi m\u00e5ste f\u00f6rst\u00e5 varf\u00f6r den inte finns i klustret och varf\u00f6r det inte fanns n\u00e5gra loggar. Vi g\u00e5r till den nya mastern och ser vad som st\u00e5r i loggarna. Det visar sig att n\u00e4r pg_rewind utf\u00f6rdes intr\u00e4ffade en checkpoint. Och en del av de gamla transaktionsloggarna var helt enkelt omd\u00f6pta. N\u00e4r den gamla mastern f\u00f6rs\u00f6kte ansluta till den nya mastern och beg\u00e4rde dessa loggar, s\u00e5 var de redan omd\u00f6pta, de fanns helt enkelt inte.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f2d5c37324f9436b2bdad1290612d86f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag j\u00e4mf\u00f6rde tidsst\u00e4mplarna f\u00f6r n\u00e4r dessa h\u00e4ndelser intr\u00e4ffade. Och det var en skillnad p\u00e5 endast 150 millisekunder, dvs. checkpointen avslutades p\u00e5 369 millisekunder, WAL-segmenten hade omd\u00f6pts. Och efter bara 517 millisekunder, 150 millisekunder senare, startade rewind p\u00e5 den gamla repliken. Det vill s\u00e4ga, vi hade precis 150 millisekunder som gjorde att repliken inte kunde ansluta och starta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/99dd80deb8466bfc3aff568456e07102.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vilka alternativ finns?<\/p>\n<p><\/p>\n<p>Vi anv\u00e4nde ursprungligen reproduktionsplatser. Vi trodde att detta var bra. \u00c4ven om vi vid det f\u00f6rsta anv\u00e4ndningssteget st\u00e4ngde av dessa platser. Vi trodde att om platserna samlade f\u00f6r m\u00e5nga WAL-segment, skulle vi kunna krascha mastern. Den skulle falla. Vi k\u00e4mpade ett tag utan platser. Och ins\u00e5g att vi beh\u00f6vde platser, vi \u00e5terv\u00e4nde till anv\u00e4ndningen av platser. <\/p>\n<p><\/p>\n<p>Men h\u00e4r finns ett problem, att n\u00e4r master g\u00e5r \u00f6ver till en replik s\u00e5 raderar den slots och tillsammans med slots raderas WAL-segment. F\u00f6r att undvika detta problem beslutade vi att \u00f6ka parametern wal_keep_segments. Som standard \u00e4r det 8 segment. Vi h\u00f6jde det till 1 000 och kollade hur mycket ledigt utrymme vi har. Och vi gav 16 gigabyte till wal_keep_segments. D.v.s. vid omkopplingen har vi alltid 16 gigabyte transaktionsloggar tillg\u00e4ngligt p\u00e5 alla noder.<\/p>\n<p><\/p>\n<p>Och dessutom \u2013 det \u00e4r fortfarande relevant f\u00f6r l\u00e5ngvariga underh\u00e5llsuppgifter. L\u00e5t oss s\u00e4ga att vi beh\u00f6ver uppdatera en av replikerna. Och vi vill st\u00e4nga av den. Vi m\u00e5ste uppdatera mjukvaran, kanske operativsystemet, n\u00e5got annat. Och n\u00e4r vi st\u00e4nger av repliken raderas ocks\u00e5 slotten f\u00f6r den repliken. Och om vi anv\u00e4nder en liten wal_keep_segments, s\u00e5 n\u00e4r repliken \u00e4r borta under en l\u00e4ngre tid, kommer transaktionsloggarna att spelas upp. Vi startar upp repliken, den kommer att beg\u00e4ra de transaktionsloggar d\u00e4r den slutade, men det kanske inte finns n\u00e5gra kvar p\u00e5 master. Och repliken kan inte koppla upp sig. D\u00e4rf\u00f6r har vi ett stort lager av loggar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/dad55c828128ce92f649a99cc53ce54b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/63e70f0b098567f3a6d4fd66a0c293bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har en produktionsdatabas. D\u00e4r arbetar redan projekt. <\/p>\n<p><\/p>\n<p>Det intr\u00e4ffade en file failure. Vi gick in och kollade \u2013 allt var okej, replikerna var p\u00e5 plats, det fanns ingen replikationsf\u00f6rsening. Det fanns inga fel i loggarna, allt var i ordning. <\/p>\n<p><\/p>\n<p>Produktteamet s\u00e4ger att det som verkar som om det borde finnas n\u00e5gra data, men vi ser dem i en k\u00e4lla, men vi ser dem inte i databasen. Och vi m\u00e5ste f\u00f6rst\u00e5 vad som h\u00e4nde med dem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/568ca9aa31680d5e0c9d4ed9693b14e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det \u00e4r klart att pg_rewind raderade dem. Det f\u00f6rstod vi direkt, men vi gick f\u00f6r att se vad som h\u00e4nde. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a8fee389201d96e81761cd276c5265c3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I loggarna kan vi alltid hitta n\u00e4r file failuren intr\u00e4ffade, vem som blev master och vi kan identifiera vem som var den gamla master och n\u00e4r den ville bli replik. D.v.s. vi beh\u00f6ver dessa loggar f\u00f6r att ta reda p\u00e5 den m\u00e4ngd transaktionsloggar som gick f\u00f6rlorade.<\/p>\n<p><\/p>\n<p>V\u00e5r gamla master startade om. Och i autostart var Patroni registrerat. Patroni startade. Han startade sedan Postgres. N\u00e4rmare best\u00e4mt, innan Postgres startades och innan han skulle g\u00f6ra det till en replika, startade Patroni pg_rewind-processen. D\u00e4rmed raderade han en del av transaktionsloggarna, h\u00e4mtade nya och ansl\u00f6t sig. H\u00e4r fungerade Patroni str\u00e5lande, det vill s\u00e4ga precis som det ska. V\u00e5rt kluster \u00e5terst\u00e4lldes. Vi hade 3 noder, efter failover 3 noder - allt var toppen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/b747a24f53e20ed098c2dc0afc79bead.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har f\u00f6rlorat en del data. Och vi beh\u00f6ver f\u00f6rst\u00e5 hur mycket vi har f\u00f6rlorat. Vi letar efter det \u00f6gonblick d\u00e5 vi hade en \u00e5terst\u00e4llning. Vi kan hitta det genom s\u00e5dana poster i loggen. \u00c5terst\u00e4llningen startade, gjorde n\u00e5got och avslutades.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/5b7bacffb52e3ccd529a3a734c441295.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi beh\u00f6ver hitta den position i transaktionsloggen d\u00e4r den gamla masterservern stannade. I det h\u00e4r fallet \u00e4r det den h\u00e4r punkten. Och vi beh\u00f6ver en andra punkt, det vill s\u00e4ga avst\u00e5ndet mellan den gamla masterservern och den nya. <\/p>\n<p><\/p>\n<p>Vi tar helt enkelt pg_wal_lsn_diff och j\u00e4mf\u00f6r dessa tv\u00e5 punkter. I det h\u00e4r fallet f\u00e5r vi 17 megabyte. Om det \u00e4r mycket eller lite \u00e4r upp till var och en att avg\u00f6ra. F\u00f6r vissa \u00e4r 17 megabyte lite, f\u00f6r andra mycket och oacceptabelt. H\u00e4r f\u00e5r varje person individuellt avg\u00f6ra i enlighet med aff\u00e4rens behov. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/55335fce85961e159459c38300a0ad12.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men vad har vi kommit fram till? <\/p>\n<p><\/p>\n<p>F\u00f6r det f\u00f6rsta m\u00e5ste vi avg\u00f6ra om vi alltid beh\u00f6ver att Patroni startar automatiskt efter system\u00e5terst\u00e4llning. Oftare \u00e4r det s\u00e5 att vi m\u00e5ste g\u00e5 in p\u00e5 den gamla masterservern, se hur l\u00e5ngt den har kommit. Kanske inspektera segmenten av transaktionsloggen, se vad som finns d\u00e4r. Och f\u00f6rst\u00e5 om vi kan f\u00f6rlora dessa data eller om vi beh\u00f6ver starta den gamla masterservern i standalone-l\u00e4ge f\u00f6r att f\u00e5 ut dessa data. <\/p>\n<p><\/p>\n<p>Och f\u00f6rst efter det ska vi fatta beslut om vi kan avst\u00e5 dessa data eller om vi kan \u00e5terst\u00e4lla dem och koppla den h\u00e4r noden som en replik i v\u00e5r kluster.<\/p>\n<p><\/p>\n<p>Dessutom finns det en parameter kallad \"maximum_lag_on_failover\". Om jag inte minns fel, s\u00e5 har den h\u00e4r parametern som standard v\u00e4rdet 1 megabyte. <\/p>\n<p><\/p>\n<p>Hur fungerar den? Om v\u00e5r replik ligger efter med 1 megabyte i datalag fr\u00e5n replikationen, d\u00e5 deltar inte denna replik i valet. Och om det h\u00e4nder en failover, ser Patroni vilka repliker som ligger efter. Om de ligger efter med ett stort antal transaktionsloggar, kan de inte bli master. Detta \u00e4r en mycket bra skyddsfunktion som f\u00f6rhindrar att mycket data g\u00e5r f\u00f6rlorad. <\/p>\n<p><\/p>\n<p>Men det finns ett problem med att lagret f\u00f6r replikation i Patroni-klustret och DCS uppdateras med ett visst intervall. Enligt min mening \u00e4r standardv\u00e4rdet ttl 30 sekunder.<\/p>\n<p><\/p>\n<p>Det kan d\u00e4rf\u00f6r uppst\u00e5 en situation d\u00e4r replikationsf\u00f6rdr\u00f6jningen f\u00f6r repliker i DCS \u00e4r en, medan den i verkligheten kan vara helt annan eller inte finnas alls, det vill s\u00e4ga denna sak \u00e4r inte realtidsbaserad. Och den speglar inte alltid den verkliga situationen. Att bygga komplicerad logik p\u00e5 den \u00e4r inte v\u00e4rt det. <\/p>\n<p><\/p>\n<p>Och risken f\u00f6r dataf\u00f6rlust finns alltid kvar. I v\u00e4rsta fall finns en formel, och i genomsnitt en annan. Det vill s\u00e4ga n\u00e4r vi planerar att implementera Patroni och bed\u00f6mer hur mycket data vi kan f\u00f6rlora, m\u00e5ste vi r\u00e4kna med dessa formler och ha en ungef\u00e4rlig uppfattning om hur mycket data vi kan mista. <\/p>\n<p><\/p>\n<p>Och det finns goda nyheter. N\u00e4r den gamla mastern har g\u00e5tt fram\u00e5t kan den ha gjort det p\u00e5 grund av vissa bakgrundsprocesser. Det vill s\u00e4ga, det kan ha funnits en autovakuum som skrev data och sparade dem i transaktionsloggen. Dessa data kan vi enkelt ignorera och f\u00f6rlora. Det \u00e4r inte ett problem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a86e8971ab4ef41b89af9cf0bdf519ba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och s\u00e5 ser loggarna ut om maximum_lag_on_failover \u00e4r inst\u00e4llt och en failover har intr\u00e4ffat, och en ny master m\u00e5ste v\u00e4ljas. Repliken bed\u00f6mer sig sj\u00e4lv som of\u00f6rm\u00f6gen att delta i valet. Den avb\u00f6jer att delta i kampen om ledarskapet. Och den v\u00e4ntar p\u00e5 att en ny master ska v\u00e4ljas f\u00f6r att sedan ansluta till den. Detta \u00e4r en extra \u00e5tg\u00e4rd f\u00f6r att f\u00f6rhindra datarf\u00f6rlust.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f760788e5951facdd08b2069037830fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/c32f26e7526e1873f3bfd7d3693fcc72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e4r har v\u00e5rt produktteam skrivit att deras produkt har problem n\u00e4r den arbetar med Postgres. Samtidigt kan man inte komma \u00e5t sj\u00e4lva mastern eftersom den inte \u00e4r tillg\u00e4nglig via SSH. Och auto-failover sker inte heller. <\/p>\n<p><\/p>\n<p>Denna host skickades tvingat p\u00e5 omstart. P\u00e5 grund av omstarten intr\u00e4ffade en auto-failover, \u00e4ven om det hade varit m\u00f6jligt att utf\u00f6ra en manuell auto-failover, som jag nu f\u00f6rst\u00e5r. Och efter omstarten g\u00e5r vi redan f\u00f6r att se vad som h\u00e4nde med den nuvarande mastern. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/95efb82e0647a396a21683cd53a69547.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi visste p\u00e5 f\u00f6rhand att vi hade problem med diskarna, det vill s\u00e4ga vi visste redan via \u00f6vervakningen var vi skulle gr\u00e4va och vad vi skulle leta efter. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/367aaab607d833d96a573ddbbbced502.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi gick in i postgres-loggen och b\u00f6rjade titta p\u00e5 vad som h\u00e4nde d\u00e4r. Vi s\u00e5g commits som p\u00e5gick i en, tv\u00e5 eller tre sekunder, vilket \u00e4r helt onormalt. Vi s\u00e5g att v\u00e5rt autovakuum startade v\u00e4ldigt l\u00e5ngsamt och konstigt. Och vi s\u00e5g tempor\u00e4ra filer p\u00e5 disken. Det vill s\u00e4ga, allt detta \u00e4r indikatorer p\u00e5 problem med diskarna. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/7e0cfce7a81901ef9ef736c3fefc8dce.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi tittade i systemets dmesg (i loggen f\u00f6r k\u00e4rnmeddelanden). Och vi s\u00e5g att vi hade problem med en av diskarna. Diskunderh\u00e5llssystemet var en mjukvaru-Raid. Vi s\u00e5g p\u00e5 \/proc\/mdstat och s\u00e5g att vi saknade en disk. Det vill s\u00e4ga, h\u00e4r har vi ett Raid av 8 diskar, vi saknar en. Om man noggrant tittar p\u00e5 bilden kan man se att sde saknas. Vi kan s\u00e4ga att en disk tappades. Detta triggar diskproblem och applikationerna fick ocks\u00e5 problem med att arbeta med Postgres-klustret.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/4b09b3aa761cb504fa79173ef280faac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och i det h\u00e4r fallet skulle Patroni inte ha hj\u00e4lpt oss, eftersom Patroni inte har som uppgift att \u00f6vervaka serverns tillst\u00e5nd, diskens tillst\u00e5nd. Vi m\u00e5ste \u00f6vervaka s\u00e5dana situationer med extern monitorering. Vi lade till disk\u00f6vervakning i den externa monitoreringen snabbt. <\/p>\n<p><\/p>\n<p>Och det fanns en tanke \u2013 skulle fencing eller mjukvaru-watchdog kunna hj\u00e4lpa oss? Vi trodde att det troligen inte skulle ha hj\u00e4lpt oss i det h\u00e4r fallet, eftersom Patroni fortsatte att interagera med DCS-klustret under problemen och inte s\u00e5g n\u00e5got problem. Det vill s\u00e4ga, fr\u00e5n DCS:s och Patronis synpunkt var det inga problem med klustret, \u00e4ven om det i verkligheten fanns diskproblem och problem med tillg\u00e4ngligheten av databasen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/15fdac78535355d4eb889efcc27efc46.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Enligt min \u00e5sikt \u00e4r detta ett av de konstigaste problemen som jag unders\u00f6kte mycket l\u00e4nge, l\u00e4ste igenom m\u00e5nga loggar och jag kallade det kluster-simuleringen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/b5259774931c290eda6673deb14b6c48.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Problemet var att den gamla master-databasen inte kunde bli en normal replik, det vill s\u00e4ga Patroni startade den, Patroni visade att denna nod fanns som replik, men samtidigt var den inte en normal replik. Nu kommer du att se varf\u00f6r. Detta sparade jag fr\u00e5n analysen av det problemet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/c35a5d102a46764bbf96e5a75ee88171.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och hur b\u00f6rjade allt? Det b\u00f6rjade, som i det f\u00f6reg\u00e5ende problemet, med diskproblem. Vi hade commits per sekund, en eller tv\u00e5. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/435c1b350a89f288e0e10ca9d5a2ec6e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det var avbrott i anslutningar, det vill s\u00e4ga kunderna blev diskontinuerliga. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/920cb1f3f3b40578e15e6ff711e85c50.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det fanns blockeringar av olika sv\u00e5righetsgrad. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/285d6292d89b928a85e95602ee57d38a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och d\u00e4rmed var diskunderh\u00e5llssystemet inte s\u00e4rskilt responsivt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/ebe71d49360e7f604ecd6a3c8276cb73.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och det mest mystiska f\u00f6r mig var den omedelbara avst\u00e4ngningsbeg\u00e4ran. Postgres har tre avst\u00e4ngningsl\u00e4gen:<\/p>\n<p><\/p>\n<ul>\n<li>Detta \u00e4r graceful, n\u00e4r vi v\u00e4ntar p\u00e5 att alla kunder ska st\u00e4nga av sig sj\u00e4lva. <\/li>\n<li>Det finns fast, n\u00e4r vi tvingar kunder att st\u00e4nga av sig, eftersom vi g\u00e5r f\u00f6r att st\u00e4nga av. <\/li>\n<li>Och immediate. I det h\u00e4r fallet meddelar inte ens immediate kunderna att de beh\u00f6ver st\u00e4nga av sig, det st\u00e4ngs bara av utan f\u00f6rvarning. Och alla kunder f\u00e5r ett meddelande fr\u00e5n operativsystemet RST (TCP-meddelande om att anslutningen har avbrutits och att kunden inte l\u00e4ngre har n\u00e5got att h\u00e4mta). <\/li>\n<\/ul>\n<p><\/p>\n<p>Vem skickade den h\u00e4r signalen? Bakgrundsprocesser i Postgres skickar inte s\u00e5dana signaler till varandra, det vill s\u00e4ga, det \u00e4r kill -9. De skickar inte s\u00e5dana signaler till varandra, de reagerar bara p\u00e5 s\u00e5dana, s\u00e5 det \u00e4r en akut omstart av Postgres. Jag vet inte vem som skickade den. <\/p>\n<p><\/p>\n<p>Jag kollade kommandot \"last\" och s\u00e5g en person som ocks\u00e5 loggade in p\u00e5 den h\u00e4r servern tillsammans med oss, men jag k\u00e4nde mig obekv\u00e4m med att st\u00e4lla fr\u00e5gan. Kanske var det kill -9. Jag skulle ha sett kill -9 i loggarna, eftersom Postgres skriver att den har tagit emot kill -9, men jag s\u00e5g inte detta i loggarna. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/fe8e844649cea3384ebfde86e36eba44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vid vidare granskning s\u00e5g jag att Patroni inte hade skrivit i loggen p\u00e5 ganska l\u00e4nge - 54 sekunder. Och om man j\u00e4mf\u00f6r tv\u00e5 tidsst\u00e4mplar, h\u00e4r fanns det ungef\u00e4r 54 sekunder utan meddelanden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/ffb1c4db3d7de591d77d56ed2fcc4f2a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och under den tiden intr\u00e4ffade en automatisk failover. Patroni fungerade \u00e5terigen utm\u00e4rkt. V\u00e5r gamla huvudserver var inte tillg\u00e4nglig, det h\u00e4nde n\u00e5got med den. Och valet av en ny huvudserver inleddes. H\u00e4r fungerade allt bra. V\u00e5r pgsql01 blev den nya ledaren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/6b2457653e9f77af44cd64b4aff021a0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har en replik som blivit huvudserver. Och det finns en andra replik. Och med den andra repliken fanns det just problem. Den f\u00f6rs\u00f6kte rekonfigurera sig. Som jag f\u00f6rst\u00e5r det f\u00f6rs\u00f6kte den \u00e4ndra recovery.conf, starta om Postgres och ansluta till den nya huvudservern. Den skriver meddelanden var 10:e sekund att den f\u00f6rs\u00f6ker, men det g\u00e5r inte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/381818f189e19c3e1154074b4652f837.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och under dessa f\u00f6rs\u00f6k f\u00e5r den gamla huvudservern en immediate-shutdown signal. Huvudservern startar om. Och \u00e5terh\u00e4mtningsprocessen avbryts ocks\u00e5, eftersom den gamla huvudservern g\u00e5r in i omstart. Det vill s\u00e4ga, repliken kan inte ansluta till den, eftersom den \u00e4r i avst\u00e4ngningsl\u00e4ge. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/d8a8cde925fa8fe601d44ab908ae69dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vid ett tillf\u00e4lle b\u00f6rjade den fungera, men replikationen startade inte. <\/p>\n<p><\/p>\n<p>Jag har en enda hypotes, att recovery.conf hade adressen till den gamla huvudservern. Och n\u00e4r den nya huvudservern d\u00f6k upp, fortsatte den andra repliken att f\u00f6rs\u00f6ka ansluta till den gamla huvudservern. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/425ea3af1f1e186f4760e1fb1f5419fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4r Patroni startade p\u00e5 den andra repliken, startade noden, men kunde inte ansluta f\u00f6r replikation. Och en replikationsf\u00f6rdr\u00f6jning uppstod som s\u00e5g ut ungef\u00e4r s\u00e5 h\u00e4r. Det vill s\u00e4ga, alla tre noder var p\u00e5 plats, men den andra noden var efter. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f564eacd9944666c9a3f5bea634ede6b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om man tittar p\u00e5 loggarna som skrevs kan man se att replikeringen inte kan starta eftersom transaktionsloggarna skiljer sig \u00e5t. De transaktionsloggar som m\u00e4staren erbjuder, som anges i recovery.conf, passar helt enkelt inte v\u00e5r nuvarande nod. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/6b09947d157c9ef0a190da2df2cb5892.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e4r gjorde jag ett misstag. Jag borde ha g\u00e5tt och kikat p\u00e5 vad som fanns i recovery.conf f\u00f6r att kontrollera min hypotes om att vi ansluter oss till fel m\u00e4stare. Men jag h\u00f6ll precis p\u00e5 att s\u00e4tta mig in i det h\u00e4r och det slog mig inte, eller s\u00e5 s\u00e5g jag att replikeringen l\u00e5g efter och att den m\u00e5ste synkas om, det vill s\u00e4ga jag gjorde det lite slarvigt. Det var mitt misstag. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/159f2256fd81428fd0d82a255528887d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tretti minuter senare kom administrat\u00f6ren, det vill s\u00e4ga jag startade om Patroni p\u00e5 repliken. Jag hade redan gett upp om den, jag trodde att den skulle beh\u00f6va synkas om. Och jag t\u00e4nkte \u2013 jag startar om Patroni, kanske n\u00e5got bra kan h\u00e4nda. \u00c5terst\u00e4llningen startade. Och databasen \u00f6ppnades till och med, den var redo att ta emot anslutningar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/aeac98750386c8389d39e006a229cc85.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Replikeringen startade. Men efter en minut f\u00f6ll den och gav ett felmeddelande om att transaktionsloggarna inte passade. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/17eaba000a79c80c29d1bc3902de05e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag t\u00e4nkte att jag skulle starta om den en g\u00e5ng till. Jag startade om Patroni igen, och jag startade inte om Postgres, utan just Patroni, i hopp om att den p\u00e5 n\u00e5got magiskt s\u00e4tt skulle starta databasen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a85b38e033c45ad73da317f41e0ef24a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Replikeringen b\u00f6rjade igen, men m\u00e4rkena i transaktionsloggen skilde sig, de var inte de som fanns vid det tidigare f\u00f6rs\u00f6ket att starta. Replikeringen stoppades igen. Och meddelandet var nu lite annorlunda. Och det var inte s\u00e4rskilt informativt f\u00f6r mig. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/fd90d708230bd54af685786c7e361ee1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och pl\u00f6tsligt kom jag p\u00e5 \u2013 vad h\u00e4nder om jag startar om Postgres, och samtidigt g\u00f6r jag en checkpoint p\u00e5 den aktuella m\u00e4staren f\u00f6r att flytta punkten i transaktionsloggen lite fram\u00e5t, s\u00e5 att \u00e5terst\u00e4llningen kan b\u00f6rja fr\u00e5n ett annat \u00f6gonblick? Plus att vi hade lite WAL-filer sparade. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/19e67f95d1a74141a013947c9aa39e38.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag startade om Patroni, gjorde ett par checkpoints p\u00e5 m\u00e4staren, ett par restart-punkter p\u00e5 repliken n\u00e4r den \u00f6ppnades. Och det hj\u00e4lpte. Jag t\u00e4nkte l\u00e4nge p\u00e5 varf\u00f6r det hj\u00e4lpte och hur det fungerade. Och repliken startade. Och replikeringen avbr\u00f6ts inte l\u00e4ngre. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/418ca59a681be84f51ed374a73a759c9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett s\u00e5dant problem \u00e4r en av de mer g\u00e5tfulla f\u00f6r mig som jag fortfarande funderar \u00f6ver, vad som egentligen h\u00e4nde. <\/p>\n<p><\/p>\n<p>Vilka slutsatser kan vi dra h\u00e4r? Patroni kan fungera som avsett utan n\u00e5gra fel. Men detta \u00e4r ingen 100% garanti f\u00f6r att allt fungerar bra. En replik kan starta, men den kan befinna sig i ett halvf\u00e4rdigt tillst\u00e5nd, och applikationen kan inte arbeta med en s\u00e5dan replik eftersom d\u00e4r kommer att finnas gamla data. <\/p>\n<p><\/p>\n<p>Och efter varje failover m\u00e5ste vi alltid kontrollera att allt \u00e4r i ordning med klustret, dvs att vi har det n\u00f6dv\u00e4ndiga antalet repliker och att det inte finns n\u00e5gon replikationsf\u00f6rdr\u00f6jning.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/aca7047ff33d3efe14071b798b554091.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Under denna process av att granska dessa problem kommer jag att formulera rekommendationer. Jag f\u00f6rs\u00f6kte sammanfoga dem i tv\u00e5 bilder. Antagligen skulle alla historier kunna sammanfattas i tv\u00e5 bilder och bara ber\u00e4tta om dem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/d4ad31b26d83c8846fe4097a11d70849.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4r du anv\u00e4nder Patroni m\u00e5ste du ha \u00f6vervakning. Du m\u00e5ste alltid veta n\u00e4r en auto-failover intr\u00e4ffade, f\u00f6r om du inte vet att du hade en auto-failover, s\u00e5 kontrollerar du inte klustret. Och det \u00e4r d\u00e5ligt.<\/p>\n<p><\/p>\n<p>Efter varje failover m\u00e5ste vi alltid manuellt kontrollera klustret. Vi m\u00e5ste f\u00f6rs\u00e4kra oss om att vi alltid har det aktuella antalet repliker, att det inte finns n\u00e5gon replikationsf\u00f6rdr\u00f6jning, och att det inte finns n\u00e5gra fel i loggarna relaterade till streaming-replikation, Patroni eller DCS-systemet.<\/p>\n<p><\/p>\n<p>Automatiseringen kan fungera bra, Patroni \u00e4r ett mycket bra verktyg. Den kan fungera, men det kommer inte att leda klustret till det \u00f6nskade tillst\u00e5ndet. Och om vi inte f\u00e5r veta det kommer vi att ha problem.<\/p>\n<p><\/p>\n<p>Och Patroni \u00e4r ingen silverkula. Vi m\u00e5ste fortfarande ha en f\u00f6rst\u00e5else f\u00f6r hur Postgres fungerar, hur replikation fungerar och hur Patroni interagerar med Postgres, samt hur kommunikationen mellan noder s\u00e4kerst\u00e4lls. Detta beh\u00f6vs f\u00f6r att kunna l\u00f6sa problem som uppst\u00e5r manuellt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/ea4162df3561d2ea7001f2ef6788eaaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hur n\u00e4rmar jag mig fr\u00e5gan om diagnostik? S\u00e5 har det blivit att vi arbetar med olika kunder och ingen har en ELK-stack, s\u00e5 vi m\u00e5ste g\u00e5 igenom loggarna med sex konsoler och tv\u00e5 flikar \u00f6ppna. I en flik \u00e4r det loggar f\u00f6r Patroni f\u00f6r varje nod, och i den andra fliken \u00e4r det loggar fr\u00e5n Consul eller Postgres vid behov. Det \u00e4r mycket sv\u00e5rt att diagnostisera. <\/p>\n<p><\/p>\n<p>Vilka metoder har jag utvecklat? F\u00f6rst och fr\u00e4mst tittar jag alltid p\u00e5 n\u00e4r failovern intr\u00e4ffade. Och f\u00f6r mig \u00e4r det en slags delgr\u00e4ns. Jag tittar p\u00e5 vad som h\u00e4nde f\u00f6re, under och efter failovern. Failovern har tv\u00e5 tidpunkter: en start- och en sluttid. <\/p>\n<p><\/p>\n<p>D\u00e4refter tittar jag i loggarna p\u00e5 h\u00e4ndelserna f\u00f6re failover, det vill s\u00e4ga jag letar efter orsakerna till varf\u00f6r failover intr\u00e4ffade. <\/p>\n<p><\/p>\n<p>Och det ger en bild av f\u00f6rst\u00e5elsen f\u00f6r vad som h\u00e4nde och vad som kan g\u00f6ras i framtiden f\u00f6r att undvika s\u00e5dana omst\u00e4ndigheter (och f\u00f6ljaktligen f\u00f6r att undvika en failover).<\/p>\n<p><\/p>\n<p>Och vart ser vi vanligtvis? Jag kollar:<\/p>\n<p><\/p>\n<ul>\n<li>F\u00f6rst i Patroni-loggarna. <\/li>\n<li>D\u00e4refter kollar jag Postgres-loggarna, eller DCS-loggarna beroende p\u00e5 vad som hittades i Patroni-loggarna. <\/li>\n<li>Och systemloggarna ger ibland ocks\u00e5 f\u00f6rst\u00e5else f\u00f6r vad som var orsaken till failovern. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a53618e366020e1a550d852fc308c188.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hur ser jag p\u00e5 Patroni? Jag anser att Patroni \u00e4r mycket bra. Enligt min mening \u00e4r det det b\u00e4sta som finns idag. Jag k\u00e4nner till m\u00e5nga andra produkter. Det finns Stolon, Repmgr, Pg_auto_failover, PAF. Fyra verktyg. Jag har provat dem alla. Patroni gillade jag mest. <\/p>\n<p><\/p>\n<p>Om jag blir fr\u00e5gad: \"Rekommenderar jag Patroni?\". Jag s\u00e4ger ja, f\u00f6r jag gillar Patroni. Och jag tror att jag har l\u00e4rt mig att anv\u00e4nda det. <\/p>\n<p><\/p>\n<p>Om du \u00e4r intresserad av att se vilka andra problem som finns med Patroni f\u00f6rutom de problem jag n\u00e4mnt, kan du alltid g\u00e5 till sidan <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\/issues\/\">issues<\/a><\/noindex> p\u00e5 GitHub. D\u00e4r finns m\u00e5nga olika historier och m\u00e5nga intressanta problem diskuteras. Och i slut\u00e4ndan har vissa buggar registrerats och l\u00f6sts, det \u00e4r intressant l\u00e4sning. <\/p>\n<p><\/p>\n<p>D\u00e4r finns intressanta historier om hur folk skjuter sig sj\u00e4lva i foten. Mycket l\u00e4rorikt. Man l\u00e4ser och f\u00f6rst\u00e5r att man inte ska g\u00f6ra s\u00e5. Man s\u00e4tter en bock. <\/p>\n<p><\/p>\n<p>Och jag vill g\u00e4rna tacka f\u00f6retaget Zalando f\u00f6r att de utvecklar detta projekt, speciellt Alexander Kukushkin och Alexey Klukin. Alexey Klukin \u00e4r en av medf\u00f6rfattarna, han jobbar inte l\u00e4ngre p\u00e5 Zalando, men det \u00e4r tv\u00e5 personer som b\u00f6rjade arbeta med denna produkt. <\/p>\n<p><\/p>\n<p>Och jag tycker att Patroni \u00e4r en mycket h\u00e4ftig grej. Jag \u00e4r glad att den finns, den \u00e4r intressant. Och stort tack till alla bidragsgivare som skriver patchar i Patroni. Jag hoppas att Patroni med tiden blir mer mogen, fantastisk och funktionell. Den \u00e4r redan funktionell, men jag hoppas att den blir \u00e4nnu b\u00e4ttre. S\u00e5 om du planerar att anv\u00e4nda Patroni, tveka inte. Det \u00e4r en bra l\u00f6sning, den kan implementeras och anv\u00e4ndas. <\/p>\n<p><\/p>\n<p>Det var allt. Om ni har n\u00e5gra fr\u00e5gor, st\u00e4ll dem g\u00e4rna.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/85c2fef2455999b48413c9fc3b235ed6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fr\u00e5gor<\/p>\n<p><\/p>\n<p><em>Tack f\u00f6r presentationen! Om man fortfarande m\u00e5ste titta noga efter en failover, varf\u00f6r beh\u00f6ver vi d\u00e5 en automatisk failover?<\/em> <\/p>\n<p><\/p>\n<p>F\u00f6r att detta \u00e4r n\u00e5got nytt. Vi har bara arbetat med det i ett \u00e5r. B\u00e4ttre att vara f\u00f6rsiktig. Vi vill g\u00e5 in och se att allt verkligen har fungerat som det ska. Det \u00e4r en niv\u00e5 av vuxen misstro \u2013 b\u00e4ttre att dubbelkolla och titta. <\/p>\n<p><\/p>\n<p><em>Till exempel, vi gick in p\u00e5 morgonen och kollade, eller hur?<\/em><\/p>\n<p><\/p>\n<p>Inte p\u00e5 morgonen, vi f\u00e5r vanligtvis veta om auto-failover n\u00e4stan omedelbart. Vi f\u00e5r notiser, vi ser att det har skett en auto-failover. Vi g\u00e5r n\u00e4stan direkt in och kollar. Men alla dessa kontroller b\u00f6r l\u00e4ggas p\u00e5 \u00f6vervakningsniv\u00e5. Om vi ansluter till Patroni via REST API, finns det en historik. Genom historiken kan man se tidsst\u00e4mplar f\u00f6r n\u00e4r failovern intr\u00e4ffade. Baserat p\u00e5 detta kan vi g\u00f6ra \u00f6vervakning. Vi kan se historiken, hur m\u00e5nga h\u00e4ndelser det har varit. Om vi har f\u00e5tt fler h\u00e4ndelser, betyder det att en auto-failover har intr\u00e4ffat. Man kan g\u00e5 in och kolla. Antingen har v\u00e5r automation i \u00f6vervakningen kontrollerat att alla v\u00e5ra repliker \u00e4r p\u00e5 plats, att det inte finns n\u00e5got lagg och att allt \u00e4r bra. <\/p>\n<p><\/p>\n<p><em>Tack!<\/em><\/p>\n<p><\/p>\n<p><em>Stort tack f\u00f6r en fantastisk ber\u00e4ttelse! Om vi har flyttat DCS-klustret l\u00e5ngt bort fr\u00e5n Postgres-klustret, m\u00e5ste det klustret ocks\u00e5 underh\u00e5llas periodiskt? Vilka \u00e4r b\u00e4sta praxis n\u00e4r det g\u00e4ller att st\u00e4nga av vissa delar av DCS-klustret, g\u00f6ra n\u00e5got med dem osv.? Hur fungerar hela denna struktur under tiden? Och hur g\u00f6r man dessa saker?<\/em><\/p>\n<p><\/p>\n<p>F\u00f6r ett f\u00f6retag beh\u00f6vde vi skapa en matriss \u00f6ver problem, vad som h\u00e4nder om n\u00e5gon av komponenterna eller flera komponenter slutar fungera. Genom denna matris g\u00e5r vi systematiskt igenom alla komponenter och bygger scenarier f\u00f6r vad som h\u00e4nder vid fel p\u00e5 dessa komponenter. D\u00e4rf\u00f6r kan man f\u00f6r varje fel-scenario ha en handlingsplan f\u00f6r \u00e5terst\u00e4llning. I fallet med DCS g\u00e5r detta som en del av den standardinfrastruktur. Och administrat\u00f6ren hanterar det, och vi litar redan p\u00e5 administrat\u00f6rerna som hanterar det och p\u00e5 deras f\u00f6rm\u00e5ga att fixa det vid incidenter. Om DCS inte finns, d\u00e5 distribuerar vi det, men vi h\u00e5ller inte s\u00e4rskilt koll p\u00e5 det eftersom vi inte ansvarar f\u00f6r infrastrukturen, men ger rekommendationer om hur och vad man ska \u00f6vervaka. <\/p>\n<p><\/p>\n<p><em>Det vill s\u00e4ga, har jag f\u00f6rst\u00e5tt r\u00e4tt att vi m\u00e5ste st\u00e4nga av Patroni, st\u00e4nga av failovern, st\u00e4nga av allt innan vi g\u00f6r n\u00e5got med v\u00e4rdarna?<\/em><\/p>\n<p><\/p>\n<p>Det beror p\u00e5 hur m\u00e5nga noder vi har i DCS-klustret. Om det finns m\u00e5nga noder och vi endast g\u00f6r en nod (replica) otillg\u00e4nglig, finns det fortfarande konsensus i klustret. Och Patroni f\u00f6rblir funktionellt. Och ingenting triggas. Om vi har n\u00e5gra komplexa operationer som ber\u00f6r fler noder, vars fr\u00e5nvaro kan f\u00f6rst\u00f6ra konsensus, s\u00e5 ja, kanske \u00e4r det vettigt att pausa Patroni. Den har en motsvarande kommando \u2013 patronictl pause, patronictl resume. Vi s\u00e4tter bara p\u00e5 paus och automatisk failover aktiveras inte under denna tid. Vi g\u00f6r underh\u00e5ll p\u00e5 DCS-klustret, sedan tar vi pausen bort och forts\u00e4tter som vanligt.<\/p>\n<p><\/p>\n<p><em>Stort tack!<\/em><\/p>\n<p><\/p>\n<p><em>Stort tack f\u00f6r presentationen! Hur ser produktteamet p\u00e5 risken f\u00f6r databasf\u00f6rlust?<\/em> <\/p>\n<p><\/p>\n<p>Produktteam bryr sig inte, men teamledarna \u00e4r oroliga. <\/p>\n<p><\/p>\n<p><em>Vilka garantier finns?<\/em><\/p>\n<p><\/p>\n<p>Det \u00e4r v\u00e4ldigt sv\u00e5rt med garantier. Det finns en presentation av Alexander Kukushkin \"Hur man ber\u00e4knar RPO och RTO\", dvs. tid f\u00f6r \u00e5terst\u00e4llning och hur mycket data vi kan f\u00f6rlora. Jag tror att vi m\u00e5ste hitta dessa bilder och studera dem. S\u00e5vitt jag minns finns det specifika steg f\u00f6r hur man ber\u00e4knar dessa saker. Hur m\u00e5nga transaktioner vi kan f\u00f6rlora, hur mycket data vi kan f\u00f6rlora. Som alternativ kan vi anv\u00e4nda synkron replikering p\u00e5 Patroni-niv\u00e5, men det \u00e4r en dubbelteckning: vi antingen f\u00e5r datats p\u00e5litlighet eller f\u00f6rlorar hastighet. Det finns synkron replikering, men det garanterar inte 100% skydd mot databasf\u00f6rlust.<\/p>\n<p><\/p>\n<p><em>Alexei, tack f\u00f6r den utm\u00e4rkta presentationen! Finns det erfarenhet av att anv\u00e4nda Patroni f\u00f6r zero level protection? Dvs. tillsammans med synkron standby? Det \u00e4r den f\u00f6rsta fr\u00e5gan. Och den andra fr\u00e5gan. Ni har anv\u00e4nt olika l\u00f6sningar. Vi anv\u00e4nde Repmgr, men utan automatisk failover och planerar nu att koppla p\u00e5 automatisk failover. Vi \u00f6verv\u00e4ger att anv\u00e4nda Patroni som en alternativ l\u00f6sning. Vad kan ni s\u00e4ga om f\u00f6rdelarna j\u00e4mf\u00f6rt med Repmgr?<\/em><\/p>\n<p><\/p>\n<p>Den f\u00f6rsta fr\u00e5gan handlade om synkrona repliker. Ingen anv\u00e4nder synkron replikering hos oss, f\u00f6r alla \u00e4r r\u00e4dda (Flera kunder anv\u00e4nder redan den, och vi har inte m\u00e4rkt n\u00e5gra prestandaproblem \u2014 <em>Anm\u00e4rkning fr\u00e5n talaren<\/em>). Men vi har utvecklat en regel f\u00f6r oss sj\u00e4lva att det i en klynga med synkron replikering m\u00e5ste finnas minst tre noder, eftersom om vi har tv\u00e5 noder och antingen master eller en replik g\u00e5r ner, s\u00e5 g\u00e5r Patroni \u00f6ver den noden till Standalone-l\u00e4ge f\u00f6r att applikationen ska forts\u00e4tta fungera. I det h\u00e4r fallet finns det risker f\u00f6r dataloss.<\/p>\n<p><\/p>\n<p>Ang\u00e5ende den andra fr\u00e5gan har vi anv\u00e4nt Repmgr och anv\u00e4nder fortfarande det hos vissa kunder av historiska sk\u00e4l. Vad kan man s\u00e4ga? I Patroni \u00e4r auto-failover inbyggt, medan i Repmgr \u00e4r auto-failover en extra funktion som m\u00e5ste aktiveras. Vi beh\u00f6ver starta Repmgr-daemonen p\u00e5 varje nod, s\u00e5 kan vi konfigurera auto-failover. <\/p>\n<p><\/p>\n<p>Repmgr kontrollerar om Postgres-noderna \u00e4r aktiva. Repmgr-processerna kontrollerar varandras existens, vilket inte \u00e4r en s\u00e4rskilt effektiv strategi d\u00e5 det kan f\u00f6rekomma komplexa fall av n\u00e4tverksisolering d\u00e4r en stor Repmgr-klynga kan splittras i flera sm\u00e5 och forts\u00e4tta fungera. Jag har inte f\u00f6ljt Repmgr p\u00e5 l\u00e4nge, kanske har de fixat detta\u2026 eller kanske inte. Men att f\u00f6ra ut information om klyngans status till DCS, som g\u00f6rs av Stolon och Patroni, \u00e4r den mest livskraftiga l\u00f6sningen. <\/p>\n<p><\/p>\n<p><em>Alexey, jag har en fr\u00e5ga, kanske en lite okunnig. I ett av de tidigaste exemplen flyttade ni DCS fr\u00e5n en lokal maskin till en fj\u00e4rrnod. Vi f\u00f6rst\u00e5r att n\u00e4tverket har sina egna egenskaper, det lever sitt eget liv. Vad h\u00e4nder om DCS-klyngan blir otillg\u00e4nglig av n\u00e5gon anledning? Jag t\u00e4nker inte g\u00e5 in p\u00e5 orsaker, det kan finnas m\u00e5nga: allt fr\u00e5n d\u00e5ligt arbete av n\u00e4tverksingenj\u00f6rer till verkliga problem.<\/em> <\/p>\n<p><\/p>\n<p>Jag har inte sagt detta h\u00f6gt, men DCS-klyngan m\u00e5ste ocks\u00e5 vara drifts\u00e4ker, det vill s\u00e4ga ha ett udda antal noder s\u00e5 att kvorum kan samlas. Vad h\u00e4nder om DCS-klyngan blir otillg\u00e4nglig, eller om kvorum inte kan samlas, till exempel vid en n\u00e4tverksdelning eller nodfel? I det h\u00e4r fallet g\u00e5r Patroni-klyngan in i read only-l\u00e4ge. Patroni-klyngan kan inte avg\u00f6ra klyngans tillst\u00e5nd och vad den ska g\u00f6ra. Den kan inte kommunicera med DCS och spara det nya tillst\u00e5ndet f\u00f6r klyngan d\u00e4r, s\u00e5 hela klyngan g\u00e5r in i read only-l\u00e4ge. Den v\u00e4ntar antingen p\u00e5 manuell intervention fr\u00e5n operat\u00f6ren eller p\u00e5 att DCS ska \u00e5terst\u00e4llas.<\/p>\n<p><\/p>\n<p><em>I grova drag blir DCS f\u00f6r oss en tj\u00e4nst som \u00e4r lika viktig som databasen sj\u00e4lv?<\/em><\/p>\n<p><\/p>\n<p>Ja, precis. I m\u00e5nga moderna f\u00f6retag \u00e4r Service Discovery en oumb\u00e4rlig del av infrastrukturen. Det implementeras oftast \u00e4nnu tidigare \u00e4n databaserna i infrastrukturen. Man kan s\u00e4ga att man har startat infrastrukturen, rullat ut i datacentret, och man har redan Service Discovery p\u00e5 plats. Om det \u00e4r Consul, kan DNS byggas p\u00e5 det. Om det \u00e4r Etcd, kan det vara en del av en Kubernetes-kluster d\u00e4r all annan funktionalitet kommer att rullas ut. Jag tror att Service Discovery redan \u00e4r en integrerad del av moderna infrastrukturer. Man b\u00f6rjar t\u00e4nka p\u00e5 det mycket tidigare \u00e4n p\u00e5 databaser. <\/p>\n<p><\/p>\n<p><em>Tack!<\/em><\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Patroni Failure Stories eller Hur man kraschar sin PostgreSQL-kluster. Alexey Lesovskiy | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/90103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=90103"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/90103\/revisions"}],"predecessor-version":[{"id":158759,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/90103\/revisions\/158759"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/90104"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=90103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=90103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=90103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}