Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Patroni galvenais mērÄ·is ir nodroÅ”ināt augstu PostgreSQL pieejamÄ«bu. Bet Patroni ir tikai veidne, nevis gatavs rÄ«ks (kas kopumā ir teikts dokumentācijā). No pirmā acu uzmetiena, iestatot Patroni testa laboratorijā, varat redzēt, cik tas ir lielisks rÄ«ks un cik viegli tas tiek galā ar mÅ«su mēģinājumiem izjaukt kopu. Taču praksē ražoÅ”anas vidē ne vienmēr viss notiek tik skaisti un eleganti kā testa laboratorijā.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

PastāstÄ«Å”u mazliet par sevi. Es sāku strādāt kā sistēmas administrators. Strādājis tÄ«mekļa izstrādē. Es strādāju Data Egret kopÅ” 2014. gada. Uzņēmums nodarbojas ar konsultācijām Postgres jomā. Un mēs apkalpojam tieÅ”i Postgres, un mēs strādājam ar Postgres katru dienu, tāpēc mums ir dažādas zināŔanas saistÄ«bā ar darbÄ«bu.

Un 2018. gada beigās mēs sākām lēnām lietot Patroni. Un zināma pieredze ir uzkrāta. Mēs kaut kā to diagnosticējām, noregulējām, nonācām pie savas labākās prakses. Un Å”ajā ziņojumā es par tiem runāŔu.

Izņemot Postgres, man patÄ«k Linux. Man patÄ«k tajā bakstÄ«ties un izpētÄ«t, man patÄ«k vākt serdes. Man patÄ«k virtualizācija, konteineri, doks, Kubernetes. Tas viss mani interesē, jo ietekmē vecie admin paradumi. Man patÄ«k nodarboties ar monitoringu. Un man patÄ«k postgres lietas, kas saistÄ«tas ar administrÄ“Å”anu, t.i., replikāciju, dublÄ“Å”anu. Un brÄ«vajā laikā rakstu Go. Es neesmu programmatÅ«ras inženieris, es vienkārÅ”i rakstu sev Go. Un tas man sagādā prieku.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

  • Es domāju, ka daudzi no jums zina, ka Postgres nav pieejams HA (augsta pieejamÄ«ba). Lai iegÅ«tu HA, jums kaut kas jāinstalē, jākonfigurē, jāpieliek pÅ«les un jāiegÅ«st tas.
  • Ir vairāki rÄ«ki, un Patroni ir viens no tiem, kas lieliski un ļoti labi atrisina HA. Bet, ievietojot to visu testa laboratorijā un palaižot to, mēs varam redzēt, ka tas viss darbojas, mēs varam reproducēt dažas problēmas, redzēt, kā Patroni tās apkalpo. Un mēs redzēsim, ka tas viss darbojas lieliski.
  • Taču praksē mēs saskārāmies ar dažādām problēmām. Un es runāŔu par Ŕīm problēmām.
  • Es jums pastāstÄ«Å”u, kā mēs to diagnosticējām, ko mēs pielāgojām - vai tas mums palÄ«dzēja vai nē.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

  • Patroni nestāstÄ«Å”u, jo internetā var googlēt, var paskatÄ«ties konfigurācijas failus, lai saprastu, kā tas viss sākas, kā tiek konfigurēts. Var saprast shēmas, arhitektÅ«ru, atrodot informāciju par to internetā.
  • Par kāda cita pieredzi nerunāŔu. Es runāŔu tikai par problēmām, ar kurām mēs saskārāmies.
  • Un es nerunāŔu par problēmām, kas ir ārpus Patroni un PostgreSQL. Ja, piemēram, ir problēmas, kas saistÄ«tas ar balansÄ“Å”anu, kad mÅ«su klasteris ir sabrucis, es par to nerunāŔu.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un neliela atruna pirms ziņojuma sākÅ”anas.

Visas Ŕīs problēmas, ar kurām mēs saskārāmies, mums tās bija pirmajos 6-7-8 darbÄ«bas mēneÅ”os. Laika gaitā mēs nonācām pie savas iekŔējās paraugprakses. Un mÅ«su problēmas pazuda. Tāpēc ziņojums tika izziņots apmēram pirms pusgada, kad tas viss bija svaigi manā galvā un es to visu lieliski atcerējos.

Ziņojuma gatavoÅ”anas gaitā jau pacēlu vecas pēcnāves, apskatÄ«ju baļķus. Problēmu analÄ«zes laikā dažas detaļas var aizmirst vai arÄ« dažas detaļas nebija pilnÄ«bā izpētÄ«tas, tāpēc dažos punktos var Ŕķist, ka problēmas nav pilnÄ«bā izskatÄ«tas vai arÄ« trÅ«kst informācijas. Un tāpēc es lÅ«dzu jÅ«s mani atvainot par Å”o brÄ«di.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Kas ir Patroni?

  • Å Ä« ir veidne HA veidoÅ”anai. Tas ir teikts dokumentācijā. Un no mana viedokļa tas ir ļoti pareizs precizējums. Patroni nav sudraba lode, kas atrisinās visas jÅ«su problēmas, tas ir, jums ir jāpieliek pÅ«les, lai tas darbotos un nestu labumu.
  • Å is ir aÄ£enta pakalpojums, kas tiek instalēts katrā datu bāzes pakalpojumā un ir sava veida sākuma sistēma jÅ«su Postgres. Tas palaiž Postgres, aptur, restartē, pārkonfigurē un maina jÅ«su klastera topoloÄ£iju.
  • AttiecÄ«gi, lai saglabātu klastera stāvokli, tā paÅ”reizējo attēlojumu, kā izskatās, ir nepiecieÅ”ama sava veida krātuve. Un no Ŕī viedokļa Patroni izvēlējās stāvokļa saglabāŔanu ārējā sistēmā. Tā ir sadalÄ«ta konfigurācijas uzglabāŔanas sistēma. Tas var bÅ«t Etcd, Consul, ZooKeeper vai kubernetes Etcd, t.i., viena no Ŕīm opcijām.
  • Un viena no Patroni funkcijām ir tāda, ka jÅ«s varat izņemt automātisko filtrÄ“Å”anu no kastes, tikai to iestatot. Ja salÄ«dzinājumam ņemam Repmgr, tad filer tur ir iekļauts. Ar Repmgr mēs iegÅ«stam pārslēgÅ”anos, bet, ja mēs vēlamies autofiler, tad mums tas ir jākonfigurē papildus. Patroni jau ir izņemts no kastes.
  • Un ir vēl daudzas citas lietas. Piemēram, konfigurāciju uzturÄ“Å”ana, jaunu reprodukciju ielieÅ”ana, dublÄ“Å”ana utt. Bet tas ir ārpus ziņojuma jomas, par to es nerunāŔu.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un neliels rezultāts ir tas, ka Patroni galvenais uzdevums ir labi un uzticami veikt autofailu, lai mūsu klasteris turpinātu darboties un lietojumprogramma nepamanītu izmaiņas klastera topoloģijā.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Bet, kad sākam lietot Patroni, mÅ«su sistēma kļūst nedaudz sarežģītāka. Ja agrāk mums bija Postgres, tad, izmantojot Patroni, mēs iegÅ«stam paÅ”u Patroni, mēs iegÅ«stam DCS, kurā tiek saglabāts stāvoklis. Un tam visam kaut kā ir jāstrādā. Tātad, kas var noiet greizi?

