Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Huvudsyftet med Patroni Àr att sÀkerstÀlla hög tillgÀnglighet för PostgreSQL. Men Patroni Àr bara en mall, inte ett fÀrdigt verktyg (vilket ocksÄ anges i dokumentationen). Vid första anblicken, nÀr man stÀller in Patroni i en testmiljö, kan man se hur bra det Àr som verktyg och hur enkelt det hanterar vÄra försök att förstöra klustret. Men i praktiken, i produktionsmiljöer, gÄr det inte alltid sÄ vackert och elegant som i testmiljön.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Jag ska berÀtta lite om mig sjÀlv. Jag började som systemadministratör. Jag har arbetat med webbutveckling. Sedan 2014 arbetar jag pÄ Data Egret. Företaget sysslar med konsultverksamhet inom Postgres. Vi underhÄller just Postgres och arbetar med Postgres varje dag, sÄ vi har olika expertiser relaterade till drift.

I slutet av 2018 började vi lÄngsamt anvÀnda Patroni. Och vi har samlat pÄ oss en viss erfarenhet. Vi har pÄ nÄgot sÀtt diagnostiserat det, optimerat det, och kommit fram till vÄra bÀsta metoder. I den hÀr presentationen kommer jag att berÀtta om dem.

Förutom Postgres Àlskar jag Linux. Jag gillar att grÀva i det och utforska, Àlskar att kompilera kÀrnor. Jag gillar virtualisering, containrar, Docker, Kubernetes. Allt detta intresserar mig eftersom det pÄverkas av gamla administrativa vanor. Jag Àlskar att Àgna mig Ät övervakningar. Och jag Àlskar postgres-relaterade uppgifter som administration, det vill sÀga replikering, sÀkerhetskopiering. PÄ min fritid skriver jag i Go. Jag Àr ingen mjukvaruingenjör, jag skriver bara för mig sjÀlv i Go. Och det ger mig glÀdje.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

  • Jag tror mĂ„nga av er vet att Postgres inte har HA (hög tillgĂ€nglighet) ur lĂ„dan. För att fĂ„ HA mĂ„ste man installera nĂ„got, konfigurera det, lĂ€gga ner en viss anstrĂ€ngning och fĂ„ det.
  • Det finns flera verktyg och Patroni Ă€r ett av dem, som löser HA ganska bra och effektivt. Men nĂ€r vi sĂ€tter upp allt i testmiljön och kör det, kan vi se att allt fungerar, vi kan Ă„terskapa vissa problem och se hur Patroni hanterar dem. Och vi kommer att se att allt fungerar utmĂ€rkt.
  • Men i praktiken har vi stött pĂ„ olika problem. Och jag kommer att berĂ€tta om dessa problem.
  • Jag ska berĂ€tta hur vi diagnostiserade detta, vad vi justerade – om det hjĂ€lpte oss eller inte.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

  • Jag kommer inte att berĂ€tta hur man installerar Patroni, för det kan man enkelt googla pĂ„ nĂ€tet, eller titta pĂ„ konfigurationsfilerna för att förstĂ„ hur allt startar och stĂ€lls in. Man kan Ă€ven förstĂ„ scheman och arkitekturer genom att hitta information om detta online.
  • Jag kommer inte att prata om andras erfarenheter. Jag kommer endast att berĂ€tta om de problem vi har stött pĂ„.
  • Och jag kommer inte att prata om problem som ligger utanför Patroni och PostgreSQL. Om det till exempel rör sig om problem relaterade till belastningsutjĂ€mning, nĂ€r vĂ„r kluster kollapsade, kommer jag inte att berĂ€tta om det.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och en liten disclaimer innan vi börjar vÄr presentation.

Alla dessa problem som vi stötte pÄ intrÀffade under de första 6-7-8 mÄnaderna av driftsÀttning. Med tiden kom vi fram till vÄra interna bÀsta metoder. Och problemen försvann. DÀrför presenterades föredraget för ungefÀr ett halvÄr sedan, nÀr detta fortfarande var fÀrskt i minnet och jag kom ihÄg allt klart.

Under förberedelserna av föredraget har jag redan gÄtt igenom gamla postmortem-rapporter och tittat pÄ loggar. Och vissa detaljer kan ha glömts bort, eller vissa detaljer kan ha varit otillrÀckligt undersökta under problemanalysen, sÄ det kan verka som om vissa problem inte har behandlats helt eller att det finns brist pÄ information. SÄ jag ber om ursÀkt för det.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vad Àr Patroni?

  • Det Ă€r en mall för att skapa hög tillgĂ€nglighet (HA). SĂ„ stĂ„r det i dokumentationen. Och frĂ„n min synvinkel Ă€r det en mycket korrekt precisering. Patroni Ă€r inte en silverkula som löser alla dina problem, det vill sĂ€ga att det krĂ€vs anstrĂ€ngning för att fĂ„ det att fungera och ge nytta.
  • Det Ă€r en agenttjĂ€nst som installeras pĂ„ varje tjĂ€nst med databasen, och som fungerar som en slags init-system för din Postgres. Den startar Postgres, stoppar den, startar om den, Ă€ndrar konfiguration och förĂ€ndrar topologin av din kluster.
  • För att lagra klusterstatus, dess nuvarande representation och hur det ser ut, behövs ett lagringsutrymme. Och i detta avseende har Patroni valt att lagra tillstĂ„ndet i ett externt system. Det Ă€r ett system för distribuerad konfigurationlagring. Det kan vara Etcd, Consul, ZooKeeper eller Kubernetes' Etcd, det vill sĂ€ga nĂ„got av dessa alternativ.
  • En av funktionerna i Patroni Ă€r att du fĂ„r en auto-failover direkt ur lĂ„dan, bara genom att konfigurera det. JĂ€mför man med Repmgr sĂ„ ingĂ„r failover dĂ€r som en del av paketet. Med Repmgr fĂ„r vi en switchover, men om vi vill ha en auto-failover mĂ„ste vi konfigurera det separat. I Patroni finns auto-failover redan inbyggt.
  • Och det finns mĂ„nga andra saker. Till exempel, hantering av konfigurationer, installation av nya repliker, sĂ€kerhetskopiering, osv. Men det ligger utanför föredraget, sĂ„ det kommer jag inte att tĂ€cka.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

