PostgreSQL og tilkoblingsspesifikke skrivekonsistensinnstillinger

Oversettelsen av artikkelen ble utarbeidet spesielt for studentene pĂ„ kurset "Database". Interessert i Ă„ utvikle seg i denne retningen? Vi inviterer deg til Åpen dag, hvor vi snakker i detalj om programmet, funksjoner i nettformatet, kompetanse og karrieremuligheter som venter nyutdannede etter trening.

PostgreSQL og tilkoblingsspesifikke skrivekonsistensinnstillinger

PostgreSQL og tilkoblingsspesifikke skrivekonsistensinnstillinger
Hos Compose har vi Ä gjÞre med mange databaser, noe som gir oss muligheten til Ä bli mer kjent med deres funksjonalitet og mangler. NÄr vi lÊrer Ä elske funksjonene til nye databaser, begynner vi noen ganger Ä tenke pÄ hvor fint det ville vÊrt om lignende funksjoner var til stede i de mer modne verktÞyene vi har jobbet med lenge. En av de nye funksjonene som jeg Þnsket Ä se i PostgreSQL var konfigurerbar skrivekonsistens for en tilkobling pÄ tvers av hele klyngen. Og som det viser seg, har vi det allerede, og i dag Þnsker vi Ä dele informasjon med deg om hvordan du kan bruke det.

Hvorfor trenger jeg det?

Hvordan klyngen skal oppfÞre seg avhenger av applikasjonen din. Ta for eksempel en app for betaling av regninger. Du trenger XNUMX % konsistens pÄ tvers av klyngen, sÄ du mÄ aktivere synkrone forpliktelser slik at databasen venter pÄ at alle endringer skal gjÞres. Men hvis sÞknaden din er et raskt voksende sosialt nettverk, vil du sannsynligvis foretrekke rask respons fremfor XNUMX % konsistens. For Ä oppnÄ dette kan du bruke asynkrone forpliktelser i klyngen din.

MĂžt kompromisser

Du mÄ gjÞre avveininger mellom datakonsistens og ytelse. PostgreSQL beveger seg bort fra konsistens fordi standardkonfigurasjonen da er forutsigbar og uten uventede overraskelser. La oss nÄ se pÄ kompromissene.

Avveining 1: Ytelse

Hvis PostgreSQL-klyngen ikke krever konsistens, kan den kjÞres asynkront. Skrivingen gjÞres til klyngelederen, og oppdateringer vil bli sendt til replikaene noen fÄ millisekunder senere. NÄr en PostgreSQL-klynge krever konsistens, mÄ den kjÞres synkront. Skrivingen vil bli gjort til klyngelederen, som vil sende en oppdatering til replikaene og vente pÄ bekreftelse pÄ at hver enkelt har skrevet fÞr du sender bekreftelse til klienten som startet skrivingen om at den var vellykket. Den praktiske forskjellen mellom disse tilnÊrmingene er at den asynkrone metoden krever to nettverkshopp, mens den synkrone metoden krever fire.

Avveining 2: Konsistens

Resultatet ved ledersvikt i disse to tilnÊrmingene vil ogsÄ vÊre forskjellig. Hvis arbeidet utfÞres asynkront, sÄ hvis en slik feil oppstÄr, vil ikke alle poster bli begÄtt av replikaene. Hvor mye vil gÄ tapt? Avhenger av selve applikasjonen og effektiviteten av replikering. Compose-replikering vil forhindre at en replika blir en leder hvis mengden informasjon i den er 1 MB mindre enn i lederen, det vil si at opptil 1 MB med poster potensielt kan gÄ tapt under asynkron drift.

Dette skjer ikke i synkron modus. Hvis lederen mislykkes, oppdateres alle replikaene, siden enhver skriving bekreftet pÄ lederen mÄ bekreftes pÄ replikaene. Dette er konsistens.

Synkron oppfÞrsel gir mening i en faktureringsapplikasjon der konsistens har en klar fordel i avveiningen mellom konsistens og ytelse. Det viktigste for en slik applikasjon er gyldige data. Tenk nÄ pÄ et sosialt nettverk der hovedoppgaven er Ä holde brukerens oppmerksomhet ved Ä svare pÄ forespÞrsler sÄ raskt som mulig. I dette tilfellet vil ytelse med fÊrre nettverkshopp og mindre ventetid pÄ forpliktelser vÊre en prioritet. Avveiningen mellom ytelse og konsistens er imidlertid ikke den eneste du mÄ tenke pÄ.

Avveining 3: Krasj

Det er veldig viktig Ä forstÄ hvordan en klynge oppfÞrer seg under en feil. Tenk pÄ en situasjon der en eller flere kopier mislykkes. NÄr commits behandles asynkront, vil lederen fortsette Ä fungere, det vil si akseptere og behandle skrivinger, uten Ä vente pÄ manglende replikaer. NÄr kopiene kommer tilbake til klyngen, tar de igjen lederen. Med synkron replikering, hvis replikaene ikke reagerer, vil lederen ikke ha noe valg og vil fortsette Ä vente pÄ bekreftelse av forpliktelsen til replikaen kommer tilbake til klyngen og kan godta og foreta skrivingen.

Én tilkobling per transaksjon?

Hver applikasjon trenger en annen type kombinasjon av konsistens og ytelse. Med mindre det selvfÞlgelig er vÄr regning-betalende app, som vi ser for oss Ä vÊre helt konsistent, eller vÄr nesten flyktige sosiale nettverksapp. I alle andre tilfeller vil det vÊre tider nÄr noen operasjoner mÄ vÊre synkrone og noen mÄ vÊre asynkrone. Du vil kanskje ikke at systemet skal vente til en melding som sendes til chatten er forpliktet, men hvis en betaling behandles i samme applikasjon, mÄ du vente.