Var pārtraukums:

  • Postgres var salÅ«zt. Tas var bÅ«t kapteinis vai kopija, viens no tiem var neizdoties.
  • Patroni var salÅ«zt.
  • DCS, kurā tiek saglabāts stāvoklis, var sabojāt.
  • Un tÄ«kls var pārtrÅ«kt.

Visus Å”os punktus es apsvērÅ”u ziņojumā.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Es izskatīŔu lietas, kad tās kļūst sarežģītākas, nevis no viedokļa, ka lieta ietver daudzas sastāvdaļas. Un no subjektīvo sajūtu viedokļa, ka man Ŕis korpuss bija grūts, bija grūti to izjaukt ... un otrādi, kaut kāds korpuss bija viegls un to bija viegli izjaukt.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un pirmais gadÄ«jums ir vieglākais. Tas ir gadÄ«jums, kad mēs paņēmām datu bāzes klasteru un izvietojām savu DCS krātuvi tajā paŔā klasterÄ«. Å Ä« ir visizplatÄ«tākā kļūda. Tā ir kļūda, veidojot arhitektÅ«ru, t.i., apvienojot dažādas sastāvdaļas vienuviet.

Tātad, bija failētājs, ejam, lai tiktu galā ar notikuÅ”o.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un Å”eit mēs esam ieinteresēti, kad fails noticis. Tas ir, mÅ«s interesē Å”is brÄ«dis, kad mainÄ«jās klastera stāvoklis.

Bet fails ne vienmēr notiek uzreiz, t.i., tas neaizņem nevienu laika vienÄ«bu, tas var aizkavēties. Tas var bÅ«t ilgstoÅ”s.

Tāpēc tam ir sākuma laiks un beigu laiks, t.i., tas ir nepārtraukts notikums. Un mēs sadalām visus notikumus trÄ«s intervālos: mums ir laiks pirms faila, faila laikā un pēc faila. Tas ir, mēs ņemam vērā visus notikumus Å”ajā laika skalā.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un pirmā lieta, kad notika fails, mēs meklējam notikuŔā cēloni, kas bija iemesls tam, kas noveda pie faila.

Ja skatāmies uz baļķiem, tie bÅ«s klasiskie Patroni baļķi. Tajās viņŔ mums stāsta, ka serveris ir kļuvis par galveno, un saimnieka loma ir pārgājusi uz Å”o mezglu. Å eit tas ir izcelts.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Tālāk mums ir jāsaprot, kāpēc fails notika, t.i., kādi notikumi radās, kuru dēļ galvenā loma tika pārvietota no viena mezgla uz citu. Un Å”ajā gadÄ«jumā viss ir vienkārÅ”i. Sadarbojoties ar krātuves sistēmu, radās kļūda. Meistars saprata, ka nevar strādāt ar DCS, tas ir, radās kāda veida mijiedarbÄ«bas problēma. Un saka, ka vairs nevar bÅ«t saimnieks un atkāpjas. Å Ä« rinda ā€œpazeminātais esā€ saka tieÅ”i to.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Ja aplÅ«kojam notikumus pirms faila, mēs varam redzēt paÅ”us iemeslus, kas radÄ«ja vedņa turpināŔanas problēmu.

Ja apskatÄ«sim Patroni žurnālus, redzēsim, ka mums ir daudz kļūdu, taimautu, t.i., Patroni aÄ£ents nevar strādāt ar DCS. Å ajā gadÄ«jumā tas ir konsula aÄ£ents, kas sazinās pa 8500. portu.

Un problēma Å”eit ir tāda, ka Patroni un datu bāze darbojas vienā un tajā paŔā resursdatorā. Un Consul serveri tika palaisti tajā paŔā mezglā. Izveidojot slodzi uz serveri, radÄ«jām problēmas arÄ« Consul serveriem. Viņi nevarēja pareizi sazināties.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Pēc kāda laika, kad slodze mazinājās, mūsu Patroni atkal varēja sazināties ar aģentiem. Atsākās normāls darbs. Un tas pats Pgdb-2 serveris atkal kļuva par galveno. Tas ir, notika neliels flips, kura dēļ mezgls atteicās no kapteiņa pilnvarām un pēc tam pārņēma tās vēlreiz, tas ir, viss atgriezās kā bijis.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un to var uzskatÄ«t par viltus trauksmi vai arÄ« uzskatÄ«t, ka Patroni visu izdarÄ«ja pareizi. Tas ir, viņŔ saprata, ka nevar uzturēt klastera stāvokli un atņēma savu autoritāti.

Un Å”eit problēma radās tāpēc, ka Consul serveri atrodas uz vienas aparatÅ«ras ar bāzēm. AttiecÄ«gi jebkura slodze: neatkarÄ«gi no tā, vai tā ir slodze uz diskiem vai procesoriem, tā ietekmē arÄ« mijiedarbÄ«bu ar Consul klasteru.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un mēs nolēmām, ka tai nevajadzētu dzÄ«vot kopā, konsulam pieŔķīrām atseviŔķu kopu. Un Patroni jau strādāja ar atseviŔķu konsulu, tas ir, bija atseviŔķs Postgres klasteris, atseviŔķs konsulu klasteris. Å Ä« ir pamata instrukcija, kā nēsāt un turēt visas Ŕīs lietas, lai tās nedzÄ«votu kopā.

Kā opciju varat pagriezt parametrus ttl, loop_wait, retry_timeout, t.i., mēģināt pārdzÄ«vot Å”os Ä«stermiņa slodzes maksimumus, palielinot Å”os parametrus. Bet tas nav vispiemērotākais variants, jo Ŕī slodze var bÅ«t ilga laikā. Un mēs vienkārÅ”i pārsniegsim Ŕīs Å”o parametru robežas. Un tas var nepalÄ«dzēt.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Pirmā problēma, kā jÅ«s saprotat, ir vienkārÅ”a. Paņēmām un salikām DCS kopā ar bāzi, sanāca problēma.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Otrā problēma ir līdzīga pirmajai. Tas ir līdzīgs ar to, ka mums atkal ir sadarbspējas problēmas ar DCS sistēmu.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Ja apskatÄ«sim žurnālus, mēs redzēsim, ka mums atkal ir komunikācijas kļūda. Un Patroni saka, ka es nevaru mijiedarboties ar DCS, tāpēc paÅ”reizējais kapteinis pāriet replicÄ“Å”anas režīmā.

Vecmeistars kļūst par repliku, te Patroni izdodas, kā nākas. Tas palaiž pg_rewind, lai attītu darījumu žurnālu un pēc tam izveidotu savienojumu ar jauno galveno, lai panāktu jauno galveno. Šeit Patroni strādā, kā nākas.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Å eit mums jāatrod vieta, kas bija pirms faila, t.i., tās kļūdas, kuru dēļ mums bija fails. Un Å”ajā sakarā ar Patroni apaļkokiem ir diezgan ērti strādāt. ViņŔ raksta vienus un tos paÅ”us ziņojumus noteiktā intervālā. Un, ja mēs ātri sāksim ritināt Å”os žurnālus, tad no žurnāliem redzēsim, ka žurnāli ir mainÄ«juÅ”ies, kas nozÄ«mē, ka ir sākuŔās dažas problēmas. Ātri atgriežamies Å”ajā vietā, skatāmies, kas notiek.