En liten sammanfattning Àr att den huvudsakliga uppgiften med Patroni Àr att pÄ ett bra och pÄlitligt sÀtt genomföra auto-failover sÄ att klustret förblir funktionellt och applikationen inte mÀrker nÄgra förÀndringar i kluster-topologin.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Men nÀr vi börjar anvÀnda Patroni blir vÄrt system lite mer komplext. Om vi tidigare hade Postgres sÄ fÄr vi nu Patroni, en DCS dÀr status lagras. Allt detta mÄste fungera pÄ nÄgot sÀtt. SÄ vad kan gÄ fel?

Det som kan gÄ fel:

  • Postgres kan gĂ„ fel. Det kan vara master eller en replika, nĂ„got av dem kan sluta fungera.
  • SjĂ€lva Patroni kan gĂ„ fel.
  • DCS:en dĂ€r statusen lagras kan gĂ„ fel.
  • Och nĂ€tverket kan ocksĂ„ gĂ„ fel.

Alla dessa punkter kommer jag att diskutera i föredraget.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Jag kommer att gÄ igenom fallen i takt med att de blir mer komplexa, inte utifrÄn perspektivet att fallet involverar mÄnga komponenter. Utan utifrÄn subjektiva kÀnslor, dÀr ett fall kÀndes svÄrt och det var utmanande att analysera... och omvÀnt, ett annat fall kÀndes enkelt och var lÀtt att analysera.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Det första fallet Àr det enklaste. Det Àr det fallet dÀr vi har tagit en databas-kluster och pÄ samma kluster har vi installerat vÄr DCS-lagring. Det hÀr Àr det vanligaste misstaget. Det Àr ett arkitekturfel, dvs. att kombinera olika komponenter pÄ ett och samma stÀlle.

SÄ, en failover intrÀffade, lÄt oss ta reda pÄ vad som hÀnde.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

HÀr Àr vi intresserade av nÀr failovern intrÀffade. Det vill sÀga, vi Àr intresserade av den tidpunkten nÀr statusförÀndringen i klustret intrÀffade.

Men failovern Àr inte alltid ögonblicklig, dvs. den tar inte en enhet av tid, utan den kan dra ut pÄ tiden. Den kan vara lÄngvarig.

DÀrför har det bÄde en starttid och en sluttid, det vill sÀga det Àr en lÄngvarig hÀndelse. Vi delar in alla hÀndelser i tre intervall: vi har tiden före failover, under failover och efter failover. Det vill sÀga vi betraktar alla hÀndelser pÄ denna tidslinje.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och det första vi gör nÀr failovern intrÀffar Àr att söka orsaken till vad som hÀnde, vad som ledde till failovern.

Om vi tittar pÄ loggarna, sÄ Àr det klassiska Patroni-loggar. DÀr informerar den oss om att servern har blivit master och rollen som master har övergÄtt till denna nod. HÀr Àr det markerat.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vidare behöver vi förstÄ varför failovern intrÀffade, vilket vill sÀga vilka hÀndelser som ledde till att rollen som master flyttades frÄn en nod till en annan. Och i det hÀr fallet Àr det vÀldigt enkelt. Vi har ett fel i kommunikationen med lagringssystemet. Mastern insÄg att den inte kunde arbeta med DCS, det vill sÀga det uppstod nÄgot problem i kommunikationen. Och den sÀger att den inte kan vara master lÀngre och avsÀger sig sina befogenheter. Denna rad "demoted self" handlar just om det.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Om vi tittar pÄ hÀndelserna som föregick failovern, kan vi se just de orsaker som blev problematiska för att mastern skulle kunna fortsÀtta att arbeta.

Om vi tittar pÄ Patroni-loggarna, ser vi att vi har massor av olika fel, timeoutar, det vill sÀga Patroni-agenten kan inte arbeta med DCS. I det hÀr fallet Àr det Consul-agenten med vilken vi kommunicerar via port 8500.

Och problemet hÀr Àr att Patroni och databasen körs pÄ samma vÀrd. Och pÄ denna nod kördes ocksÄ Consul-servrarna. Genom att belasta servern skapade vi problem Àven för servrar Consul. De kunde inte kommunicera normalt.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Efter en viss tid, nÀr belastningen hade minskat, kunde vÄr Patroni Äterigen kommunicera med agenterna. Den normala driften Äterupptogs. Och samma server Pgdb-2 blev Äter master. Det vill sÀga det blev en liten flip som gjorde att noden avsade sig sina befogenheter som master och sedan tog dem Äter, det vill sÀga allt Ätergick till det normala.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och detta kan ses som en falsk aktivering, eller sÄ kan det ses som att Patroni gjorde allt rÀtt. Det vill sÀga den insÄg att den inte kunde upprÀtthÄlla klusterstatusen och avsade sig sina befogenheter.

Och hÀr uppstod problemet eftersom Consul-servrarna finns pÄ samma utrustning som databaserna. DÀrför pÄverkar all belastning, oavsett om det Àr belastning pÄ diskar eller processorer, interaktionen med Consul-klustret.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och vi beslutade att det inte borde leva tillsammans, vi avsatte ett separat kluster för Consul. Patroni fungerade redan med en separat Consul, det vill sÀga det fanns ett separat Postgres-kluster och ett separat Consul-kluster. Detta Àr en grundlÀggande instruktion om hur man ska dela upp dessa saker och hÄlla dem Ätskilda sÄ att de inte lever tillsammans.

Som ett alternativ kan man justera parametrarna ttl, loop_wait, retry_timeout, det vill sÀga försöka övervinna dessa kortvariga belastningsspikar genom att öka dessa parametrar. Men detta Àr inte det mest lÀmpliga alternativet, eftersom denna belastning kan vara lÄngvarig. Och vi kommer helt enkelt att överskrida grÀnserna för dessa parametrar. Och detta kan kanske inte hjÀlpa helt.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Det första problemet, som ni förstÄr, Àr enkelt. Vi tog och lade DCS tillsammans med databasen, vilket ledde till ett problem.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Det andra problemet liknar det första. Det liknar det genom att vi Äterigen har interaktionsproblem med DCS-systemet.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Om vi tittar pÄ loggarna ser vi att vi Äterigen fÄr kommunikationsfel. Och Patroni sÀger att jag inte kan interagera med DCS, dÀrför gÄr den aktuella masterinstansen in i replikeringslÀge.

Den gamla mastern blir en replik, hÀr fungerar Patroni som det ska. Den kör pg_rewind för att backa transaktionsloggen och sedan ansluta till den nya mastern för att hinna ikapp den nya mastern. HÀr fungerar Patroni som den ska.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

