Raksta tulkojums tika sagatavots speciÄli kursa studentiem
PostgreSQL un savienojumam specifiski rakstīŔanas konsekvences iestatījumi
UzÅÄmumÄ Compose mÄs strÄdÄjam ar daudzÄm datu bÄzÄm, kas dod mums iespÄju tuvÄk iepazÄ«ties ar to funkcionalitÄti un trÅ«kumiem. MÄcoties iemÄ«lÄt jaunu datu bÄzu lÄ«dzekļus, mÄs dažkÄrt sÄkam domÄt, cik jauki bÅ«tu, ja lÄ«dzÄ«gas funkcijas bÅ«tu pieejamas nobrieduÅ”Äkajos rÄ«kos, ar kuriem esam strÄdÄjuÅ”i jau ilgu laiku. Viena no jaunajÄm funkcijÄm, ko vÄlÄjos redzÄt programmÄ PostgreSQL, bija konfigurÄjama rakstÄ«Å”anas konsekvence katram savienojumam visÄ klasterÄ«. Un, kÄ izrÄdÄs, mums tas jau ir, un Å”odien mÄs vÄlamies dalÄ«ties ar jums informÄcijÄ par to, kÄ jÅ«s to varat izmantot.
KÄpÄc man tas ir vajadzÄ«gs?
Tas, kÄ klasterim vajadzÄtu darboties, ir atkarÄ«gs no jÅ«su lietojumprogrammas. Å emiet, piemÄram, rÄÄ·inu apmaksas lietotni. Jums bÅ«s nepiecieÅ”ama XNUMX% konsekvence visÄ klasterÄ«, tÄpÄc jums bÅ«s jÄiespÄjo sinhronÄs saistÄ«bas, lai jÅ«su datu bÄze gaidÄ«tu visu izmaiÅu veikÅ”anu. TomÄr, ja jÅ«su lietojumprogramma ir strauji augoÅ”s sociÄlais tÄ«kls, jÅ«s, iespÄjams, dosiet priekÅ”roku Ätrai reakcijai, nevis XNUMX% konsekvencei. Lai to panÄktu, savÄ klasterÄ« varat izmantot asinhronÄs saistÄ«bas.
Iepazīstieties ar kompromisu
Jums ir jÄveic kompromisi starp datu konsekvenci un veiktspÄju. PostgreSQL attÄlinÄs no konsekvences, jo noklusÄjuma konfigurÄcija ir paredzama un bez negaidÄ«tiem pÄrsteigumiem. Tagad aplÅ«kosim kompromisus.
Kompromiss 1: veiktspÄja
Ja PostgreSQL klasterim nav nepiecieÅ”ama konsekvence, tas var darboties asinhroni. RakstÄ«Å”ana tiek veikta klastera vadÄ«tÄjam, un atjauninÄjumi tiks nosÅ«tÄ«ti tÄ replikÄm dažas milisekundes vÄlÄk. Ja PostgreSQL klasterim ir nepiecieÅ”ama konsekvence, tai jÄdarbojas sinhroni. RakstÄ«Å”ana tiks veikta klastera vadÄ«tÄjam, kas nosÅ«tÄ«s atjauninÄjumu replikÄm un gaidÄ«s apstiprinÄjumu, ka katrs ir uzrakstÄ«jis, pirms nosÅ«tÄ«s apstiprinÄjumu klientam, kurÅ” uzsÄka rakstÄ«Å”anu, ka tÄ bija veiksmÄ«ga. PraktiskÄ atŔķirÄ«ba starp Ŕīm pieejÄm ir tÄda, ka asinhronajai metodei ir nepiecieÅ”ami divi tÄ«kla apiÅi, bet sinhronajai metodei nepiecieÅ”ami Äetri.
2. kompromiss: konsekvence
ArÄ« rezultÄts lÄ«dera neveiksmes gadÄ«jumÄ Å”ajÄs divÄs pieejÄs bÅ«s atŔķirÄ«gs. Ja darbs tiek veikts asinhroni, tad, ja rodas Å”Äda kļūda, kopijas neveic visus ierakstus. Cik daudz tiks zaudÄts? AtkarÄ«gs no paÅ”as lietojumprogrammas un replikÄcijas efektivitÄtes. RakstÄ«Å”anas replikÄcija neļaus kopijai kļūt par lÄ«deri, ja informÄcijas apjoms tajÄ ir par 1 MB mazÄks nekÄ lÄ«derÄ, tas ir, asinhronas darbÄ«bas laikÄ var tikt zaudÄts lÄ«dz 1 MB ierakstu.
SinhronÄ režīmÄ tas nenotiek. Ja vadÄ«tÄjs neizdodas, visas kopijas tiek atjauninÄtas, jo jebkuram vadÄ«tÄjam apstiprinÄtajam ierakstam ir jÄbÅ«t apstiprinÄtam uz replikÄm. TÄ ir konsekvence.
Sinhronai darbÄ«bai ir jÄga norÄÄ·inu lietojumprogrammÄ, kur konsekvencei ir skaidra priekÅ”rocÄ«ba kompromisÄ starp konsekvenci un veiktspÄju. VissvarÄ«gÄkais Å”Ädai lietojumprogrammai ir derÄ«gi dati. Tagad padomÄjiet par sociÄlo tÄ«klu, kurÄ galvenais uzdevums ir noturÄt lietotÄja uzmanÄ«bu, atbildot uz pieprasÄ«jumiem pÄc iespÄjas ÄtrÄk. Å ajÄ gadÄ«jumÄ prioritÄte bÅ«s veiktspÄjai ar mazÄku tÄ«kla lÄcienu skaitu un mazÄku gaidÄ«Å”anas laiku, lai izpildÄ«tu saistÄ«bas. TomÄr kompromiss starp veiktspÄju un konsekvenci nav vienÄ«gais, par ko jums jÄdomÄ.
3. kompromiss: avÄrijas
Ir ļoti svarÄ«gi saprast, kÄ klasteris uzvedas neveiksmes laikÄ. Apsveriet situÄciju, kad viena vai vairÄkas kopijas neizdodas. Kad saistÄ«bas tiek apstrÄdÄtas asinhroni, vadÄ«tÄjs turpinÄs darboties, tas ir, pieÅems un apstrÄdÄs ierakstus, negaidot trÅ«kstoÅ”Äs kopijas. Kad replikas atgriežas klasterÄ«, tÄs panÄk lÄ«deri. Izmantojot sinhrono replikÄciju, ja replikas nereaÄ£Ä, lÄ«derim nebÅ«s citas izvÄles un viÅÅ” turpinÄs gaidÄ«t apstiprinÄÅ”anas apstiprinÄjumu, lÄ«dz replika atgriezÄ«sies klasterÄ« un varÄs pieÅemt un veikt rakstÄ«Å”anu.
Viens savienojums katram darījumam?
Katrai lietojumprogrammai ir nepiecieÅ”ama cita veida konsekvences un veiktspÄjas kombinÄcija. Ja vien, protams, tÄ nav mÅ«su rÄÄ·inu apmaksas lietotne, kuru mÄs iedomÄjamies kÄ pilnÄ«gi konsekventu, vai mÅ«su gandrÄ«z Ä«slaicÄ«gÄ sociÄlo tÄ«klu lietotne. Visos citos gadÄ«jumos bÅ«s reizes, kad dažÄm darbÄ«bÄm jÄbÅ«t sinhronÄm, bet dažÄm jÄbÅ«t asinhronÄm. JÅ«s, iespÄjams, nevÄlaties, lai sistÄma gaidÄ«tu, kamÄr Äatam nosÅ«tÄ«tais ziÅojums tiek apstiprinÄts, taÄu, ja maksÄjums tiek apstrÄdÄts tajÄ paÅ”Ä lietojumprogrammÄ, jums bÅ«s jÄgaida.
Visus Å”os lÄmumus, protams, pieÅem lietojumprogrammas izstrÄdÄtÄjs. Pareizu lÄmumu pieÅemÅ”ana par to, kad izmantot katru pieeju, palÄ«dzÄs jums gÅ«t maksimÄlu labumu no kopas. Ir svarÄ«gi, lai izstrÄdÄtÄjs varÄtu pÄrslÄgties starp tiem SQL lÄ«menÄ« savienojumiem un transakcijÄm.
Kontroles nodroÅ”inÄÅ”ana praksÄ
PÄc noklusÄjuma PostgreSQL nodroÅ”ina konsekvenci. To kontrolÄ servera parametrs synchronous_commit
. PÄc noklusÄjuma tas ir pozÄ«cijÄ on
, taÄu tai ir trÄ«s citas iespÄjas: local
, remote_write
vai off
.
Iestatot parametru uz off
visas sinhronÄs saistÄ«bas tiek apturÄtas pat vietÄjÄ sistÄmÄ. VietÄjais parametrs norÄda sinhrono režīmu lokÄlajai sistÄmai, bet ierakstÄ«Å”ana replikÄs tiek veikta asinhroni. Remote_write
iet vÄl tÄlÄk: ieraksti replikÄs tiek veikti asinhroni, bet tiek atgriezti, kad replika ir pieÅÄmusi rakstÄ«Å”anu, bet nav ierakstÄ«jusi to diskÄ.
Apsverot pieejamo iespÄju klÄstu, mÄs izvÄlamies uzvedÄ«bu un, paturot to prÄtÄ on
ā tie ir sinhronie ieraksti, mÄs izvÄlÄsimies local
asinhronÄm saistÄ«bÄm tÄ«klÄ, vienlaikus atstÄjot vietÄjÄs saistÄ«bas sinhronas.
Tagad mÄs jums pateiksim, kÄ to iestatÄ«t, bet iedomÄjieties, ka mÄs to iestatÄm synchronous_commit
Š² local
serverim. MÄs domÄjÄm, vai ir iespÄjams mainÄ«t parametru synchronous_commit
lidojumÄ, un izrÄdÄ«jÄs, ka tas ir ne tikai iespÄjams, bet ir pat divi veidi, kÄ to izdarÄ«t. Pirmais ir iestatÄ«t savienojuma sesiju Å”Ädi:
SET SESSION synchronous_commit TO ON;
// Your writes go here
Visi turpmÄkie ieraksti sesijÄ apstiprinÄs ierakstus replikÄs pirms pozitÄ«va rezultÄta atgrieÅ”anas pievienotajam klientam. Ja vien, protams, nemainÄt iestatÄ«jumu synchronous_commit
atkal. Jūs varat izlaist daļu SESSION
komandÄ, jo tÄ bÅ«s noklusÄjuma vÄrtÄ«bÄ.
OtrÄ metode ir piemÄrota, ja vÄlaties tikai pÄrliecinÄties, ka saÅemat sinhronu replikÄciju vienam darÄ«jumam. DaudzÄs NoSQL paaudzes datu bÄzÄs transakciju jÄdziens nepastÄv, bet PostgreSQL tas pastÄv. Å ajÄ gadÄ«jumÄ jÅ«s sÄkat darÄ«jumu un pÄc tam iestatÄt synchronous_commit
Š² on
pirms darījuma ieraksta veikŔanas. COMMIT
veiks darÄ«jumu, izmantojot jebkuru parametra vÄrtÄ«bu synchronous_commit
, kas tajÄ laikÄ tika iestatÄ«ts, lai gan vislabÄk ir iestatÄ«t mainÄ«go jau iepriekÅ”, lai pÄrliecinÄtos, ka citi izstrÄdÄtÄji saprot, ka rakstÄ«Å”ana nav asinhrona.
BEGIN;
SET LOCAL synchronous_commit TO ON;
// Your writes go here
COMMIT;
Visas transakciju saistÄ«bas tagad tiks apstiprinÄtas kÄ ierakstÄ«tas replikÄs, pirms datubÄze atgriezÄ«s pozitÄ«vu atbildi pievienotajam klientam.
PostgreSQL iestatīŔana
Pirms tam mÄs iedomÄjÄmies PostgreSQL sistÄmu ar synchronous_commit
, uzstÄdÄ«ts iekÅ”Ä local
. Lai tas bÅ«tu reÄlistisks servera pusÄ, jums bÅ«s jÄiestata divas servera konfigurÄcijas opcijas. VÄl viens parametrs synchronous_standby_names
nÄks pats, kad synchronous_commit
būs on
. Tas nosaka, kuras replikas ir piemÄrotas sinhronai apstiprinÄÅ”anai, un mÄs to iestatÄ«sim *
, kas nozÄ«mÄs, ka ir iesaistÄ«tas visas kopijas. Å Ä«s vÄrtÄ«bas parasti tiek konfigurÄtas
synchronous_commit = local
synchronous_standby_names='*'
Iestatot parametru synchronous_commit
nozÄ«mÄ local
, mÄs izveidojam sistÄmu, kurÄ lokÄlie diski paliek sinhroni, bet tÄ«kla replikas pÄc noklusÄjuma ir asinhronas. Ja vien mÄs, protams, nenolemjam Ŕīs saistÄ«bas padarÄ«t sinhronas, kÄ parÄdÄ«ts iepriekÅ”.
Ja esi sekojis līdzi attīstībai
VÄl daži vÄrdi...
Tikai pirms nedÄļas es jums bÅ«tu teicis, ka PostgreSQL nav iespÄjams tik precÄ«zi noregulÄt. Toreiz Kurts, Compose platformas komandas biedrs, uzstÄja, ka Å”Äda iespÄja pastÄv. ViÅÅ” nomierinÄja manus iebildumus un atrada PostgreSQL dokumentÄcijÄ
Å o iestatÄ«jumu var mainÄ«t jebkurÄ laikÄ. Jebkura darÄ«juma darbÄ«bu nosaka iestatÄ«jums, kas ir spÄkÄ saistÄ«bu izpildes laikÄ. TÄpÄc ir iespÄjams un lietderÄ«gi dažus darÄ«jumus veikt sinhroni, bet citus asinhroni. PiemÄram, lai piespiestu vienu multistatement
transakcija, lai veiktu saistÄ«bas asinhroni, ja parametra noklusÄjuma vÄrtÄ«ba ir pretÄja, iestatÄ«t SET LOCAL synchronous_commit TO OFF
darÄ«jumÄ.
Ar Å”o nelielo konfigurÄcijas faila modifikÄciju mÄs ļÄvÄm lietotÄjiem kontrolÄt to konsekvenci un veiktspÄju.
Avots: www.habr.com