Un parastā situācijā baļķi izskatās apmēram Ŕādi. Tiek pārbaudÄ«ts slēdzenes Ä«paÅ”nieks. Un, ja, piemēram, ir mainÄ«jies Ä«paÅ”nieks, var notikt daži notikumi, uz kuriem Patroni ir jāreaģē. Bet Å”ajā gadÄ«jumā mums viss ir kārtÄ«bā. Mēs meklējam vietu, kur sākās kļūdas.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un, ritinot lÄ«dz vietai, kur sāka parādÄ«ties kļūdas, mēs redzam, ka mums ir bijusi automātiska failu pārslēgÅ”ana. Un tā kā mÅ«su kļūdas bija saistÄ«tas ar mijiedarbÄ«bu ar DCS un mÅ«su gadÄ«jumā mēs izmantojām Consul, mēs skatāmies arÄ« Consul žurnālus, kas tur notika.

Aptuveni salÄ«dzinot lietvedÄ«bas laiku un laiku konsulu žurnālos, redzam, ka mÅ«su kaimiņi konsulu klasterÄ« sāka Å”aubÄ«ties par citu konsulu klastera dalÄ«bnieku eksistenci.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un, ja paskatās citu konsula aÄ£entu žurnālus, tad arÄ« var redzēt, ka tur notiek kaut kāds tÄ«kla sabrukums. Un visi Konsulu klastera dalÄ«bnieki apÅ”auba viens otra esamÄ«bu. Un tas bija stimuls iesniegtājam.

Ja paskatās uz to, kas notika pirms Ŕīm kļūdām, tad var redzēt, ka ir visādas kļūdas, piemēram, termiņŔ, RPC kritās, tas ir, nepārprotami ir kaut kāda problēma konsulu klastera dalÄ«bnieku savstarpējā mijiedarbÄ«bā. .

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

VienkārŔākā atbilde ir tÄ«kla remonts. Bet man, stāvot uz pjedestāla, to pateikt ir viegli. Taču apstākļi ir tādi, ka ne vienmēr klients var atļauties tÄ«kla remontu. ViņŔ var dzÄ«vot lÄ«dzstrāvas tÄ«klā un nevarēs salabot tÄ«klu, ietekmēt aprÄ«kojumu. Un tāpēc ir vajadzÄ«gas dažas citas iespējas.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Ir iespējas:

  • VienkārŔākais variants, kas, manuprāt, ir rakstÄ«ts pat dokumentācijā, ir atspējot konsulu pārbaudes, tas ir, vienkārÅ”i iziet tukÅ”u masÄ«vu. Un mēs sakām konsula aÄ£entam, lai viņŔ neizmanto nekādus čekus. Veicot Ŕīs pārbaudes, mēs varam ignorēt Ŕīs tÄ«kla vētras un nesākt failu failu.
  • Vēl viena iespēja ir vēlreiz pārbaudÄ«t raft_multiplier. Tas ir paÅ”a Consul servera parametrs. Pēc noklusējuma tā ir iestatÄ«ta uz 5. Å Ä« vērtÄ«ba ir ieteikta dokumentācijā par inscenÄ“Å”anas vidēm. Faktiski tas ietekmē ziņojumapmaiņas biežumu starp Consul tÄ«kla dalÄ«bniekiem. Faktiski Å”is parametrs ietekmē pakalpojumu saziņas ātrumu starp konsulu klastera dalÄ«bniekiem. Un ražoÅ”anai jau ir ieteicams to samazināt, lai mezgli biežāk apmainÄ«tos ar ziņojumiem.
  • Vēl viena mÅ«su piedāvātā iespēja ir palielināt Consul procesu prioritāti starp citiem operētājsistēmas procesu plānotāja procesiem. Ir tāds ā€œjauksā€ parametrs, tas tikai nosaka procesu prioritāti, ko OS plānotājs ņem vērā, plānojot. Esam samazinājuÅ”i arÄ« jauko vērtÄ«bu Consul aÄ£entiem, t.i. palielināja prioritāti, lai operētājsistēma Consul procesiem dotu vairāk laika darbam un koda izpildei. MÅ«su gadÄ«jumā tas atrisināja mÅ«su problēmu.
  • Vēl viena iespēja ir neizmantot Consul. Man ir draugs, kurÅ” ir liels Etcd atbalstÄ«tājs. Un mēs regulāri ar viņu strÄ«damies, kas ir labāks utt. vai konsuls. Bet attiecÄ«bā uz to, kurÅ” ir labāks, mēs parasti piekrÄ«tam viņam, ka Consulam ir aÄ£ents, kuram vajadzētu darboties katrā mezglā ar datu bāzi. Tas ir, Patroni mijiedarbÄ«ba ar konsulu kopu notiek caur Å”o aÄ£entu. Un Å”is aÄ£ents kļūst par saÅ”aurinājumu. Ja ar aÄ£entu kaut kas notiek, tad Patroni vairs nevar strādāt ar konsulu kopu. Un Ŕī ir problēma. Etcd plānā aÄ£enta nav. Patroni var strādāt tieÅ”i ar Etcd serveru sarakstu un jau sazināties ar tiem. Å ajā sakarā, ja savā uzņēmumā izmantojat Etcd, tad Etcd, iespējams, bÅ«s labāka izvēle nekā Consul. Taču mÅ«s, klientus, vienmēr ierobežo tas, ko klients ir izvēlējies un lieto. Un mums lielākoties ir konsuls visiem klientiem.
  • Un pēdējais punkts ir parametru vērtÄ«bu pārskatÄ«Å”ana. Mēs varam paaugstināt Å”os parametrus, cerot, ka mÅ«su Ä«stermiņa tÄ«kla problēmas bÅ«s Ä«slaicÄ«gas un neietilpst ārpus Å”o parametru diapazona. Tādā veidā mēs varam samazināt Patroni agresivitāti automātiskai failÄ“Å”anai, ja rodas dažas tÄ«kla problēmas.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Es domāju, ka daudzi, kas izmanto Patroni, ir pazīstami ar Ŕo komandu.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Å Ä« komanda parāda paÅ”reizējo klastera stāvokli. Un no pirmā acu uzmetiena Å”is attēls var Ŕķist normāls. Mums ir meistars, mums ir replika, nav replikācijas kavÄ“Å”anās. Bet Å”is attēls ir normāls, lÄ«dz mēs zinām, ka Å”ajā klasterÄ« ir jābÅ«t trim mezgliem, nevis diviem.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

AttiecÄ«gi bija autofails. Un pēc Ŕī automātiskā faila mÅ«su kopija pazuda. Mums jānoskaidro, kāpēc viņa pazuda, un jāatgriež, jāatjauno. Un mēs atkal ejam uz žurnāliem un noskaidrojam, kāpēc mums bija automātiska failu pārslēgÅ”ana.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Šajā gadījumā par meistaru kļuva otrā kopija. Šeit viss ir kārtībā.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un mums ir jāaplÅ«ko kopija, kas nokrita un kura nav klasterÄ«. Mēs atveram Patroni žurnālus un redzam, ka mums radās problēma, veidojot savienojumu ar kopu pg_rewind posmā. Lai izveidotu savienojumu ar klasteru, jums ir jāattina darÄ«jumu žurnāls, jāpieprasa nepiecieÅ”amais darÄ«jumu žurnāls no galvenā un jāizmanto tas, lai panāktu galveno.