HÀr mÄste vi hitta den plats som föregick filsystemet, det vill sÀga de fel som orsakat problemet med filsystemet. I detta avseende Àr det ganska bekvÀmt att arbeta med loggarna i Patroni. Den skriver samma meddelanden med bestÀmda intervall. Och om vi börjar blÀddra snabbt genom dessa loggar, ser vi att loggarna har Àndrats, vilket betyder att nÄgra problem har börjat. Vi gÄr snabbt tillbaka till den platsen och ser vad som hÀnder.

Och i en normal situation ser loggarna ut ungefĂ€r sĂ„ hĂ€r. Ägaren av lĂ„set kontrolleras. Och om Ă€garen exempelvis har Ă€ndrats kan vissa hĂ€ndelser intrĂ€ffa som Patroni mĂ„ste reagera pĂ„. Men i detta fall har vi allt i ordning. Vi letar efter den punkt dĂ€r felen började.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och nÀr vi blÀddrar fram till den punkt dÀr felen började dyka upp, ser vi att vi har haft en auto-failover. Eftersom vÄra fel var relaterade till interaktionen med DCS och i vÄrt fall anvÀnde vi Consul, kollar vi Àven loggarna i Consul för att se vad som hÀnde dÀr.

Genom att ungefÀr matcha tiden för failovern med tiden i Consuls loggar, ser vi att vÄra grannar i Consul-klustret började tvivla pÄ existensen av andra deltagare i Consul-klustret.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och om vi dessutom tittar pÄ loggarna frÄn andra Consul-agenter, ser vi ocksÄ att det verkar ske en viss nÀtverkssammanbrott. Och alla deltagare i Consul-klustret tvivlar pÄ varandras existens. Detta ledde till failovern.

Om vi tittar pÄ vad som hÀnde före dessa fel, kan vi se att det finns olika typer av fel, till exempel deadline, RPC-fel, det vill sÀga tydligt ett problem med interaktionen mellan deltagarna i Consul-klustret.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Det enklaste svaret Àr att reparera nÀtverket. Men för mig, medan jag stÄr pÄ podiet, Àr det lÀtt att pÄstÄ detta. Men omstÀndigheterna Àr sÄdana att bestÀllaren inte alltid kan tillÄta sig att reparera nÀtverket. Han kan bo i datacentret och kan sakna möjligheter att laga nÀtverket eller pÄverka utrustningen. Och dÀrför behöver vi andra alternativ.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Alternativ finns:

  • Det enklaste alternativet, som stĂ„r skrivet, tror jag till och med i dokumentationen, Ă€r att stĂ€nga av Consul-kontroller, det vill sĂ€ga att helt enkelt överföra en tom array. Och vi sĂ€ger till Consul-agenten att inte anvĂ€nda nĂ„gra kontroller. Genom dessa kontroller kan vi ignorera dessa nĂ€tverksstormar och undvika att initiera failovern.
  • Ett annat alternativ Ă€r att dubbelkolla raft_multiplier. Detta Ă€r en parameter för sjĂ€lva Consul-servern. Som standard Ă€r den instĂ€lld pĂ„ vĂ€rde 5. Detta vĂ€rde rekommenderas enligt dokumentationen för staging-miljöer. I sjĂ€lva verket pĂ„verkar detta frekvensen av meddelandeutbyte mellan deltagarna i Consul-nĂ€tverket. I praktiken pĂ„verkar denna parameter hastigheten pĂ„ kommunikationen mellan deltagarna i Consul-klustret. Och för produktion rekommenderas det att minska den sĂ„ att noderna oftare utbyter meddelanden.
  • Ett annat alternativ som vi har börjat anvĂ€nda Ă€r att öka prioriteten för Consul-processer bland andra processer för operativsystemets schemalĂ€ggare. Det finns en parameter som heter "nice", som definierar processen prioritet som tas i beaktande av OS-schemalĂ€ggaren vid schemalĂ€ggning. Vi justerade och sĂ€nkte vĂ€rdet för nice för Consul-agenterna, det vill sĂ€ga vi höjde prioriteten, sĂ„ att operativsystemet ger Consul-processerna mer tid för att arbeta och köra sin kod. I vĂ„rt fall löste detta vĂ„rt problem.
  • Ett annat alternativ Ă€r att inte anvĂ€nda Consul. Jag har en vĂ€n som Ă€r stor anhĂ€ngare av Etcd. Och vi diskuterar regelbundet vilken som Ă€r bĂ€ttre, Etcd eller Consul. Men nĂ€r det kommer till vilket som Ă€r bĂ€ttre, brukar vi vanligtvis vara överens om att Consul har en agent som mĂ„ste köras pĂ„ varje nod med databasen. Det vill sĂ€ga, interaktionen mellan Patroni och Consul-klustret gĂ„r genom denna agent. Och den hĂ€r agenten blir en flaskhals. Om det hĂ€nder nĂ„got med agenten kan inte Patroni arbeta med Consul-klustret. Och detta Ă€r ett problem. NĂ€r det gĂ€ller Etcd finns det ingen agent. Patroni kan arbeta direkt med listan över Etcd-servrar och kommunicera med dem. I det avseendet, om du anvĂ€nder Etcd i ditt företag, sĂ„ Ă€r Etcd förmodligen det bĂ€sta valet jĂ€mfört med Consul. Men vi Ă€r alltid begrĂ€nsade av vad kunden har valt och anvĂ€nder. Och hos vĂ„ra kunder har vi mestadels Consul.
  • Och den sista punkten Ă€r att se över vĂ€rdena för parametrarna. Vi kan öka dessa parametrar större i hopp om att vĂ„ra kortvariga nĂ€tverksproblem kommer att vara kortvariga och inte överstiga intervallen för dessa parametrar. PĂ„ sĂ„ sĂ€tt kan vi minska aggressiviteten hos Patroni vid genomförandet av autofailover om nĂ€tverksproblem uppstĂ„r.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Jag tror att mÄnga som anvÀnder Patroni Àr bekanta med detta kommando.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Detta kommando visar den aktuella statusen för klustret. Och vid första anblicken kan denna bild verka normal. Vi har en master, vi har en replik, och det finns ingen replikationsfördröjning. Men denna bild Àr normal endast sÄ lÀnge vi inte vet att det i detta kluster borde finnas tre noder, inte tvÄ.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

DÀrmed intrÀffade en auto failover. Efter denna auto failover försvann vÄr replik. Vi behöver ta reda pÄ varför den försvann och fÄ tillbaka den, ÄterstÀlla den. Och vi gÄr Äterigen igenom loggarna och undersöker varför vi hade en auto failover.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

