RakstÄ pastÄstÄ«Å”u, kÄ mÄs piegÄjÄm PostgreSQL kļūdu tolerances jautÄjumam, kÄpÄc tas mums kļuva svarÄ«gi un kas beigÄs notika.
Mums ir ļoti noslogots pakalpojums: 2,5 miljoni lietotÄju visÄ pasaulÄ, 50 100+ aktÄ«vo lietotÄju katru dienu. Serveri atrodas AmazonÄ vienÄ ÄŖrijas reÄ£ionÄ: nepÄrtraukti strÄdÄ 50+ dažÄdi serveri, no kuriem gandrÄ«z XNUMX ir ar datu bÄzÄm.
Visa aizmugursistÄma ir liela monolÄ«ta statusa saturoÅ”a Java lietojumprogramma, kas uztur pastÄvÄ«gu tÄ«mekļa ligzdas savienojumu ar klientu. Kad vairÄki lietotÄji vienlaikus strÄdÄ pie vienas plates, viÅi visi redz izmaiÅas reÄllaikÄ, jo katras izmaiÅas mÄs ierakstÄm datu bÄzÄ. MÅ«su datu bÄzÄm ir aptuveni 10 80 pieprasÄ«jumu sekundÄ. Redis maksimÄlÄs slodzes laikÄ mÄs rakstÄm 100āXNUMX XNUMX pieprasÄ«jumu sekundÄ.
KÄpÄc mÄs pÄrgÄjÄm no Redis uz PostgreSQL
SÄkotnÄji mÅ«su pakalpojums strÄdÄja ar Redis ā atslÄgu vÄrtÄ«bu krÄtuvi, kas visus datus glabÄ servera RAM.
Redis plusi:
- Liels reakcijas Ätrums, jo viss tiek saglabÄts atmiÅÄ;
- VienkÄrÅ”a dublÄÅ”ana un replikÄcija.
Redis mīnusi mums:
- ReÄlu darÄ«jumu nav. MÄs mÄÄ£inÄjÄm tos simulÄt mÅ«su lietojumprogrammas lÄ«menÄ«. DiemžÄl tas ne vienmÄr darbojÄs labi un bija jÄieraksta ļoti sarežģīts kods.
- Datu apjomu ierobežo atmiÅas apjoms. Palielinoties datu apjomam, atmiÅa palielinÄsies, un galu galÄ mÄs saskarsimies ar atlasÄ«tÄs instances Ä«paŔībÄm, kas AWS prasa apturÄt mÅ«su pakalpojumu, lai mainÄ«tu instances veidu.
- Ir nepiecieÅ”ams pastÄvÄ«gi uzturÄt zemu latentuma lÄ«meni, jo. mums ir ļoti liels pieprasÄ«jumu skaits. OptimÄlais aizkaves lÄ«menis mums ir 17-20 ms. 30ā40 ms lÄ«menÄ« mÄs saÅemam ilgas atbildes uz pieprasÄ«jumiem no mÅ«su lietojumprogrammas un pakalpojuma degradÄciju. DiemžÄl mums tas notika 2018. gada septembrÄ«, kad viena no gadÄ«jumiem ar Redis nez kÄpÄc saÅÄma latentumu 2 reizes vairÄk nekÄ parasti. Lai atrisinÄtu problÄmu, mÄs apturÄjÄm pakalpojumu dienas vidÅ« neplÄnotas apkopes dÄļ un nomainÄ«jÄm problemÄtisko Redis instanci.
- Ir viegli iegÅ«t datu nekonsekvenci pat ar nelielÄm kļūdÄm kodÄ un pÄc tam pavadÄ«t daudz laika, rakstot kodu, lai labotu Å”os datus.
MÄs ÅÄmÄm vÄrÄ mÄ«nusus un sapratÄm, ka mums ir jÄpÄriet uz kaut ko ÄrtÄku, ar normÄliem darÄ«jumiem un mazÄku atkarÄ«bu no latentuma. Veica pÄtÄ«jumu, analizÄja daudzas iespÄjas un izvÄlÄjÄs PostgreSQL.
Jau 1,5 gadu esam pÄrgÄjuÅ”i uz jaunu datu bÄzi un esam pÄrvietojuÅ”i tikai nelielu daļu datu, tÄpÄc tagad strÄdÄjam vienlaicÄ«gi ar Redis un PostgreSQL. PlaÅ”Äka informÄcija par datu pÄrvietoÅ”anas un pÄrslÄgÅ”anas posmiem starp datu bÄzÄm ir ierakstÄ«ta
Kad mÄs sÄkÄm pÄrvietoties, mÅ«su lietojumprogramma strÄdÄja tieÅ”i ar datu bÄzi un piekļuva galvenajam Redis un PostgreSQL. PostgreSQL klasteris sastÄvÄja no galvenÄ un replikas ar asinhrono replikÄciju. Å Ädi izskatÄ«jÄs datu bÄzes shÄma:
PgBouncer ievieŔana
KamÄr mÄs pÄrvietojÄmies, produkts arÄ« attÄ«stÄ«jÄs: pieauga lietotÄju un serveru skaits, kas strÄdÄja ar PostgreSQL, un mums sÄka trÅ«kt savienojumu. PostgreSQL katram savienojumam izveido atseviŔķu procesu un patÄrÄ resursus. JÅ«s varat palielinÄt savienojumu skaitu lÄ«dz noteiktam punktam, pretÄjÄ gadÄ«jumÄ pastÄv iespÄja iegÅ«t neoptimÄlu datu bÄzes veiktspÄju. IdeÄls variants Å”ÄdÄ situÄcijÄ bÅ«tu izvÄlÄties savienojumu pÄrvaldnieku, kas stÄvÄs pamatnes priekÅ”Ä.
Mums bija divas savienojuma pÄrvaldnieka iespÄjas: Pgpool un PgBouncer. Bet pirmais neatbalsta darÄ«jumu režīmu darbam ar datu bÄzi, tÄpÄc mÄs izvÄlÄjÄmies PgBouncer.
MÄs esam izveidojuÅ”i Å”Ädu darba shÄmu: mÅ«su lietojumprogramma piekļūst vienam PgBouncer, aiz kura atrodas PostgreSQL meistari, un aiz katra galvenÄ ir viena kopija ar asinhrono replikÄciju.
TajÄ paÅ”Ä laikÄ mÄs nevarÄjÄm saglabÄt visu datu apjomu PostgreSQL, un mums bija svarÄ«gs darba Ätrums ar datu bÄzi, tÄpÄc mÄs sÄkÄm PostgreSQL sadalÄ«t lietojumprogrammu lÄ«menÄ«. Tam ir salÄ«dzinoÅ”i Ärta iepriekÅ” aprakstÄ«tÄ shÄma: pievienojot jaunu PostgreSQL shardu, pietiek ar PgBouncer konfigurÄcijas atjauninÄÅ”anu un aplikÄcija var uzreiz strÄdÄt ar jauno shard.
PgBouncer kļūmjpÄrlÄce
Å Ä« shÄma darbojÄs lÄ«dz brÄ«dim, kad nomira vienÄ«gÄ PgBouncer instance. MÄs atrodamies AWS, kur visi gadÄ«jumi darbojas ar aparatÅ«ru, kas periodiski nomirst. Å Ädos gadÄ«jumos gadÄ«jums vienkÄrÅ”i pÄriet uz jaunu aparatÅ«ru un atkal darbojas. Tas notika ar PgBouncer, taÄu tas kļuva nepieejams. Å Ä« kritiena rezultÄts bija mÅ«su pakalpojuma nepieejamÄ«ba 25 minÅ«tes. AWS iesaka Å”ÄdÄm situÄcijÄm izmantot lietotÄja puses atlaiÅ”anu, kas tobrÄ«d mÅ«su valstÄ« netika ieviesta.
PÄc tam mÄs nopietni domÄjÄm par PgBouncer un PostgreSQL klasteru kļūdu toleranci, jo lÄ«dzÄ«ga situÄcija var notikt ar jebkuru gadÄ«jumu mÅ«su AWS kontÄ.
MÄs izveidojÄm PgBouncer kļūdu tolerances shÄmu Å”Ädi: visi lietojumprogrammu serveri piekļūst tÄ«kla slodzes lÄ«dzsvarotÄjam, aiz kura atrodas divi PgBouncer. Katrs PgBouncer apskata vienu un to paÅ”u PostgreSQL katras Ŕķembas meistaru. Ja AWS instances avÄrija atkÄrtojas, visa trafika tiek novirzÄ«ta caur citu PgBouncer. TÄ«kla slodzes lÄ«dzsvara kļūmjpÄrlÄci nodroÅ”ina AWS.
Å Ä« shÄma atvieglo jaunu PgBouncer serveru pievienoÅ”anu.
Izveidojiet PostgreSQL kļūmjpÄrlÄces kopu
Risinot Å”o problÄmu, mÄs apsvÄrÄm dažÄdas iespÄjas: paÅ”rakstÄ«ts failover, repmgr, AWS RDS, Patroni.
PaŔu rakstīti skripti
ViÅi var pÄrraudzÄ«t galvenÄs ierÄ«ces darbu un, ja tas neizdodas, reklamÄt kopiju uz galveno un atjauninÄt PgBouncer konfigurÄciju.
Å Ä«s pieejas priekÅ”rocÄ«bas ir maksimÄla vienkÄrŔība, jo jÅ«s pats rakstÄt skriptus un precÄ«zi saprotat, kÄ tie darbojas.
MÄ«nusi:
- IespÄjams, kapteinis nav miris, tÄ vietÄ var bÅ«t radusies tÄ«kla kļūme. Failover, to nezinot, paaugstinÄs kopiju meistaram, bet vecais meistars turpinÄs strÄdÄt. RezultÄtÄ mÄs iegÅ«sim divus serverus meistara lomÄ un mÄs nezinÄsim, kuram no tiem ir jaunÄkie jaunÄkie dati. Å o situÄciju sauc arÄ« par smadzeÅu sadalÄ«Å”anos;
- MÄs palikÄm bez atbildes. MÅ«su konfigurÄcijÄ galvenais un viena kopija pÄc pÄrslÄgÅ”anÄs tiek pÄrvietota uz galveno, un mums vairs nav kopiju, tÄpÄc mums ir manuÄli jÄpievieno jauna kopija;
- Mums ir nepiecieÅ”ama papildu kļūmjpÄrlÄces darbÄ«bas uzraudzÄ«ba, savukÄrt mums ir 12 PostgreSQL shards, kas nozÄ«mÄ, ka mums ir jÄuzrauga 12 klasteri. Palielinoties shardu skaitam, jÄatceras arÄ« atjauninÄt kļūmjpÄrlÄci.
PaÅ”u rakstÄ«ta kļūmjpÄrlÄce izskatÄs ļoti sarežģīta un prasa nenozÄ«mÄ«gu atbalstu. Izmantojot vienu PostgreSQL klasteru, tas bÅ«tu vienkÄrÅ”Äkais variants, taÄu tas netiek mÄrogots, tÄpÄc tas mums nav piemÄrots.
Repmgr
ReplikÄcijas pÄrvaldnieks PostgreSQL klasteriem, kas var pÄrvaldÄ«t PostgreSQL klastera darbÄ«bu. TajÄ paÅ”Ä laikÄ tam nav automÄtiskas kļūmjpÄrlÄces no kastes, tÄpÄc darbam jums bÅ«s jÄraksta savs āiesaiÅojumsā virs gatavÄ risinÄjuma. TÄtad viss var izrÄdÄ«ties vÄl sarežģītÄk nekÄ ar paÅ”u rakstÄ«tiem skriptiem, tÄpÄc mÄs pat nemÄÄ£inÄjÄm Repmgr.
AWS RDS
Atbalsta visu, kas mums nepiecieÅ”ams, zina, kÄ izveidot dublÄjumus un uztur savienojumu kopumu. Tam ir automÄtiska pÄrslÄgÅ”anÄs: kad galvenais nomirst, replika kļūst par jauno galveno, un AWS maina dns ierakstu uz jauno galveno, savukÄrt kopijas var atrasties dažÄdos AZ.
TrÅ«kumi ietver smalku pielÄgojumu trÅ«kumu. KÄ precÄ«zas regulÄÅ”anas piemÄrs: mÅ«su gadÄ«jumiem ir ierobežojumi tcp savienojumiem, ko diemžÄl nevar izdarÄ«t RDS:
net.ipv4.tcp_keepalive_time=10
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_retries2=3
TurklÄt AWS RDS ir gandrÄ«z divas reizes dÄrgÄka par parastÄs instances cenu, kas bija galvenais iemesls atteikÅ”anÄs no Ŕī risinÄjuma.
Patroni
Å Ä« ir python veidne PostgreSQL pÄrvaldÄ«bai ar labu dokumentÄciju, automÄtisku kļūmjpÄrlÄci un pirmkodu vietnÄ github.
Patroni plusi:
- Katrs konfigurÄcijas parametrs ir aprakstÄ«ts, ir skaidrs, kÄ tas darbojas;
- AutomÄtiskÄ kļūmjpÄrlÄce darbojas jau no kastes;
- RakstÄ«ts python, un tÄ kÄ mÄs paÅ”i daudz rakstÄm python, tad mums bÅ«s vieglÄk tikt galÄ ar problÄmÄm un, iespÄjams, pat palÄ«dzÄt projekta attÄ«stÄ«bai;
- PilnÄ«bÄ pÄrvalda PostgreSQL, ļauj vienlaikus mainÄ«t konfigurÄciju visos klastera mezglos un, ja klasteris ir jÄrestartÄ, lai lietotu jauno konfigurÄciju, to var izdarÄ«t vÄlreiz, izmantojot Patroni.
MÄ«nusi:
- No dokumentÄcijas nav skaidrs, kÄ pareizi strÄdÄt ar PgBouncer. Lai gan to ir grÅ«ti nosaukt par mÄ«nusu, jo Patroni uzdevums ir pÄrvaldÄ«t PostgreSQL, un tas, kÄ notiks savienojumi ar Patroni, jau ir mÅ«su problÄma;
- Ir maz Patroni ievieÅ”anas piemÄru lielos apjomos, savukÄrt ir daudz piemÄru ievieÅ”anai no nulles.
TÄ rezultÄtÄ mÄs izvÄlÄjÄmies Patroni, lai izveidotu kļūmjpÄrlÄces kopu.
Patroni ievieŔanas process
Pirms Patroni mums bija 12 PostgreSQL shards viena galvenÄ konfigurÄcijÄ un viena kopija ar asinhrono replikÄciju. Lietojumprogrammu serveri piekļuva datu bÄzÄm, izmantojot Network Load Balancer, aiz kura atradÄs divi gadÄ«jumi ar PgBouncer, un aiz tiem atradÄs visi PostgreSQL serveri.
Lai ieviestu Patroni, mums bija jÄizvÄlas izplatÄ«ta krÄtuves klastera konfigurÄcija. Patroni strÄdÄ ar izplatÄ«tÄm konfigurÄcijas glabÄÅ”anas sistÄmÄm, piemÄram, etcd, Zookeeper, Consul. Mums tikko tirgÅ« ir pilnvÄrtÄ«gs konsulu klasteris, kas darbojas kopÄ ar Vault, un mÄs to vairs neizmantojam. Lielisks iemesls, lai sÄktu lietot Consul paredzÄtajam mÄrÄ·im.
KÄ Patroni strÄdÄ ar konsulu
Mums ir Consul klasteris, kas sastÄv no trim mezgliem, un Patroni klasteris, kas sastÄv no lÄ«dera un kopijas (Patroni valodÄ galveno sauc par klastera vadÄ«tÄju, bet vergus sauc par replikÄm). Katrs Patroni klastera gadÄ«jums pastÄvÄ«gi nosÅ«ta konsulam informÄciju par klastera stÄvokli. TÄpÄc no Consul vienmÄr varat uzzinÄt paÅ”reizÄjo Patroni klastera konfigurÄciju un to, kurÅ” Å”obrÄ«d ir lÄ«deris.
Lai savienotu Patroni ar Consul, pietiek izpÄtÄ«t oficiÄlo dokumentÄciju, kurÄ teikts, ka jums ir jÄnorÄda resursdators http vai https formÄtÄ atkarÄ«bÄ no tÄ, kÄ mÄs strÄdÄjam ar Consul, un savienojuma shÄmu, pÄc izvÄles:
host: the host:port for the Consul endpoint, in format: http(s)://host:port
scheme: (optional) http or https, defaults to http
Tas izskatÄs vienkÄrÅ”i, bet Å”eit sÄkas kļūmes. Ar Consul mÄs strÄdÄjam, izmantojot droÅ”u savienojumu, izmantojot https, un mÅ«su savienojuma konfigurÄcija izskatÄ«sies Å”Ädi:
consul:
host: https://server.production.consul:8080
verify: true
cacert: {{ consul_cacert }}
cert: {{ consul_cert }}
key: {{ consul_key }}
Bet tas nedarbojas. StartÄÅ”anas laikÄ Patroni nevar izveidot savienojumu ar Consul, jo tas tik un tÄ mÄÄ£ina iet caur http.
Patroni pirmkods palÄ«dzÄja tikt galÄ ar problÄmu. Labi, ka tas ir rakstÄ«ts python valodÄ. IzrÄdÄs, ka resursdatora parametrs nekÄdÄ veidÄ nav parsÄts, un protokols ir jÄnorÄda shÄmÄ. Å Ädi mums izskatÄs darba konfigurÄcijas bloks darbam ar Consul:
consul:
host: server.production.consul:8080
scheme: https
verify: true
cacert: {{ consul_cacert }}
cert: {{ consul_cert }}
key: {{ consul_key }}
konsuls-veidne
TÄtad, mÄs esam izvÄlÄjuÅ”ies konfigurÄcijas krÄtuvi. Tagad mums ir jÄsaprot, kÄ PgBouncer mainÄ«s savu konfigurÄciju, mainot lÄ«deri Patroni klasterÄ«. Uz Å”o jautÄjumu dokumentÄcijÄ atbildes nav, jo. tur principÄ darbs ar PgBouncer nav aprakstÄ«ts.
MeklÄjot risinÄjumu, atradÄm rakstu (virsrakstu diemžÄl neatceros), kur bija rakstÄ«ts, ka Š”onsul-template ļoti palÄ«dzÄja PgBouncer un Patroni savienoÅ”anÄ. Tas pamudinÄja mÅ«s izpÄtÄ«t, kÄ darbojas Consul-veidne.
IzrÄdÄ«jÄs, ka Consul-template pastÄvÄ«gi uzrauga PostgreSQL klastera konfigurÄciju Consul. Kad vadÄ«tÄjs mainÄs, tas atjaunina PgBouncer konfigurÄciju un nosÅ«ta komandu, lai to atkÄrtoti ielÄdÄtu.
Liels veidnes pluss ir tas, ka tÄ tiek saglabÄta kÄ kods, tÄpÄc, pievienojot jaunu shardu, pietiek ar jaunu commit un veidnes automÄtisku atjauninÄÅ”anu, atbalstot Infrastructure as code principu.
Jauna arhitektūra ar Patroni
RezultÄtÄ mÄs saÅÄmÄm Å”Ädu darba shÄmu:
Visi lietojumprogrammu serveri piekļūst lÄ«dzsvarotÄjam ā aiz tÄ ir divi PgBouncer gadÄ«jumi ā katrÄ instancÄ tiek palaista Consul veidne, kas uzrauga katra Patroni klastera statusu un uzrauga PgBouncer konfigurÄcijas atbilstÄ«bu, kas nosÅ«ta pieprasÄ«jumus paÅ”reizÄjam lÄ«derim. katra klastera.
ManuÄla pÄrbaude
MÄs palaidÄm Å”o shÄmu pirms tÄs palaiÅ”anas nelielÄ testa vidÄ un pÄrbaudÄ«jÄm automÄtiskÄs pÄrslÄgÅ”anas darbÄ«bu. ViÅi atvÄra dÄli, pÄrvietoja uzlÄ«mi un tajÄ brÄ«dÄ« ānogalinÄjaā klastera vadÄ«tÄju. PakalpojumÄ AWS tas ir tikpat vienkÄrÅ”i kÄ gadÄ«juma izslÄgÅ”ana, izmantojot konsoli.
UzlÄ«me atgriezÄs atpakaļ 10-20 sekunžu laikÄ un pÄc tam atkal sÄka kustÄties kÄ parasti. Tas nozÄ«mÄ, ka Patroni klasteris darbojÄs pareizi: tas mainÄ«ja vadÄ«tÄju, nosÅ«tÄ«ja informÄciju Š”onsul, un Š”onsul-template nekavÄjoties paÅÄma Å”o informÄciju, nomainÄ«ja PgBouncer konfigurÄciju un nosÅ«tÄ«ja komandu pÄrlÄdÄt.
KÄ izdzÄ«vot zem lielas slodzes un samazinÄt dÄ«kstÄves laiku?
Viss strÄdÄ perfekti! Bet rodas jauni jautÄjumi: kÄ tas darbosies pie lielas slodzes? KÄ Ätri un droÅ”i visu izrullÄt ražoÅ”anÄ?
Testa vide, kurÄ mÄs veicam slodzes testÄÅ”anu, palÄ«dz mums atbildÄt uz pirmo jautÄjumu. ArhitektÅ«ras ziÅÄ tas ir pilnÄ«gi identisks ražoÅ”anai un ir Ä£enerÄjis testa datus, kas pÄc apjoma ir aptuveni vienÄdi ar ražoÅ”anas apjomu. MÄs nolemjam testa laikÄ vienkÄrÅ”i "nogalinÄt" vienu no PostgreSQL meistariem un redzÄt, kas notiks. Bet pirms tam ir svarÄ«gi pÄrbaudÄ«t automÄtisko ritinÄÅ”anu, jo Å”ajÄ vidÄ mums ir vairÄkas PostgreSQL shards, tÄpÄc mÄs iegÅ«sim lielisku konfigurÄcijas skriptu testÄÅ”anu pirms ražoÅ”anas.
Abi uzdevumi izskatÄs ambiciozi, taÄu mums ir PostgreSQL 9.6. Vai mÄs varam nekavÄjoties jauninÄt uz 11.2?
MÄs nolemjam to izdarÄ«t divÄs darbÄ«bÄs: vispirms jauniniet uz 2, pÄc tam palaidiet Patroni.
PostgreSQL atjauninÄjums
Lai Ätri atjauninÄtu PostgreSQL versiju, izmantojiet opciju -k, kurÄ diskÄ tiek izveidotas cietÄs saites un nav nepiecieÅ”ams kopÄt jÅ«su datus. Ja ietilpÄ«ba ir 300ā400 GB, atjauninÄÅ”ana aizÅem 1 sekundi.
Mums ir daudz lauskas, tÄpÄc atjauninÄÅ”ana ir jÄveic automÄtiski. Lai to izdarÄ«tu, mÄs uzrakstÄ«jÄm Ansible rokasgrÄmatu, kurÄ mÅ«su vietÄ tiek apstrÄdÄts viss atjauninÄÅ”anas process:
/usr/lib/postgresql/11/bin/pg_upgrade
<b>--link </b>
--old-datadir='' --new-datadir=''
--old-bindir='' --new-bindir=''
--old-options=' -c config_file='
--new-options=' -c config_file='
Å eit ir svarÄ«gi atzÄ«mÄt, ka pirms jauninÄÅ”anas uzsÄkÅ”anas tas ir jÄveic ar parametru --pÄrbaudilai pÄrliecinÄtos, ka varat jauninÄt. MÅ«su skripts arÄ« veic konfigurÄciju aizstÄÅ”anu jauninÄÅ”anas laikÄ. MÅ«su skripts tika pabeigts 30 sekundÄs, kas ir lielisks rezultÄts.
Palaidiet Patroni
Lai atrisinÄtu otro problÄmu, vienkÄrÅ”i apskatiet Patroni konfigurÄciju. OficiÄlajÄ repozitorijÄ ir konfigurÄcijas piemÄrs ar initdb, kas ir atbildÄ«gs par jaunas datu bÄzes inicializÄÅ”anu, kad pirmo reizi startÄjat Patroni. Bet, tÄ kÄ mums jau ir gatava datu bÄze, mÄs vienkÄrÅ”i noÅÄmÄm Å”o sadaļu no konfigurÄcijas.
Kad sÄkÄm instalÄt Patroni jau esoÅ”Ä PostgreSQL klasterÄ« un palaist to, radÄs jauna problÄma: abi serveri sÄka darboties kÄ lÄ«deri. Patroni neko nezina par klastera agrÄ«no stÄvokli un mÄÄ£ina palaist abus serverus kÄ divus atseviŔķus klasterus ar tÄdu paÅ”u nosaukumu. Lai atrisinÄtu Å”o problÄmu, jums ir jÄizdzÄÅ” direktorijs ar datiem par vergu:
rm -rf /var/lib/postgresql/
Tas jÄdara tikai vergam!
Kad ir pievienota tÄ«ra kopija, Patroni izveido bÄzes dublÄjuma lÄ«deri un atjauno to replikÄ, un pÄc tam sasniedz paÅ”reizÄjo stÄvokli saskaÅÄ ar Wal logs.
VÄl viena problÄma, ar kuru mÄs saskÄrÄmies, ir tÄ, ka visas PostgreSQL klasterus pÄc noklusÄjuma nosauc par galvenajiem. Ja katrs klasteris neko nezina par otru, tas ir normÄli. Bet, ja vÄlaties izmantot Patroni, visÄm kopÄm ir jÄbÅ«t unikÄlam nosaukumam. RisinÄjums ir mainÄ«t klastera nosaukumu PostgreSQL konfigurÄcijÄ.
slodzes tests
MÄs esam uzsÄkuÅ”i testu, kas simulÄ lietotÄja pieredzi uz dÄļiem. Kad slodze sasniedza mÅ«su vidÄjo dienas vÄrtÄ«bu, mÄs atkÄrtojÄm tieÅ”i to paÅ”u testu, izslÄdzÄm vienu gadÄ«jumu ar PostgreSQL lÄ«deri. AutomÄtiskÄ kļūmjpÄrlÄce darbojÄs, kÄ mÄs gaidÄ«jÄm: Patroni mainÄ«ja vadÄ«tÄju, Consul-template atjauninÄja PgBouncer konfigurÄciju un nosÅ«tÄ«ja komandu atkÄrtoti ielÄdÄt. SaskaÅÄ ar mÅ«su Grafana diagrammÄm bija skaidrs, ka ir 20ā30 sekunžu aizkave un neliels kļūdu skaits no serveriem, kas saistÄ«ti ar savienojumu ar datu bÄzi. TÄ ir normÄla situÄcija, Å”Ädas vÄrtÄ«bas ir pieÅemamas mÅ«su kļūmjpÄrlÄcei un noteikti ir labÄkas par pakalpojuma dÄ«kstÄvi.
Patroni ievieÅ”ana ražoÅ”anÄ
RezultÄtÄ mÄs izstrÄdÄjÄm Å”Ädu plÄnu:
- Izvietot Consul veidni PgBouncer serveros un palaist;
- PostgreSQL atjauninÄjumi versijai 11.2;
- Mainiet klastera nosaukumu;
- Patroni klastera uzsÄkÅ”ana.
TajÄ paÅ”Ä laikÄ mÅ«su shÄma ļauj mums izdarÄ«t pirmo punktu gandrÄ«z jebkurÄ laikÄ, mÄs varam pÄc kÄrtas noÅemt katru PgBouncer no darba un tajÄ izvietot un palaist konsula veidni. TÄ arÄ« izdarÄ«jÄm.
Ätrai izvietoÅ”anai mÄs izmantojÄm Ansible, jo mÄs jau esam testÄjuÅ”i visas rokasgrÄmatas testa vidÄ, un pilna skripta izpildes laiks bija no 1,5 lÄ«dz 2 minÅ«tÄm katram fragmentam. MÄs varÄtu izlikt visu pÄc kÄrtas katrÄ shardÄ, neapturot mÅ«su pakalpojumu, taÄu mums uz dažÄm minÅ«tÄm bÅ«tu jÄizslÄdz katrs PostgreSQL. Å ajÄ gadÄ«jumÄ lietotÄji, kuru dati atrodas Å”ajÄ shardÄ, Å”obrÄ«d nevar pilnÄ«bÄ darboties, un tas mums nav pieÅemami.
Izeja no Ŕīs situÄcijas bija plÄnveida apkope, kas notiek ik pÄc 3 mÄneÅ”iem. Å is ir plÄnotÄ darba logs, kad mÄs pilnÄ«bÄ izslÄdzam pakalpojumu un jauninÄm datu bÄzes gadÄ«jumus. LÄ«dz nÄkamajam logam bija palikusi nedÄļa, un mÄs nolÄmÄm vienkÄrÅ”i pagaidÄ«t un gatavoties tÄlÄk. GaidÄ«Å”anas laikÄ mÄs papildus nodroÅ”inÄjÄm sevi: katrai PostgreSQL fragmentam izveidojÄm rezerves kopiju gadÄ«jumam, ja neizdodas saglabÄt jaunÄkos datus, un katrai fragmentam pievienojÄm jaunu gadÄ«jumu, kam vajadzÄtu kļūt par jaunu kopiju Patroni klasterÄ«, lai netiktu izpildÄ«ta datu dzÄÅ”anas komanda. Tas viss palÄ«dzÄja samazinÄt kļūdu risku.
RestartÄjÄm savu servisu, viss darbojÄs kÄ nÄkas, lietotÄji turpinÄja strÄdÄt, bet grafikos novÄrojÄm nenormÄli lielu Consul serveru slodzi.
KÄpÄc mÄs to neredzÄjÄm testa vidÄ? Å Ä« problÄma ļoti labi parÄda, ka ir jÄievÄro infrastruktÅ«ras kÄ koda princips un jÄpilnveido visa infrastruktÅ«ra, sÄkot no testa vidÄm lÄ«dz ražoÅ”anai. PretÄjÄ gadÄ«jumÄ ir ļoti viegli tikt galÄ ar raduÅ”os problÄmu. Kas notika? Consul vispirms parÄdÄ«jÄs ražoÅ”anÄ, bet pÄc tam testa vidÄs, kÄ rezultÄtÄ testa vidÄs Consul versija bija augstÄka nekÄ sÄrijveida. Tikai vienÄ no laidieniem, strÄdÄjot ar konsul-veidni, tika novÄrsta CPU noplÅ«de. TÄpÄc mÄs vienkÄrÅ”i atjauninÄjÄm konsulu, tÄdÄjÄdi atrisinot problÄmu.
RestartÄjiet Patroni kopu
TomÄr mums radÄs jauna problÄma, par kuru mums pat nebija aizdomas. Atjauninot Consul, mÄs vienkÄrÅ”i noÅemam Consul mezglu no klastera, izmantojot komandu konsuls atstÄt ā Patroni izveido savienojumu ar citu Consul serveri ā viss darbojas. Bet, kad mÄs nokļuvÄm pÄdÄjÄ konsulu kopas instancÄ un nosÅ«tÄ«jÄm tai konsula atvaļinÄjuma komandu, visas Patroni kopas vienkÄrÅ”i restartÄjÄs, un žurnÄlos mÄs redzÄjÄm Å”Ädu kļūdu:
ERROR: get_cluster
Traceback (most recent call last):
...
RetryFailedError: 'Exceeded retry deadline'
ERROR: Error communicating with DCS
<b>LOG: database system is shut down</b>
Patroni klasteris nevarÄja izgÅ«t informÄciju par savu kopu un tika restartÄts.
Lai rastu risinÄjumu, mÄs sazinÄjÄmies ar Patroni autoriem, izmantojot github problÄmu. ViÅi ieteica uzlabojumus mÅ«su konfigurÄcijas failos:
consul:
consul.checks: []
bootstrap:
dcs:
retry_timeout: 8
MÄs varÄjÄm atkÄrtot problÄmu testa vidÄ un tur pÄrbaudÄ«jÄm Ŕīs opcijas, taÄu diemžÄl tÄs nedarbojÄs.
ProblÄma joprojÄm ir neatrisinÄta. MÄs plÄnojam izmÄÄ£inÄt Å”Ädus risinÄjumus:
- Izmantojiet Consul-agent katrÄ Patroni klastera instancÄ;
- NovÄrsiet problÄmu kodÄ.
MÄs saprotam, kur radÄs kļūda: problÄma, iespÄjams, ir noklusÄjuma taimauta izmantoÅ”ana, kas netiek ignorÄta konfigurÄcijas failÄ. Kad pÄdÄjais Consul serveris tiek noÅemts no klastera, viss Consul klasteris uzkaras ilgÄk par sekundi, tÄpÄc Patroni nevar iegÅ«t klastera statusu un pilnÄ«bÄ restartÄ visu klasteru.
Par laimi, mÄs vairs nesaskÄrÄmies ar kļūdÄm.
Patroni lietoÅ”anas rezultÄti
PÄc veiksmÄ«gas Patroni palaiÅ”anas mÄs pievienojÄm papildu kopiju katrÄ klasterÄ«. Tagad katrÄ klasterÄ« ir kvoruma lÄ«dzÄ«ba: viens lÄ«deris un divas kopijas droŔības tÄ«klam smadzeÅu sadalÄ«Å”anas gadÄ«jumÄ, pÄrslÄdzoties.
Patroni ir strÄdÄjis pie ražoÅ”anas vairÄk nekÄ trÄ«s mÄneÅ”us. Å ajÄ laikÄ viÅÅ” jau ir paspÄjis mums palÄ«dzÄt. Nesen AWS nomira viena klastera vadÄ«tÄjs, darbojÄs automÄtiskÄ kļūmjpÄrlÄce un lietotÄji turpinÄja strÄdÄt. Patroni izpildÄ«ja savu galveno uzdevumu.
Neliels Patroni lietoŔanas kopsavilkums:
- VienkÄrÅ”a konfigurÄcijas maiÅa. Pietiek nomainÄ«t konfigurÄciju vienÄ instancÄ, un tÄ tiks izvilkta uz visu klasteru. Ja, lai lietotu jauno konfigurÄciju, ir nepiecieÅ”ama atsÄknÄÅ”ana, Patroni jÅ«s par to paziÅos. Patroni var restartÄt visu klasteru ar vienu komandu, kas arÄ« ir ļoti Ärti.
- AutomÄtiskÄ kļūmjpÄrlÄce darbojas un jau ir spÄjusi mums palÄ«dzÄt.
- PostgreSQL atjauninÄÅ”ana bez lietojumprogrammas dÄ«kstÄves. Vispirms ir jÄatjaunina replikas uz jauno versiju, pÄc tam jÄmaina Patroni klastera lÄ«deris un jÄatjaunina vecais lÄ«deris. Å ajÄ gadÄ«jumÄ tiek veikta nepiecieÅ”amÄ automÄtiskÄs kļūmjpÄrlÄces pÄrbaude.
Avots: www.habr.com