Šajā gadījumā mums nav darījumu žurnāla, un reprodukciju nevar palaist. Attiecīgi mēs apturam Postgres ar kļūdu. Un tāpēc tas nav klasterī.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Mums ir jāsaprot, kāpēc tas nav klasterÄ« un kāpēc nebija žurnālu. Ejam pie jaunā meistara un skatāmies, kas viņam ir baļķos. Izrādās, kad pg_rewind tika izdarÄ«ts, notika kontrolpunkts. Un daži vecie darÄ«jumu žurnāli tika vienkārÅ”i pārdēvēti. Kad vecais meistars mēģināja pieslēgties jaunajam meistaram un vaicāt Å”os žurnālus, tie jau tika pārdēvēti, tie vienkārÅ”i neeksistēja.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Es salÄ«dzināju laikspiedolus, kad Å”ie notikumi notika. Un tur atŔķirÄ«ba ir burtiski 150 milisekundes, tas ir, kontrolpunkts tika pabeigts 369 milisekundēs, WAL segmenti tika pārdēvēti. Un burtiski 517. gadā pēc 150 milisekundēm sākās vecās kopijas attÄ«Å”ana. Tas ir, burtiski mums pietika ar 150 milisekundēm, lai kopija nevarētu izveidot savienojumu un nopelnÄ«t.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Kādas ir iespējas?

Sākotnēji mēs izmantojām replikācijas slotus. Mēs domājām, ka tas ir labi. Lai gan pirmajā darbÄ«bas posmā mēs izslēdzām slotus. Mums Ŕķita, ka, ja sloti uzkrāj daudz WAL segmentu, mēs varam nomest master. ViņŔ nokritÄ«s. Mēs kādu laiku cietām bez laika niŔām. Un mēs sapratām, ka mums vajag slotus, mēs atdevām slotus.

Bet Å”eit ir problēma, ka, kad galvenais dodas uz repliku, tas dzÄ“Å” slotus un izdzÄ“Å” WAL segmentus kopā ar slotiem. Un, lai novērstu Å”o problēmu, mēs nolēmām paaugstināt parametru wal_keep_segments. Pēc noklusējuma tas ir 8 segmenti. Mēs to palielinājām lÄ«dz 1 un paskatÄ«jāmies, cik daudz brÄ«vas vietas mums ir. Un mēs ziedojām 000 gigabaitus wal_keep_segments. Tas ir, pārslēdzoties, mums vienmēr ir 16 gigabaitu rezerve darÄ«jumu žurnāliem visos mezglos.

Un plus - tas joprojām ir aktuāls ilgtermiņa apkopes darbiem. Pieņemsim, ka mums ir jāatjaunina viena no replikām. Un mēs vēlamies to izslēgt. Mums ir jāatjaunina programmatÅ«ra, varbÅ«t operētājsistēma, kaut kas cits. Un, kad mēs izslēdzam repliku, tiek noņemts arÄ« Ŕīs kopijas slots. Un, ja mēs izmantojam nelielu wal_keep_segments, tad, ja reprodukcija ilgstoÅ”i nebÅ«s, darÄ«jumu žurnāli tiks zaudēti. Mēs izveidosim repliku, tas pieprasÄ«s tos darÄ«jumu žurnālus, kur tas apstājās, bet tie var nebÅ«t galvenajā. Un arÄ« kopija nevarēs izveidot savienojumu. Tāpēc mēs glabājam lielus žurnālu krājumus.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Mums ir ražoŔanas bāze. Projekti jau ir procesā.

Bija failētājs. Iegājām un skatÄ«jāmies - viss kārtÄ«bā, replikas savās vietās, replikācijas aizkavÄ“Å”anās nav. ArÄ« žurnālos kļūdu nav, viss kārtÄ«bā.

Produkta komanda saka, ka vajadzētu būt dažiem datiem, bet mēs tos redzam no viena avota, bet mēs tos neredzam datu bāzē. Un mums ir jāsaprot, kas ar viņiem notika.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Skaidrs, ka pg_rewind tos palaida garām. Mēs to uzreiz sapratām, bet devāmies skatīties, kas notiek.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Žurnālos mēs vienmēr varam atrast, kad ir noticis fails, kurÅ” kļuva par meistaru, un mēs varam noteikt, kurÅ” bija vecais meistars un kad viņŔ vēlējās kļūt par repliku, t.i., Å”ie žurnāli ir nepiecieÅ”ami, lai uzzinātu darÄ«jumu žurnālu apjomu, kas bija pazudis.

MÅ«su vecmeistars ir pārstartējis. Un Patroni tika reÄ£istrēts autorun. Uzsākta Patroni. Pēc tam viņŔ sāka Postgres. PrecÄ«zāk, pirms Postgres palaiÅ”anas un pirms tā izveidoÅ”anas par reprodukciju, Patroni uzsāka pg_rewind procesu. AttiecÄ«gi viņŔ izdzēsa daļu darÄ«jumu žurnālu, lejupielādēja jaunus un izveidoja savienojumu. Å eit Patroni strādāja gudri, tas ir, kā gaidÄ«ts. Klasteris ir atjaunots. Mums bija 3 mezgli, pēc filera 3 mezgli - viss forÅ”i.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Mēs esam zaudējuÅ”i dažus datus. Un mums ir jāsaprot, cik daudz mēs esam zaudējuÅ”i. Mēs meklējam tieÅ”i to brÄ«di, kad mums bija attÄ«Å”ana. Mēs to varam atrast Ŕādos žurnāla ierakstos. Sākās attÄ«Å”ana, tur kaut ko izdarÄ«ja un beidzās.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Darījumu žurnālā jāatrod pozīcija, kurā vecais meistars pārtrauca darbu. Šajā gadījumā Ŕī ir zīme. Un mums ir vajadzīga otrā atzīme, tas ir, attālums, ar kuru vecais meistars atŔķiras no jaunā.

Mēs ņemam parasto pg_wal_lsn_diff un salÄ«dzinām Ŕīs divas atzÄ«mes. Un Å”ajā gadÄ«jumā mēs iegÅ«stam 17 megabaitus. Daudz vai maz, katrs izlemj pats. Jo kādam 17 megabaiti nav daudz, kādam tas ir daudz un nepieņemami. Å eit katrs indivÄ«ds nosaka pats atbilstoÅ”i biznesa vajadzÄ«bām.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Bet ko mēs paÅ”i esam noskaidrojuÅ”i?

Pirmkārt, mums paÅ”iem ir jāizlemj ā€“ vai mums vienmēr ir nepiecieÅ”ams Patroni, lai pēc sistēmas atsāknÄ“Å”anas automātiski startētu? Bieži gadās, ka jāiet pie vecmeistara, jāskatās, cik tālu viņŔ ir aizgājis. VarbÅ«t pārbaudiet darÄ«jumu žurnāla segmentus un skatiet, kas tur ir. Un saprast, vai mēs varam pazaudēt Å”os datus, vai arÄ« mums ir jāpalaiž vecais meistars savrupajā režīmā, lai Å”os datus izņemtu.

Un tikai pēc tam mums ir jāizlemj, vai mēs varam izmest Å”os datus vai varam tos atjaunot, pievienojiet Å”o mezglu kā kopiju mÅ«su klasterim.

Turklāt ir parametrs "maximum_lag_on_failover". Pēc noklusējuma, ja mana atmiņa mani neviļ, Ŕī parametra vērtÄ«ba ir 1 megabaits.