I det hÀr fallet blev den andra repliken master. Allt Àr i ordning hÀr.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vi behöver titta pÄ repliken som kopplades bort och som inte Àr i klustret. Vi öppnar Patroni-loggarna och ser att vi hade ett problem vid anslutningen till klustret under pg_rewind-stadiet. För att ansluta till klustret mÄste man rulla tillbaka transaktionsloggen, begÀra den nödvÀndiga transaktionsloggen frÄn mastern och dÀrigenom hinna ikapp mastern.

I det hÀr fallet har vi ingen transaktionslogg och repliken kan inte starta. DÀrmed stoppar vi Postgres med ett fel. DÀrför finns den inte i klustret.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vi mÄste förstÄ varför den inte finns i klustret och varför det inte fanns nÄgra loggar. Vi gÄr till den nya mastern och ser vad som stÄr i loggarna. Det visar sig att nÀr pg_rewind utfördes intrÀffade en checkpoint. Och en del av de gamla transaktionsloggarna var helt enkelt omdöpta. NÀr den gamla mastern försökte ansluta till den nya mastern och begÀrde dessa loggar, sÄ var de redan omdöpta, de fanns helt enkelt inte.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Jag jÀmförde tidsstÀmplarna för nÀr dessa hÀndelser intrÀffade. Och det var en skillnad pÄ endast 150 millisekunder, dvs. checkpointen avslutades pÄ 369 millisekunder, WAL-segmenten hade omdöpts. Och efter bara 517 millisekunder, 150 millisekunder senare, startade rewind pÄ den gamla repliken. Det vill sÀga, vi hade precis 150 millisekunder som gjorde att repliken inte kunde ansluta och starta.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vilka alternativ finns?

Vi anvĂ€nde ursprungligen reproduktionsplatser. Vi trodde att detta var bra. Även om vi vid det första anvĂ€ndningssteget stĂ€ngde av dessa platser. Vi trodde att om platserna samlade för mĂ„nga WAL-segment, skulle vi kunna krascha mastern. Den skulle falla. Vi kĂ€mpade ett tag utan platser. Och insĂ„g att vi behövde platser, vi Ă„tervĂ€nde till anvĂ€ndningen av platser.

Men hÀr finns ett problem, att nÀr master gÄr över till en replik sÄ raderar den slots och tillsammans med slots raderas WAL-segment. För att undvika detta problem beslutade vi att öka parametern wal_keep_segments. Som standard Àr det 8 segment. Vi höjde 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Àngligt pÄ alla noder.

Och dessutom – det Ă€r fortfarande relevant för lĂ„ngvariga underhĂ„llsuppgifter. LĂ„t oss sĂ€ga att vi behöver uppdatera en av replikerna. Och vi vill stĂ€nga av den. Vi mĂ„ste uppdatera mjukvaran, kanske operativsystemet, nĂ„got annat. Och nĂ€r vi stĂ€nger av repliken raderas ocksĂ„ slotten för den repliken. Och om vi anvĂ€nder en liten wal_keep_segments, sĂ„ nĂ€r repliken Ă€r borta under en lĂ€ngre tid, kommer transaktionsloggarna att spelas upp. Vi startar upp repliken, den kommer att begĂ€ra de transaktionsloggar dĂ€r den slutade, men det kanske inte finns nĂ„gra kvar pĂ„ master. Och repliken kan inte koppla upp sig. DĂ€rför har vi ett stort lager av loggar.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vi har en produktionsdatabas. DĂ€r arbetar redan projekt.

Det intrĂ€ffade en file failure. Vi gick in och kollade – allt var okej, replikerna var pĂ„ plats, det fanns ingen replikationsförsening. Det fanns inga fel i loggarna, allt var i ordning.

Produktteamet sÀger att det som verkar som om det borde finnas nÄgra data, men vi ser dem i en kÀlla, men vi ser dem inte i databasen. Och vi mÄste förstÄ vad som hÀnde med dem.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Det Àr klart att pg_rewind raderade dem. Det förstod vi direkt, men vi gick för att se vad som hÀnde.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

I loggarna kan vi alltid hitta nÀr file failuren intrÀffade, vem som blev master och vi kan identifiera vem som var den gamla master och nÀr den ville bli replik. D.v.s. vi behöver dessa loggar för att ta reda pÄ den mÀngd transaktionsloggar som gick förlorade.

VĂ„r gamla master startade om. Och i autostart var Patroni angivet. Patroni startades. Den följde upp med att starta Postgres. Snarare, innan Postgres startades och innan den gjordes till replik, startade Patroni processen pg_rewind. Följaktligen raderade den en del av transaktionsloggarna, laddade ner nya och kopplade upp sig. HĂ€r fungerade Patroni utmĂ€rkt, d.v.s. som vanligt. Klustret Ă„terstĂ€lldes. Vi hade 3 noder, efter file failuren 3 noder – allt var toppen.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vi har förlorat en del data. Och vi behöver förstĂ„ hur mycket vi har förlorat. Vi letar efter det ögonblick dĂ„ vi hade en Ă„terstĂ€llning. Vi kan hitta det genom sĂ„dana poster i loggen. ÅterstĂ€llningen startade, gjorde nĂ„got och avslutades.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vi behöver hitta den position i transaktionsloggen dÀr den gamla masterservern stannade. I det hÀr fallet Àr det den hÀr punkten. Och vi behöver en andra punkt, det vill sÀga avstÄndet mellan den gamla masterservern och den nya.

Vi tar helt enkelt pg_wal_lsn_diff och jÀmför dessa tvÄ punkter. I det hÀr fallet fÄr vi 17 megabyte. Om det Àr mycket eller lite Àr upp till var och en att avgöra. För vissa Àr 17 megabyte lite, för andra mycket och oacceptabelt. HÀr fÄr varje person individuellt avgöra i enlighet med affÀrens behov.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Men vad har vi kommit fram till?

För det första mÄste vi avgöra om vi alltid behöver att Patroni startar automatiskt efter systemÄterstÀllning. Oftare Àr det sÄ att vi mÄste gÄ in pÄ den gamla masterservern, se hur lÄngt den har kommit. Kanske inspektera segmenten av transaktionsloggen, se vad som finns dÀr. Och förstÄ om vi kan förlora dessa data eller om vi behöver starta den gamla masterservern i standalone-lÀge för att fÄ ut dessa data.

Och först efter det ska vi fatta beslut om vi kan avstÄ dessa data eller om vi kan ÄterstÀlla dem och koppla den hÀr noden som en replik i vÄr kluster.