Alle disse avgjĂžrelsene tas selvfĂžlgelig av applikasjonsutvikleren. Å ta de riktige avgjĂžrelsene om nĂ„r du skal bruke hver tilnĂŠrming vil hjelpe deg Ă„ fĂ„ mest mulig ut av klyngen din. Det er viktig at utvikleren kan bytte mellom dem pĂ„ SQL-nivĂ„ for tilkoblinger og for transaksjoner.

Sikre kontroll i praksis

Som standard gir PostgreSQL konsistens. Dette styres av serverparameteren synchronous_commit. Som standard er den i posisjon on, men den har tre andre alternativer: local, remote_write eller off.

NÄr du setter parameteren til off alle synkrone commits stoppes, selv pÄ det lokale systemet. Den lokale parameteren spesifiserer synkron modus for det lokale systemet, men skriving til replikaer utfÞres asynkront. Remote_write gÄr enda lenger: skriving til replikaer gjÞres asynkront, men returneres nÄr replikaen har akseptert skrivingen, men ikke har skrevet den til disk.

Ved Ă„ vurdere det tilgjengelige utvalget av alternativer, velger vi en atferd og huske pĂ„ det on – dette er synkrone opptak, vil vi velge local for asynkrone commits over nettverket, mens lokale commits skal vĂŠre synkrone.

NĂ„ skal vi fortelle deg hvordan du setter opp dette om et Ăžyeblikk, men forestill deg at vi setter opp synchronous_commit ĐČ local for serveren. Vi lurte pĂ„ om det var mulig Ă„ endre parameteren synchronous_commit pĂ„ farten, og det viste seg at det ikke bare er mulig, det er til og med to mĂ„ter Ă„ gjĂžre dette pĂ„. Den fĂžrste er Ă„ angi Ăžkten for tilkoblingen din som fĂžlger:

SET SESSION synchronous_commit TO ON;  
// Your writes go here

Alle pÄfÞlgende skrivinger i Þkten vil bekrefte skrivinger til replikaene fÞr de returnerer et positivt resultat til den tilkoblede klienten. Med mindre du endrer innstillingen synchronous_commit en gang til. Du kan utelate en del SESSION i kommandoen fordi den vil vÊre i standardverdien.

Den andre metoden er god nĂ„r du bare vil sĂžrge for at du fĂ„r synkron replikering for en enkelt transaksjon. I mange NoSQL-generasjonsdatabaser eksisterer ikke konseptet med transaksjoner, men det gjĂžr det i PostgreSQL. I dette tilfellet starter du en transaksjon og setter deretter synchronous_commit ĐČ on fĂžr du utfĂžrer oppfĂžringen for transaksjonen. COMMIT vil forplikte transaksjonen ved Ă„ bruke en hvilken som helst parameterverdi synchronous_commit, som ble satt pĂ„ den tiden, selv om det er best Ă„ sette variabelen pĂ„ forhĂ„nd for Ă„ sikre at andre utviklere forstĂ„r at skriving ikke er asynkron.

BEGIN;  
SET LOCAL synchronous_commit TO ON;  
// Your writes go here
COMMIT;  

Alle transaksjonsbekreftelser vil nÄ bli bekreftet som skrevet til replikaer fÞr databasen returnerer et positivt svar til den tilkoblede klienten.

Sette opp PostgreSQL

FÞr dette sÄ vi for oss et PostgreSQL-system med synchronous_commit, installert i local. For Ä gjÞre dette realistisk pÄ serversiden, mÄ du angi to serverkonfigurasjonsalternativer. En parameter til synchronous_standby_names vil komme til sin rett nÄr synchronous_commit vil vÊre i on. Den avgjÞr hvilke replikaer som er kvalifisert for synkrone forpliktelser, og vi vil sette den til *, som vil bety at alle kopier er involvert. Disse verdiene er vanligvis konfigurert i konfigurasjonsfil ved Ä legge til:

synchronous_commit = local  
synchronous_standby_names='*'

Ved Ă„ stille inn parameteren synchronous_commit til mening local, lager vi et system der lokale disker forblir synkrone, men nettverksreplika-commits er asynkrone som standard. Med mindre vi bestemmer oss for Ă„ gjĂžre disse forpliktelsene synkrone, som vist ovenfor.

Hvis du har fulgt utviklingen Sysselmannsprosjekt, du har kanskje lagt merke til noen nylige endringer (1, 2), som tillot Governor-brukere Ä teste disse parameterne og overvÄke konsistensen deres.

Noen flere ord...

For bare en uke siden ville jeg ha fortalt deg at det er umulig Ä finjustere PostgreSQL sÄ fint. Det var da Kurt, et medlem av Compose-plattformteamet, insisterte pÄ at en slik mulighet eksisterte. Han roet mine innvendinger og fant i PostgreSQL-dokumentasjonen fÞlgende:

PostgreSQL og tilkoblingsspesifikke skrivekonsistensinnstillinger

Denne innstillingen kan endres nÄr som helst. Atferden for enhver transaksjon bestemmes av innstillingen som er gjeldende pÄ tidspunktet for forpliktelsen. Derfor er det mulig og nyttig for noen transaksjoner Ä foreta synkront og for andre asynkront. For eksempel Ä tvinge en multistatement transaksjon for Ä foreta commits asynkront nÄr standardverdien til parameteren er motsatt, satt SET LOCAL synchronous_commit TO OFF i en transaksjon.

Med denne lille modifikasjonen av konfigurasjonsfilen ga vi brukerne kontroll over konsistensen og ytelsen deres.

Kilde: www.habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig webhotell med DDoS-beskyttelse, VPS VDS-servere | ProHoster