Kā viņŔ strādā? Ja mÅ«su replika replikācijas aizkavē atpaliek par 1 megabaitu datu, tad Ŕī replika nepiedalās vēlÄ“Å”anās. Un, ja pēkŔņi notiek failu pārvērÅ”ana, Patroni skatās, kuras kopijas atpaliek. Ja viņiem atpaliek liels skaits darÄ«jumu žurnālu, viņi nevar kļūt par meistaru. Å Ä« ir ļoti laba droŔības funkcija, kas neļauj zaudēt daudz datu.

Bet pastāv problēma, ka replikācijas aizkave Patroni klasterÄ« un DCS tiek atjaunināta ar noteiktu intervālu. Es domāju, ka 30 sekundes ir noklusējuma ttl vērtÄ«ba.

AttiecÄ«gi var bÅ«t situācija, ka replikām DCS ir viena replikācijas nobÄ«de, bet patiesÄ«bā var bÅ«t pavisam cita nobÄ«de vai arÄ« lag nav vispār, t.i., Ŕī lieta nav reāllaika. Un tas ne vienmēr atspoguļo patieso ainu. Un nav vērts ar to nodarboties ar izdomātu loÄ£iku.

Un zaudējuma risks vienmēr paliek. Un sliktākajā gadÄ«jumā viena formula, bet vidējā gadÄ«jumā cita formula. Tas ir, plānojot Patroni ievieÅ”anu un izvērtējot, cik daudz datu varam zaudēt, mums jāpaļaujas uz Ŕīm formulām un aptuveni jāiedomājas, cik daudz datu varam zaudēt.

Un ir labas ziņas. Kad vecmeistars ir gājis pa priekÅ”u, tad kaut kādu fona procesu dēļ var iet uz priekÅ”u. Tas ir, bija kaut kāds autovakuums, viņŔ ierakstÄ«ja datus, saglabāja tos darÄ«jumu žurnālā. Un mēs varam viegli ignorēt un zaudēt Å”os datus. Å ajā gadÄ«jumā nav nekādu problēmu.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un Ŕādi izskatās žurnāli, ja ir iestatÄ«ts maximum_lag_on_failover un ir noticis fails, un jums ir jāizvēlas jauns galvenais. Replika sevi vērtē kā nespējÄ«gu piedalÄ«ties vēlÄ“Å”anās. Un viņa atsakās piedalÄ«ties sacÄ«kstēs par lÄ«deri. Un viņa gaida, kad tiks izvēlēts jauns meistars, lai pēc tam varētu ar to pieslēgties. Tas ir papildu pasākums pret datu zudumu.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Å eit mums ir produktu komanda, kas rakstÄ«ja, ka viņu produktam ir problēmas ar Postgres. Tajā paŔā laikā nevar piekļūt paÅ”am galvenajam, jo ā€‹ā€‹tas nav pieejams caur SSH. Un arÄ« automātiskais fails nenotiek.

Å is saimniekdators bija spiests atsāknēt. AtsāknÄ“Å”anas dēļ notika automātisks fails, lai gan, kā es tagad saprotu, bija iespējams veikt manuālu automātisko failu. Un pēc pārstartÄ“Å”anas mēs jau skatÄ«simies, kas mums bija ar paÅ”reizējo meistaru.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Tajā paŔā laikā mēs jau iepriekÅ” zinājām, ka mums ir problēmas ar diskiem, tas ir, mēs jau no uzraudzÄ«bas zinājām, kur rakt un ko meklēt.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Iekāpām postgres žurnālā, sākām skatīties, kas tur notiek. Mēs redzējām saistības, kas tur ilgst vienu, divas, trīs sekundes, kas nebūt nav normāli. Mēs redzējām, ka mūsu autovakuums ieslēdzas ļoti lēni un dīvaini. Un mēs diskā redzējām pagaidu failus. Tas ir, tie visi liecina par problēmām ar diskiem.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Mēs apskatÄ«jām sistēmas dmesg (kodola žurnālu). Un mēs redzējām, ka mums ir problēmas ar vienu no diskiem. Diska apakÅ”sistēma bija programmatÅ«ra Raid. Mēs apskatÄ«jām /proc/mdstat un redzējām, ka mums trÅ«kst viena diska. Tas ir, ir 8 disku reids, mums viena trÅ«kst. Ja uzmanÄ«gi aplÅ«ko slaidu, tad izvadā var redzēt, ka mums tur nav sde. Pie mums, nosacÄ«ti runājot, disks ir izkritis. Tas izraisÄ«ja diska problēmas, un arÄ« lietojumprogrammām radās problēmas, strādājot ar Postgres kopu.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un Å”ajā gadÄ«jumā Patroni mums nekādi nepalÄ«dzētu, jo Patroni nav uzdevums uzraudzÄ«t servera stāvokli, diska stāvokli. Un mums ir jāuzrauga Ŕādas situācijas ar ārēju uzraudzÄ«bu. Mēs ātri pievienojām diska uzraudzÄ«bu ārējai uzraudzÄ«bai.

Un radās tāda doma ā€“ vai paukoÅ”anas vai sargsuņa programmatÅ«ra mums varētu palÄ«dzēt? Domājām, ka viņŔ Å”ajā gadÄ«jumā diez vai mums bÅ«tu palÄ«dzējis, jo problēmu laikā Patroni turpināja sadarboties ar DCS klasteri un nesaskatÄ«ja nekādu problēmu. Tas ir, no DCS un Patroni viedokļa ar klasteru viss bija kārtÄ«bā, lai gan patiesÄ«bā bija problēmas ar disku, bija problēmas ar datu bāzes pieejamÄ«bu.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Manuprāt, Ŕī ir viena no dÄ«vainākajām problēmām, ko esmu pētÄ«jis ļoti ilgi, esmu lasÄ«jis daudz žurnālus, pārlasÄ«jis un nosaucis to par klasteru simulatoru.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Problēma bija tā, ka vecais meistars nevarēja kļūt par normālu repliku, t.i. Patroni to palaida, Patroni parādÄ«ja, ka Å”is mezgls bija klāt kā replika, bet tajā paŔā laikā tā nebija normāla kopija. Tagad jÅ«s redzēsiet, kāpēc. Tas ir tas, ko es esmu atturējis no Ŕīs problēmas analÄ«zes.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un kā tas viss sākās? Sākās, tāpat kā iepriekŔējā problēmā, ar disku bremzēm. Mums bija saistÄ«bas uz sekundi, divām.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Bija sakaru pārtraukumi, t.i., tika saplēsti klienti.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Bija dažāda smaguma aizsprostojumi.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un attiecÄ«gi diska apakÅ”sistēma nav Ä«paÅ”i atsaucÄ«ga.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un visnoslēpumainākais man ir tÅ«lÄ«tējais izslēgÅ”anas pieprasÄ«jums, kas tika saņemts. Postgres ir trÄ«s izslēgÅ”anas režīmi:

  • Tas ir jauki, kad mēs gaidām, kad visi klienti atvienosies paÅ”i.
  • Ir ātri, kad mēs piespiežam klientus atvienoties, jo mēs gatavojamies izslēgt.
  • Un nekavējoties. Å ajā gadÄ«jumā tÅ«lÄ«tēja pat neliek klientiem izslēgt, tas vienkārÅ”i izslēdzas bez brÄ«dinājuma. Un visiem klientiem operētājsistēma jau sÅ«ta RST ziņojumu (TCP ziņojumu, ka savienojums ir pārtraukts un klientam vairs nav ko Ä·ert).