Dessutom finns det en parameter kallad "maximum_lag_on_failover". Om jag inte minns fel, sÄ har den hÀr parametern som standard vÀrdet 1 megabyte.

Hur fungerar den? Om vÄr replik ligger efter med 1 megabyte i datalag frÄn replikationen, dÄ deltar inte denna replik i valet. Och om det hÀnder en failover, ser Patroni vilka repliker som ligger efter. Om de ligger efter med ett stort antal transaktionsloggar, kan de inte bli master. Detta Àr en mycket bra skyddsfunktion som förhindrar att mycket data gÄr förlorad.

Men det finns ett problem med att lagret för replikation i Patroni-klustret och DCS uppdateras med ett visst intervall. Enligt min mening Àr standardvÀrdet ttl 30 sekunder.

Det kan dÀrför uppstÄ en situation dÀr replikationsfördröjningen för repliker i DCS Àr en, medan den i verkligheten kan vara helt annan eller inte finnas alls, det vill sÀga denna sak Àr inte realtidsbaserad. Och den speglar inte alltid den verkliga situationen. Att bygga komplicerad logik pÄ den Àr inte vÀrt det.

Och risken för dataförlust finns alltid kvar. I vÀrsta fall finns en formel, och i genomsnitt en annan. Det vill sÀga nÀr vi planerar att implementera Patroni och bedömer hur mycket data vi kan förlora, mÄste vi rÀkna med dessa formler och ha en ungefÀrlig uppfattning om hur mycket data vi kan mista.

Och det finns goda nyheter. NÀr den gamla mastern har gÄtt framÄt kan den ha gjort det pÄ grund av vissa bakgrundsprocesser. Det vill sÀga, det kan ha funnits en autovakuum som skrev data och sparade dem i transaktionsloggen. Dessa data kan vi enkelt ignorera och förlora. Det Àr inte ett problem.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och sÄ ser loggarna ut om maximum_lag_on_failover Àr instÀllt och en failover har intrÀffat, och en ny master mÄste vÀljas. Repliken bedömer sig sjÀlv som oförmögen att delta i valet. Den avböjer att delta i kampen om ledarskapet. Och den vÀntar pÄ att en ny master ska vÀljas för att sedan ansluta till den. Detta Àr en extra ÄtgÀrd för att förhindra datarförlust.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

HÀr har vÄrt produktteam skrivit att deras produkt har problem nÀr den arbetar med Postgres. Samtidigt kan man inte komma Ät sjÀlva mastern eftersom den inte Àr tillgÀnglig via SSH. Och auto-failover sker inte heller.

Denna host skickades tvingat pÄ omstart. PÄ grund av omstarten intrÀffade en auto-failover, Àven om det hade varit möjligt att utföra en manuell auto-failover, som jag nu förstÄr. Och efter omstarten gÄr vi redan för att se vad som hÀnde med den nuvarande mastern.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vi visste pÄ förhand att vi hade problem med diskarna, det vill sÀga vi visste redan via övervakningen var vi skulle grÀva och vad vi skulle leta efter.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vi gick in i postgres-loggen och började titta pÄ vad som hÀnde dÀr. Vi sÄg commits som pÄgick i en, tvÄ eller tre sekunder, vilket Àr helt onormalt. Vi sÄg att vÄrt autovakuum startade vÀldigt lÄngsamt och konstigt. Och vi sÄg temporÀra filer pÄ disken. Det vill sÀga, allt detta Àr indikatorer pÄ problem med diskarna.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vi tittade i systemets dmesg (i loggen för kÀrnmeddelanden). Och vi sÄg att vi hade problem med en av diskarna. DiskunderhÄllssystemet var en mjukvaru-Raid. Vi sÄg pÄ /proc/mdstat och sÄg att vi saknade en disk. Det vill sÀga, hÀr har vi ett Raid av 8 diskar, vi saknar en. Om man noggrant tittar pÄ bilden kan man se att sde saknas. Vi kan sÀga att en disk tappades. Detta triggar diskproblem och applikationerna fick ocksÄ problem med att arbeta med Postgres-klustret.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och i det hÀr fallet skulle Patroni inte ha hjÀlpt oss, eftersom Patroni inte har som uppgift att övervaka serverns tillstÄnd, diskens tillstÄnd. Vi mÄste övervaka sÄdana situationer med extern monitorering. Vi lade till diskövervakning i den externa monitoreringen snabbt.

Och det fanns en tanke – skulle fencing eller mjukvaru-watchdog kunna hjĂ€lpa oss? Vi trodde att det troligen inte skulle ha hjĂ€lpt oss i det hĂ€r fallet, eftersom Patroni fortsatte att interagera med DCS-klustret under problemen och inte sĂ„g nĂ„got problem. Det vill sĂ€ga, frĂ„n DCS:s och Patronis synpunkt var det inga problem med klustret, Ă€ven om det i verkligheten fanns diskproblem och problem med tillgĂ€ngligheten av databasen.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Enligt min Äsikt Àr detta ett av de konstigaste problemen som jag undersökte mycket lÀnge, lÀste igenom mÄnga loggar och jag kallade det kluster-simuleringen.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Problemet var att den gamla master-databasen inte kunde bli en normal replik, det vill sÀga 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ör. Detta sparade jag frÄn analysen av det problemet.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och hur började allt? Det började, som i det föregÄende problemet, med diskproblem. Vi hade commits per sekund, en eller tvÄ.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Det var avbrott i anslutningar, det vill sÀga kunderna blev diskontinuerliga.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Det fanns blockeringar av olika svÄrighetsgrad.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och dÀrmed var diskunderhÄllssystemet inte sÀrskilt responsivt.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och det mest mystiska för mig var den omedelbara avstÀngningsbegÀran. Postgres har tre avstÀngningslÀgen:

  • Detta Ă€r graceful, nĂ€r vi vĂ€ntar pĂ„ att alla kunder ska stĂ€nga av sig sjĂ€lva.
  • Det finns fast, nĂ€r vi tvingar kunder att stĂ€nga av sig, eftersom vi gĂ„r för att stĂ€nga av.
  • Och immediate. I det hĂ€r fallet meddelar inte ens immediate kunderna att de behöver stĂ€nga av sig, det stĂ€ngs bara av utan förvarning. Och alla kunder fĂ„r ett meddelande frĂ„n operativsystemet RST (TCP-meddelande om att anslutningen har avbrutits och att kunden inte lĂ€ngre har nĂ„got att hĂ€mta).