Kas sÅ«tÄ«ja Å”o signālu? Postgres fona procesi Ŕādus signālus viens otram nesÅ«ta, t.i., tas ir kill-9. Viņi nesÅ«ta tādas lietas viens otram, viņi tikai reaģē uz tādām lietām, t.i., Ŕī ir Postgres avārijas restartÄ“Å”ana. Kas to sÅ«tÄ«ja, es nezinu.

Es paskatÄ«jos uz "pēdējo" komandu un redzēju vienu cilvēku, kurÅ” arÄ« pieteicās Å”ajā serverÄ« kopā ar mums, bet es biju pārāk kautrÄ«gs, lai uzdotu jautājumu. VarbÅ«t tas bija nogalināt -9. Es redzētu nogalināt -9 baļķos, jo Postgres saka, ka vajadzēja kill -9, bet es to neredzēju žurnālos.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Paskatoties tālāk, redzēju, ka Patroni diezgan ilgi nerakstÄ«ja žurnālam - 54 sekundes. Un, ja salÄ«dzinām divus laikspiedolus, aptuveni 54 sekundes nebija neviena ziņojuma.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un Å”ajā laikā notika autofails. Patroni Å”eit atkal paveica lielisku darbu. MÅ«su vecmeistars nebija pieejams, ar viņu kaut kas notika. Un sākās jauna meistara vēlÄ“Å”anas. Å eit viss izdevās labi. MÅ«su pgsql01 ir kļuvis par jauno lÄ«deri.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Mums ir kopija, kas ir kļuvusi par meistaru. Un ir arī otra atbilde. Un bija problēmas ar otro repliku. Viņa mēģināja pārkonfigurēt. Kā es saprotu, viņa mēģināja mainīt recovery.conf, restartēt Postgres un izveidot savienojumu ar jauno meistaru. Viņa ik pēc 10 sekundēm raksta ziņas, ka mēģina, bet viņai neizdodas.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un Å”o mēģinājumu laikā vecmeistaram pienāk tÅ«lÄ«tējas izslēgÅ”anas signāls. Master ir restartēts. Un arÄ« atkopÅ”ana apstājas, jo vecais meistars pārstartējas. Tas nozÄ«mē, ka kopija nevar izveidot savienojumu ar to, jo tā ir izslēgÅ”anas režīmā.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Kādā brīdī tas darbojās, bet replikācija nesākās.

Mans vienīgais minējums ir tāds, ka failā recovery.conf bija veca galvenā adrese. Un, kad parādījās jauns meistars, otrā kopija joprojām mēģināja savienoties ar veco meistaru.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Kad Patroni startēja otrajā reprodukcijā, mezgls tika palaists, bet nevarēja replicēt. Un izveidojās replikācijas nobÄ«de, kas izskatÄ«jās apmēram Ŕādi. Tas ir, visi trÄ«s mezgli bija savās vietās, bet otrais mezgls atpalika.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Tajā paŔā laikā, ja paskatās uz ierakstÄ«tajiem žurnāliem, var redzēt, ka replikāciju nevarēja sākt, jo darÄ«jumu žurnāli bija atŔķirÄ«gi. Un tie darÄ«jumu žurnāli, ko piedāvā meistars un kas ir norādÄ«ti atkopÅ”anas.conf, vienkārÅ”i neatbilst mÅ«su paÅ”reizējam mezglam.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un Å”eit es pieļāvu kļūdu. Man bija jāierodas un jāskatās, kas ir failā recovery.conf, lai pārbaudÄ«tu savu hipotēzi, ka mēs izveidojam savienojumu ar nepareizo meistaru. Bet tad es tikai ar to nodarbojos, un man tas neienāca prātā, vai arÄ« es redzēju, ka kopija atpaliek un bÅ«s jāuzpilda, tas ir, es kaut kā strādāju neuzmanÄ«gi. Å Ä« bija mana locÄ«tava.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Pēc 30 minÅ«tēm jau ieradās admins, t.i., es restartēju Patroni uz replikas. Pieliku jau punktu, izdomāju, ka bÅ«s jāuzpilda. Un domāju ā€“ restartÄ“Å”u Patroni, varbÅ«t iznāks kas labs. Sākās atveseļoÅ”anās. Un bāze pat atvērās, tā bija gatava pieņemt savienojumus.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Ir sākusies replikācija. Taču pēc minūtes viņa nokrita ar kļūdu, ka darījumu žurnāli viņai nav piemēroti.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Es domāju, ka es restartÄ“Å”u vēlreiz. Es vēlreiz restartēju Patroni un nevis Postgres restartēju, bet gan Patroni, cerot, ka tas maÄ£iski sāks datu bāzi.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Replikācija sākās no jauna, bet atzÄ«mes darÄ«jumu žurnālā bija atŔķirÄ«gas, tās nebija tādas paÅ”as kā iepriekŔējā starta mēģinājumā. Replikācija atkal tika apturēta. Un vēstÄ«jums jau bija nedaudz atŔķirÄ«gs. Un tas man nebija Ä«paÅ”i informatÄ«vs.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Un tad man ienāk prātā - kā bÅ«tu, ja es restartēju Postgres, Å”ajā laikā es izveidoju kontrolpunktu uz paÅ”reizējo galveno, lai pārvietotu punktu darÄ«jumu žurnālā nedaudz uz priekÅ”u, lai atkopÅ”ana sāktos no cita brīža? Turklāt mums joprojām bija WAL krājumi.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Es restartēju Patroni, veicu pāris kontrolpunktus uz galveno, pāris restartÄ“Å”anas punktus uz replikas, kad tā tika atvērta. Un tas palÄ«dzēja. Es ilgi domāju, kāpēc tas palÄ«dzēja un kā tas darbojas. Un replika sākās. Un replikācija vairs nebija saplēsta.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Tāda problēma man ir viena no mistiskākajām, par kuru es joprojām prātoju, kas tur īsti notika.

Kādas ir sekas Å”eit? Patroni var strādāt kā paredzēts un bez kļūdām. Bet tajā paŔā laikā tas nav 100% garantija, ka ar mums viss ir kārtÄ«bā. Replika var sākties, bet tā var bÅ«t daļēji darba stāvoklÄ«, un lietojumprogramma nevar strādāt ar Ŕādu repliku, jo bÅ«s veci dati.

Un pēc failētāja vienmēr ir jāpārbauda, ā€‹ā€‹vai ar klasteru viss ir kārtÄ«bā, tas ir, ir nepiecieÅ”amais replikāciju skaits, nav replikācijas nobÄ«des.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Kad mēs izskatÄ«sim Å”os jautājumus, es sniegÅ”u ieteikumus. Es mēģināju tos apvienot divos slaidos. Iespējams, visus stāstus varētu apvienot divos slaidos un tikai izstāstÄ«t.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Lietojot Patroni, jums ir jāveic uzraudzÄ«ba. Jums vienmēr jāzina, kad notika automātiskā failu pārvērÅ”ana, jo, ja nezināt, ka jums ir bijusi automātiskā failu pārvērÅ”ana, jÅ«s nevarat kontrolēt kopu. Un tas ir slikti.

Pēc katra faila mums vienmēr ir manuāli jāpārbauda klasteris. Mums ir jāpārliecinās, ka mums vienmēr ir atjaunināts reprodukciju skaits, nav replikācijas aizkaves, nav kļūdu žurnālos, kas saistÄ«ti ar straumÄ“Å”anas replikāciju, izmantojot Patroni, ar DCS sistēmu.

Automatizācija var veiksmÄ«gi darboties, Patroni ir ļoti labs instruments. Tas var darboties, taču tas nenovedÄ«s klasteru vēlamajā stāvoklÄ«. Un, ja mēs par to neuzzināsim, mēs nonāksim nepatikÅ”anās.

Un Patroni nav sudraba lode. Mums joprojām ir jāsaprot, kā darbojas Postgres, kā darbojas replikācija un kā Patroni darbojas ar Postgres, un kā tiek nodroÅ”ināta saziņa starp mezgliem. Tas ir nepiecieÅ”ams, lai varētu novērst problēmas ar rokām.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Kā pievērsties diagnozes jautājumam? Sanāca tā, ka strādājam ar dažādiem klientiem un nevienam nav ELK kaudzes, un mums ir jāsakārto žurnāli, atverot 6 konsoles un 2 cilnes. Vienā cilnē tie ir katra mezgla Patroni žurnāli, otrā cilnē tie ir Consul žurnāli vai, ja nepiecieÅ”ams, Postgres. To ir ļoti grÅ«ti diagnosticēt.

Kādas pieejas esmu izstrādājis? Pirmkārt, es vienmēr skatos, kad ir ieradies fails. Un man Ŕī ir Å«densŔķirtne. Es skatos, kas notika pirms vÄ«lÄ«tes, faila laikā un pēc faila. Fileover ir divas atzÄ«mes: tas ir sākuma un beigu laiks.

Pēc tam es meklēju žurnālos notikumus pirms faila, kas bija pirms faila, t.i., es meklēju iemeslus, kāpēc fails notika.

Un tas dod priekÅ”statu par to, kā saprast, kas noticis un ko var darÄ«t nākotnē, lai Ŕādi apstākļi nerastos (un rezultātā nav faila).

Un kur mēs parasti skatāmies? ES skatos:

  • Pirmkārt, uz Patroni žurnāliem.
  • Tālāk es aplÅ«koju Postgres žurnālus vai DCS žurnālus atkarÄ«bā no tā, kas tika atrasts Patroni žurnālos.
  • Un arÄ« sistēmas žurnāli dažkārt sniedz izpratni par to, kas izraisÄ«ja failu.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

Kā es jÅ«tos pret Patroni? Man ar Patroni ir ļoti labas attiecÄ«bas. Manuprāt, tas ir labākais, kāds Å”odien ir. Es zinu daudzus citus produktus. Tie ir Stolon, Repmgr, Pg_auto_failover, PAF. 4 instrumenti. Es tos visus izmēģināju. Patroni ir mans mīļākais.

Ja viņi man jautā: "Vai es iesaku Patroni?". TeikÅ”u jā, jo man patÄ«k Patroni. Un es domāju, ka es iemācÄ«jos to pagatavot.

Ja vēlaties uzzināt, kādas ir citas problēmas ar Patroni bez manis minētajām problēmām, vienmēr varat apskatÄ«t lapu jautājumi vietnē GitHub. Tur ir daudz dažādu stāstu un tiek apspriesti daudzi interesanti jautājumi. Rezultātā tika ieviestas un novērstas dažas kļūdas, tas ir, Ŕī ir interesanta lasāmviela.

Ir daži interesanti stāsti par cilvēkiem, kuri Å”auj sev kājā. Ä»oti informatÄ«vs. JÅ«s izlasiet un saprotat, ka tas nav jādara. Es atzÄ«mēju sevi.

Un es vēlos teikt lielu paldies Zalando par Ŕī projekta izstrādi, proti, Aleksandram KukuÅ”kinam un Aleksejam Kļukinam. Aleksejs Kļukins ir viens no lÄ«dzautoriem, viņŔ vairs nestrādā Zalando, taču tie ir divi cilvēki, kas sāka strādāt ar Å”o produktu.

Un es domāju, ka Patroni ir ļoti forÅ”a lieta. Priecājos, ka viņa eksistē, ar viņu ir interesanti. Un liels paldies visiem atbalstÄ«tājiem, kuri raksta ielāpus Patroni. Es ceru, ka Patroni ar vecumu kļūs nobrieduŔāks, forŔāks un efektÄ«vāks. Tas jau ir funkcionāls, bet es ceru, ka tas kļūs vēl labāks. Tāpēc, ja plānojat lietot Patroni, tad nebaidieties. Tas ir labs risinājums, to var ieviest un izmantot.

Tas ir viss. Ja jums ir jautājumi, jautājiet.

Patroni neveiksmju stāsti vai PostgreSQL klastera avārija. Aleksejs Ļesovskis

jautājumi

Paldies par ziņojumu! Ja pēc vīlētāja tur tomēr vajag ļoti rūpīgi paskatīties, tad kāpēc mums vajadzīgs automātiskais vīlētājs?

Jo tās ir jaunas lietas. Mēs ar viņu esam tikai gadu. Labāk bÅ«t droÅ”am. Mēs vēlamies ienākt un redzēt, ka viss tieŔām ir izdevies tā, kā tam vajadzētu bÅ«t. Tas ir pieauguÅ”o neuzticÄ«bas lÄ«menis - labāk vēlreiz pārbaudÄ«t un redzēt.

Piemēram, mēs gājām no rīta un paskatījāmies, vai ne?

Ne no rÄ«ta, mēs parasti uzzinām par automātisko failu gandrÄ«z nekavējoties. Mēs saņemam paziņojumus, redzam, ka ir noticis automātiskais fails. GandrÄ«z uzreiz ejam un skatāmies. Taču visas Ŕīs pārbaudes ir jānovirza uzraudzÄ«bas lÄ«menÄ«. Ja piekļūstat Patroni, izmantojot REST API, pastāv vēsture. Pēc vēstures varat redzēt laikspiedolus, kad notika fails. Pamatojoties uz to, var veikt uzraudzÄ«bu. Var redzēt vēsturi, cik notikumu bija. Ja mums ir vairāk notikumu, ir noticis automātiskais fails. JÅ«s varat iet un redzēt. Vai arÄ« mÅ«su uzraudzÄ«bas automatizācija pārbaudÄ«ja, vai mums ir visas kopijas, nav aizkavÄ“Å”anās un viss ir kārtÄ«bā.

Paldies!

Liels paldies par lielisko stāstu! Ja mēs DCS klasteri pārcēlām kaut kur tālu no Postgres klastera, tad arÄ« Å”im klasterim ir periodiski jākopj? Kāda ir labākā prakse, kad daži DCS klastera elementi ir jāizslēdz, ar tiem kaut kas jādara utt.? Kā visa Ŕī struktÅ«ra izdzÄ«vo? Un kā jÅ«s darāt Ŕīs lietas?

Vienam uzņēmumam bija jāizveido problēmu matrica, kas notiek, ja sabojājas kāda no sastāvdaļām vai vairākas sastāvdaļas. Saskaņā ar Å”o matricu mēs secÄ«gi izejam cauri visiem komponentiem un veidojam scenārijus Å”o komponentu atteices gadÄ«jumā. AttiecÄ«gi katram kļūmes scenārijam jums var bÅ«t rÄ«cÄ«bas plāns atveseļoÅ”anai. Un DCS gadÄ«jumā tā ir daļa no standarta infrastruktÅ«ras. Un administrators to administrē, un mēs jau paļaujamies uz administratoriem, kas to administrē, un viņu spēju to novērst negadÄ«jumu gadÄ«jumā. Ja DCS vispār nav, tad izvietojam, bet tajā paŔā laikā Ä«paÅ”i neuzraugām, jo ā€‹ā€‹neatbildam par infrastruktÅ«ru, bet sniedzam ieteikumus, kā un ko uzraudzÄ«t.