Vem skickade den hÀr signalen? Bakgrundsprocesser i Postgres skickar inte sÄdana signaler till varandra, det vill sÀga, det Àr kill -9. De skickar inte sÄdana signaler till varandra, de reagerar bara pÄ sÄdana, sÄ det Àr en akut omstart av Postgres. Jag vet inte vem som skickade den.

Jag kollade kommandot "last" och sÄg en person som ocksÄ loggade in pÄ den hÀr servern tillsammans med oss, men jag kÀnde mig obekvÀm med att stÀlla frÄgan. 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Äg inte detta i loggarna.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vid vidare granskning sÄg jag att Patroni inte hade skrivit i loggen pÄ ganska lÀnge - 54 sekunder. Och om man jÀmför tvÄ tidsstÀmplar, hÀr fanns det ungefÀr 54 sekunder utan meddelanden.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och under den tiden intrÀffade en automatisk failover. Patroni fungerade Äterigen utmÀrkt. VÄr gamla huvudserver var inte tillgÀnglig, det hÀnde nÄgot med den. Och valet av en ny huvudserver inleddes. HÀr fungerade allt bra. VÄr pgsql01 blev den nya ledaren.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vi har en replik som blivit huvudserver. Och det finns en andra replik. Och med den andra repliken fanns det just problem. Den försökte rekonfigurera sig. Som jag förstÄr det försökte den Àndra recovery.conf, starta om Postgres och ansluta till den nya huvudservern. Den skriver meddelanden var 10:e sekund att den försöker, men det gÄr inte.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och under dessa försök fÄr den gamla huvudservern en immediate-shutdown signal. Huvudservern startar om. Och ÄterhÀmtningsprocessen avbryts ocksÄ, eftersom den gamla huvudservern gÄr in i omstart. Det vill sÀga, repliken kan inte ansluta till den, eftersom den Àr i avstÀngningslÀge.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Vid ett tillfÀlle började den fungera, men replikationen startade inte.

Jag har en enda hypotes, att recovery.conf hade adressen till den gamla huvudservern. Och nÀr den nya huvudservern dök upp, fortsatte den andra repliken att försöka ansluta till den gamla huvudservern.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

NÀr Patroni startade pÄ den andra repliken, startade noden, men kunde inte ansluta för replikation. Och en replikationsfördröjning uppstod som sÄg ut ungefÀr sÄ hÀr. Det vill sÀga, alla tre noder var pÄ plats, men den andra noden var efter.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Om man tittar pÄ loggarna som skrevs kan man se att replikeringen inte kan starta eftersom transaktionsloggarna skiljer sig Ät. De transaktionsloggar som mÀstaren erbjuder, som anges i recovery.conf, passar helt enkelt inte vÄr nuvarande nod.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

HÀr gjorde jag ett misstag. Jag borde ha gÄtt och kikat pÄ vad som fanns i recovery.conf för att kontrollera min hypotes om att vi ansluter oss till fel mÀstare. Men jag höll precis pÄ att sÀtta mig in i det hÀr och det slog mig inte, eller sÄ sÄg jag att replikeringen lÄg efter och att den mÄste synkas om, det vill sÀga jag gjorde det lite slarvigt. Det var mitt misstag.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Tretti minuter senare kom administratören, det vill sĂ€ga jag startade om Patroni pĂ„ repliken. Jag hade redan gett upp om den, jag trodde att den skulle behöva synkas om. Och jag tĂ€nkte – jag startar om Patroni, kanske nĂ„got bra kan hĂ€nda. ÅterstĂ€llningen startade. Och databasen öppnades till och med, den var redo att ta emot anslutningar.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Replikeringen startade. Men efter en minut föll den och gav ett felmeddelande om att transaktionsloggarna inte passade.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Jag tÀnkte att jag skulle starta om den en gÄng till. Jag startade om Patroni igen, och jag startade inte om Postgres, utan just Patroni, i hopp om att den pÄ nÄgot magiskt sÀtt skulle starta databasen.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Replikeringen började igen, men mÀrkena i transaktionsloggen skilde sig, de var inte de som fanns vid det tidigare försöket att starta. Replikeringen stoppades igen. Och meddelandet var nu lite annorlunda. Och det var inte sÀrskilt informativt för mig.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Och plötsligt kom jag pĂ„ – vad hĂ€nder om jag startar om Postgres, och samtidigt gör jag en checkpoint pĂ„ den aktuella mĂ€staren för att flytta punkten i transaktionsloggen lite framĂ„t, sĂ„ att Ă„terstĂ€llningen kan börja frĂ„n ett annat ögonblick? Plus att vi hade lite WAL-filer sparade.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Jag startade om Patroni, gjorde ett par checkpoints pÄ mÀstaren, ett par restart-punkter pÄ repliken nÀr den öppnades. Och det hjÀlpte. Jag tÀnkte lÀnge pÄ varför det hjÀlpte och hur det fungerade. Och repliken startade. Och replikeringen avbröts inte lÀngre.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Ett sÄdant problem Àr en av de mer gÄtfulla för mig som jag fortfarande funderar över, vad som egentligen hÀnde.

Vilka slutsatser kan vi dra hÀr? Patroni kan fungera som avsett utan nÄgra fel. Men detta Àr ingen 100% garanti för att allt fungerar bra. En replik kan starta, men den kan befinna sig i ett halvfÀrdigt tillstÄnd, och applikationen kan inte arbeta med en sÄdan replik eftersom dÀr kommer att finnas gamla data.

Och efter varje failover mÄste vi alltid kontrollera att allt Àr i ordning med klustret, dvs att vi har det nödvÀndiga antalet repliker och att det inte finns nÄgon replikationsfördröjning.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Under denna process av att granska dessa problem kommer jag att formulera rekommendationer. Jag försökte sammanfoga dem i tvÄ bilder. Antagligen skulle alla historier kunna sammanfattas i tvÄ bilder och bara berÀtta om dem.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

NÀr du anvÀnder Patroni mÄste du ha övervakning. Du mÄste alltid veta nÀr en auto-failover intrÀffade, för om du inte vet att du hade en auto-failover, sÄ kontrollerar du inte klustret. Och det Àr dÄligt.

Efter varje failover mÄste vi alltid manuellt kontrollera klustret. Vi mÄste försÀkra oss om att vi alltid har det aktuella antalet repliker, att det inte finns nÄgon replikationsfördröjning, och att det inte finns nÄgra fel i loggarna relaterade till streaming-replikation, Patroni eller DCS-systemet.

Automatiseringen kan fungera bra, Patroni Àr ett mycket bra verktyg. Den kan fungera, men det kommer inte att leda klustret till det önskade tillstÄndet. Och om vi inte fÄr veta det kommer vi att ha problem.

Och Patroni Àr ingen silverkula. Vi mÄste fortfarande ha en förstÄelse för hur Postgres fungerar, hur replikation fungerar och hur Patroni interagerar med Postgres, samt hur kommunikationen mellan noder sÀkerstÀlls. Detta behövs för att kunna lösa problem som uppstÄr manuellt.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Hur nÀrmar jag mig frÄgan om diagnostik? SÄ har det blivit att vi arbetar med olika kunder och ingen har en ELK-stack, sÄ vi mÄste gÄ igenom loggarna med sex konsoler och tvÄ flikar öppna. I en flik Àr det loggar för Patroni för varje nod, och i den andra fliken Àr det loggar frÄn Consul eller Postgres vid behov. Det Àr mycket svÄrt att diagnostisera.

Vilka metoder har jag utvecklat? Först och frÀmst tittar jag alltid pÄ nÀr failovern intrÀffade. Och för mig Àr det en slags delgrÀns. Jag tittar pÄ vad som hÀnde före, under och efter failovern. Failovern har tvÄ tidpunkter: en start- och en sluttid.

DÀrefter tittar jag i loggarna pÄ hÀndelserna före failover, det vill sÀga jag letar efter orsakerna till varför failover intrÀffade.

Och det ger en bild av förstÄelsen för vad som hÀnde och vad som kan göras i framtiden för att undvika sÄdana omstÀndigheter (och följaktligen för att undvika en failover).

Och vart ser vi vanligtvis? Jag kollar:

  • Först i Patroni-loggarna.
  • DĂ€refter kollar jag Postgres-loggarna, eller DCS-loggarna beroende pĂ„ vad som hittades i Patroni-loggarna.
  • Och systemloggarna ger ibland ocksĂ„ förstĂ„else för vad som var orsaken till failovern.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

Hur ser jag pÄ Patroni? Jag anser att Patroni Àr mycket bra. Enligt min mening Àr det det bÀsta som finns idag. Jag kÀnner till mÄnga andra produkter. Det finns Stolon, Repmgr, Pg_auto_failover, PAF. Fyra verktyg. Jag har provat dem alla. Patroni gillade jag mest.

Om jag blir frÄgad: "Rekommenderar jag Patroni?". Jag sÀger ja, för jag gillar Patroni. Och jag tror att jag har lÀrt mig att anvÀnda det.

Om du Àr intresserad av att se vilka andra problem som finns med Patroni förutom de problem jag nÀmnt, kan du alltid gÄ till sidan issues pÄ GitHub. DÀr finns mÄnga olika historier och mÄnga intressanta problem diskuteras. Och i slutÀndan har vissa buggar registrerats och lösts, det Àr intressant lÀsning.

DÀr finns intressanta historier om hur folk skjuter sig sjÀlva i foten. Mycket lÀrorikt. Man lÀser och förstÄr att man inte ska göra sÄ. Man sÀtter en bock.

Och jag vill gÀrna tacka företaget Zalando för att de utvecklar detta projekt, speciellt Alexander Kukushkin och Alexey Klukin. Alexey Klukin Àr en av medförfattarna, han jobbar inte lÀngre pÄ Zalando, men det Àr tvÄ personer som började arbeta med denna produkt.

Och jag tycker att Patroni Àr en mycket hÀftig grej. Jag Àr glad att den finns, den Àr 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 Àr redan funktionell, men jag hoppas att den blir Ànnu bÀttre. SÄ om du planerar att anvÀnda Patroni, tveka inte. Det Àr en bra lösning, den kan implementeras och anvÀndas.

Det var allt. Om ni har nÄgra frÄgor, stÀll dem gÀrna.

Patroni-felhistorier eller hur man kraschar ditt PostgreSQL-kluster. Alexey Lesovsky

FrÄgor

Tack för presentationen! Om man fortfarande mÄste titta noga efter en failover, varför behöver vi dÄ en automatisk failover?

För att detta Ă€r nĂ„got nytt. Vi har bara arbetat med det i ett Ă„r. BĂ€ttre att vara försiktig. Vi vill gĂ„ in och se att allt verkligen har fungerat som det ska. Det Ă€r en nivĂ„ av vuxen misstro – bĂ€ttre att dubbelkolla och titta.

Till exempel, vi gick in pÄ morgonen och kollade, eller hur?

Inte pÄ morgonen, vi fÄr vanligtvis veta om auto-failover nÀstan omedelbart. Vi fÄr notiser, vi ser att det har skett en auto-failover. Vi gÄr nÀstan direkt in och kollar. Men alla dessa kontroller bör lÀggas pÄ övervakningsnivÄ. Om vi ansluter till Patroni via REST API, finns det en historik. Genom historiken kan man se tidsstÀmplar för nÀr failovern intrÀffade. Baserat pÄ detta kan vi göra övervakning. Vi kan se historiken, hur mÄnga hÀndelser det har varit. Om vi har fÄtt fler hÀndelser, betyder det att en auto-failover har intrÀffat. Man kan gÄ in och kolla. Antingen har vÄr automation i övervakningen kontrollerat att alla vÄra repliker Àr pÄ plats, att det inte finns nÄgot lagg och att allt Àr bra.

Tack!

Stort tack för en fantastisk berÀttelse! Om vi har flyttat DCS-klustret lÄngt bort frÄn Postgres-klustret, mÄste det klustret ocksÄ underhÄllas periodiskt? Vilka Àr bÀsta praxis nÀr det gÀller att stÀnga av vissa delar av DCS-klustret, göra nÄgot med dem osv.? Hur fungerar hela denna struktur under tiden? Och hur gör man dessa saker?

För ett företag behövde vi skapa en matriss över problem, vad som hÀnder om nÄgon av komponenterna eller flera komponenter slutar fungera. Genom denna matris gÄr vi systematiskt igenom alla komponenter och bygger scenarier för vad som hÀnder vid fel pÄ dessa komponenter. DÀrför kan man för varje fel-scenario ha en handlingsplan för ÄterstÀllning. I fallet med DCS gÄr detta som en del av den standardinfrastruktur. Och administratören hanterar det, och vi litar redan pÄ administratörerna som hanterar det och pÄ deras förmÄga att fixa det vid incidenter. Om DCS inte finns, dÄ distribuerar vi det, men vi hÄller inte sÀrskilt koll pÄ det eftersom vi inte ansvarar för infrastrukturen, men ger rekommendationer om hur och vad man ska övervaka.