Tas ir, vai es pareizi sapratu, ka man ir jāatspējo Patroni, jāatspējo fails, jāatspējo viss, pirms kaut ko daru ar saimniekiem?

Tas ir atkarÄ«gs no tā, cik mezglu mums ir DCS klasterÄ«. Ja mezglu ir daudz un ja mēs atspējojam tikai vienu no mezgliem (reprodukciju), tad klasteris uztur kvorumu. Un Patroni turpina darboties. Un nekas netiek iedarbināts. Ja mums ir dažas sarežģītas darbÄ«bas, kas ietekmē vairāk mezglu, kuru neesamÄ«ba var sabojāt kvorumu, tad - jā, varētu bÅ«t jēga Patroni apturēt. Tam ir atbilstoÅ”a komanda - patronictl pause, patronictl resume. Mēs vienkārÅ”i pauzējam, un automātiskais fails tajā laikā nedarbojas. Mēs veicam DCS klastera apkopi, pēc tam pārtraucam pauzi un turpinām dzÄ«vot.

Thank you very much!

Liels paldies par ziņojumu! Kā produktu komanda uztver datu zudumu?

Produktu komandām ir vienalga, un komandu vadÄ«tāji ir noraizējuÅ”ies.

Kādas ir garantijas?

Garantijas ir ļoti sarežģītas. Aleksandram KukuÅ”kinam ir ziņojums ā€œKā aprēķināt RPO un RTOā€, t.i., atkopÅ”anas laiks un cik daudz datu varam zaudēt. Es domāju, ka mums ir jāatrod Å”ie slaidi un tie jāizpēta. Cik atceros, ir konkrēti soļi, kā Ŕīs lietas aprēķināt. Cik daudz darÄ«jumu mēs varam zaudēt, cik daudz datu varam zaudēt. Kā opciju mēs varam izmantot sinhrono replikāciju Patroni lÄ«menÄ«, taču tas ir abpusēji griezÄ«gs zobens: vai nu mums ir datu uzticamÄ«ba, vai arÄ« mēs zaudējam ātrumu. Ir sinhronā replikācija, taču tā arÄ« negarantē 100% aizsardzÄ«bu pret datu zudumu.

Aleksej, paldies par lielisko ziņojumu! Vai jums ir pieredze ar Patroni izmantoÅ”anu nulles lÄ«meņa aizsardzÄ«bai? Tas ir, savienojumā ar sinhrono gaidÄ«Å”anas režīmu? Å is ir pirmais jautājums. Un otrais jautājums. JÅ«s esat izmantojis dažādus risinājumus. Mēs izmantojām Repmgr, bet bez autofiler, un tagad mēs plānojam iekļaut autofiler. Un mēs uzskatām Patroni kā alternatÄ«vu risinājumu. Ko jÅ«s varat teikt kā priekÅ”rocÄ«bas salÄ«dzinājumā ar Repmgr?

Pirmais jautājums bija par sinhronajām replikām. Sinhrono replikāciju Å”eit neviens neizmanto, jo visi baidās (vairāki klienti jau to izmanto, principā viņi nepamanÄ«ja veiktspējas problēmas - Runātāja piezÄ«me). Bet mēs paÅ”i esam izstrādājuÅ”i noteikumu, ka sinhronās replikācijas klasterÄ« ir jābÅ«t vismaz trim mezgliem, jo, ja mums ir divi mezgli un ja galvenais vai replika neizdodas, tad Patroni pārslēdz Å”o mezglu uz Standalone režīmu, lai programma turpinātu darboties. strādāt. Å ajā gadÄ«jumā pastāv datu zuduma risks.

AttiecÄ«bā uz otro jautājumu mēs esam izmantojuÅ”i Repmgr un joprojām darām to ar dažiem klientiem vēsturisku iemeslu dēļ. Ko var teikt? Patroni komplektācijā ietilpst automātiskais filtrs, un Repmgr ir automātiskais filtrs kā papildu funkcija, kas ir jāiespējo. Mums ir jāpalaiž Repmgr dēmons katrā mezglā, un tad mēs varam konfigurēt automātisko failu.

Repmgr pārbauda, ā€‹ā€‹vai Postgres mezgli ir dzÄ«vi. Repmgr procesi pārbauda viens otra esamÄ«bu, tā nav pārāk efektÄ«va pieeja. var bÅ«t sarežģīti tÄ«kla izolācijas gadÄ«jumi, kad liels Repmgr klasteris var sadalÄ«ties vairākos mazākos un turpināt darbu. Sen nesekoju lÄ«dzi Repmgr, varbÅ«t salaboja...vai varbÅ«t nē. Bet informācijas noņemÅ”ana par klastera stāvokli DCS, kā to dara Stolon, Patroni, ir visizdevÄ«gākā iespēja.

Aleksej, man ir jautājums, iespējams, lāgāks. Vienā no pirmajiem piemēriem jÅ«s pārvietojāt DCS no vietējās maŔīnas uz attālo resursdatoru. Mēs saprotam, ka tÄ«kls ir lieta, kurai ir savas Ä«paŔības, tas dzÄ«vo pats par sevi. Un kas notiek, ja kāda iemesla dēļ DCS klasteris kļūst nepieejams? Iemeslus nepateikÅ”u, to var bÅ«t ļoti daudz: no tÄ«klotāju lÄ«kajām rokām lÄ«dz reālām problēmām.

Es to nepateicu skaļi, bet DCS klasterim ir jābÅ«t arÄ« kļūmjpārlēcei, t.i., tas ir nepāra skaits mezglu, lai nodroÅ”inātu kvorumu. Kas notiek, ja DCS klasteris kļūst nepieejams vai nevar sasniegt kvorumu, t.i., tÄ«kla sadalÄ«jums vai mezgla kļūme? Å ajā gadÄ«jumā Patroni klasteris pāriet tikai lasÄ«Å”anas režīmā. Patroni klasteris nevar noteikt klastera stāvokli un to, ko darÄ«t. Tas nevar sazināties ar DCS un saglabāt tur jauno klastera stāvokli, tāpēc viss klasteris tiek iestatÄ«ts tikai lasāmā režīmā. Un gaida vai nu manuālu operatora iejaukÅ”anos, vai arÄ« DCS atjaunoÅ”anos.

Aptuveni runājot, DCS mums kļūst par tikpat svarīgu pakalpojumu kā pati bāze?

Jā jā. Tik daudzos mÅ«sdienu uzņēmumos pakalpojumu atklāŔana ir neatņemama infrastruktÅ«ras sastāvdaļa. Tas tiek ieviests vēl pirms tam, kad infrastruktÅ«rā vēl nebija datu bāzes. RelatÄ«vi runājot, infrastruktÅ«ra tika palaista, izvietota DC, un mums uzreiz ir Service Discovery. Ja tas ir konsuls, tad uz tā var izveidot DNS. Ja tas ir Etcd, iespējams, ir daļa no Kubernetes klastera, kurā tiks izvietots viss pārējais. Man Ŕķiet, ka Service Discovery jau ir mÅ«sdienu infrastruktÅ«ras neatņemama sastāvdaļa. Un viņi par to domā daudz agrāk nekā par datu bāzēm.

Paldies!

Avots: www.habr.com

Pievieno komentāru