Det vill sÀga, har jag förstÄtt rÀtt att vi mÄste stÀnga av Patroni, stÀnga av failovern, stÀnga av allt innan vi gör nÄgot med vÀrdarna?

Det beror pĂ„ hur mĂ„nga noder vi har i DCS-klustret. Om det finns mĂ„nga noder och vi endast gör en nod (replica) otillgĂ€nglig, finns det fortfarande konsensus i klustret. Och Patroni förblir funktionellt. Och ingenting triggas. Om vi har nĂ„gra komplexa operationer som berör fler noder, vars frĂ„nvaro kan förstöra konsensus, sĂ„ ja, kanske Ă€r det vettigt att pausa Patroni. Den har en motsvarande kommando – patronictl pause, patronictl resume. Vi sĂ€tter bara pĂ„ paus och automatisk failover aktiveras inte under denna tid. Vi gör underhĂ„ll pĂ„ DCS-klustret, sedan tar vi pausen bort och fortsĂ€tter som vanligt.

Stort tack!

Stort tack för presentationen! Hur ser produktteamet pÄ risken för databasförlust?

Produktteam bryr sig inte, men teamledarna Àr oroliga.

Vilka garantier finns?

Det Àr vÀldigt svÄrt med garantier. Det finns en presentation av Alexander Kukushkin "Hur man berÀknar RPO och RTO", dvs. tid för ÄterstÀllning och hur mycket data vi kan förlora. Jag tror att vi mÄste hitta dessa bilder och studera dem. SÄvitt jag minns finns det specifika steg för hur man berÀknar dessa saker. Hur mÄnga transaktioner vi kan förlora, hur mycket data vi kan förlora. Som alternativ kan vi anvÀnda synkron replikering pÄ Patroni-nivÄ, men det Àr en dubbelteckning: vi antingen fÄr datats pÄlitlighet eller förlorar hastighet. Det finns synkron replikering, men det garanterar inte 100% skydd mot databasförlust.

Alexei, tack för den utmÀrkta presentationen! Finns det erfarenhet av att anvÀnda Patroni för zero level protection? Dvs. tillsammans med synkron standby? Det Àr den första frÄgan. Och den andra frÄgan. Ni har anvÀnt olika lösningar. Vi anvÀnde Repmgr, men utan automatisk failover och planerar nu att koppla pÄ automatisk failover. Vi övervÀger att anvÀnda Patroni som en alternativ lösning. Vad kan ni sÀga om fördelarna jÀmfört med Repmgr?

Den första frĂ„gan handlade om synkrona repliker. Ingen anvĂ€nder synkron replikering hos oss, för alla Ă€r rĂ€dda (Flera kunder anvĂ€nder redan den, och vi har inte mĂ€rkt nĂ„gra prestandaproblem — AnmĂ€rkning frĂ„n talaren). Men vi har utvecklat en regel för oss sjĂ€lva att det i en klynga med synkron replikering mĂ„ste finnas minst tre noder, eftersom om vi har tvĂ„ noder och antingen master eller en replik gĂ„r ner, sĂ„ gĂ„r Patroni över den noden till Standalone-lĂ€ge för att applikationen ska fortsĂ€tta fungera. I det hĂ€r fallet finns det risker för dataloss.

AngÄende den andra frÄgan har vi anvÀnt Repmgr och anvÀnder fortfarande det hos vissa kunder av historiska skÀl. Vad kan man sÀga? I Patroni Àr auto-failover inbyggt, medan i Repmgr Àr auto-failover en extra funktion som mÄste aktiveras. Vi behöver starta Repmgr-daemonen pÄ varje nod, sÄ kan vi konfigurera auto-failover.

Repmgr kontrollerar om Postgres-noderna Ă€r aktiva. Repmgr-processerna kontrollerar varandras existens, vilket inte Ă€r en sĂ€rskilt effektiv strategi dĂ„ det kan förekomma komplexa fall av nĂ€tverksisolering dĂ€r en stor Repmgr-klynga kan splittras i flera smĂ„ och fortsĂ€tta fungera. Jag har inte följt Repmgr pĂ„ lĂ€nge, kanske har de fixat detta
 eller kanske inte. Men att föra ut information om klyngans status till DCS, som görs av Stolon och Patroni, Ă€r den mest livskraftiga lösningen.

Alexey, jag har en frÄga, kanske en lite okunnig. I ett av de tidigaste exemplen flyttade ni DCS frÄn en lokal maskin till en fjÀrrnod. Vi förstÄr att nÀtverket har sina egna egenskaper, det lever sitt eget liv. Vad hÀnder om DCS-klyngan blir otillgÀnglig av nÄgon anledning? Jag tÀnker inte gÄ in pÄ orsaker, det kan finnas mÄnga: allt frÄn dÄligt arbete av nÀtverksingenjörer till verkliga problem.

Jag har inte sagt detta högt, men DCS-klyngan mÄste ocksÄ vara driftsÀker, det vill sÀga ha ett udda antal noder sÄ att kvorum kan samlas. Vad hÀnder om DCS-klyngan blir otillgÀnglig, eller om kvorum inte kan samlas, till exempel vid en nÀtverksdelning eller nodfel? I det hÀr fallet gÄr Patroni-klyngan in i read only-lÀge. Patroni-klyngan kan inte avgöra klyngans tillstÄnd och vad den ska göra. Den kan inte kommunicera med DCS och spara det nya tillstÄndet för klyngan dÀr, sÄ hela klyngan gÄr in i read only-lÀge. Den vÀntar antingen pÄ manuell intervention frÄn operatören eller pÄ att DCS ska ÄterstÀllas.

I grova drag blir DCS för oss en tjÀnst som Àr lika viktig som databasen sjÀlv?

Ja, precis. I mÄnga moderna företag Àr Service Discovery en oumbÀrlig del av infrastrukturen. Det implementeras oftast Ànnu tidigare Àn databaserna i infrastrukturen. Man kan sÀga att man har startat infrastrukturen, rullat ut i datacentret, och man har redan Service Discovery pÄ plats. Om det Àr Consul, kan DNS byggas pÄ det. Om det Àr Etcd, kan det vara en del av en Kubernetes-kluster dÀr all annan funktionalitet kommer att rullas ut. Jag tror att Service Discovery redan Àr en integrerad del av moderna infrastrukturer. Man börjar tÀnka pÄ det mycket tidigare Àn pÄ databaser.

Tack!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster