sql >> Database >  >> RDS >> PostgreSQL

Evolutie van fouttolerantie in PostgreSQL:synchrone commit

PostgreSQL is een geweldig project en het evolueert in een verbazingwekkend tempo. We zullen ons concentreren op de evolutie van fouttolerantiemogelijkheden in PostgreSQL in alle versies met een reeks blogposts. Dit is het vierde bericht van de serie en we zullen het hebben over synchrone commit en de effecten ervan op fouttolerantie en betrouwbaarheid van PostgreSQL.

Als je vanaf het begin getuige wilt zijn van de evolutie van de evolutie, bekijk dan de eerste drie blogposts van de serie hieronder. Elke post is onafhankelijk, dus je hoeft de ene niet te lezen om de andere te begrijpen.

  1. Evolutie van fouttolerantie in PostgreSQL 
  2. Evolutie van fouttolerantie in PostgreSQL:replicatiefase 
  3. Evolutie van fouttolerantie in PostgreSQL:tijdreizen

Synchroon commitment

PostgreSQL implementeert standaard asynchrone replicatie, waarbij gegevens worden gestreamd wanneer de server dit uitkomt. Dit kan leiden tot gegevensverlies bij een failover. Het is mogelijk om Postgres te vragen om een ​​(of meer) standbys te vereisen om de replicatie van de gegevens te bevestigen voorafgaand aan het vastleggen, dit wordt synchrone replicatie (synchrone vastlegging) genoemd. ) .

Bij synchrone replicatie wordt de replicatie direct heeft invloed op de verstreken tijd van transacties op de master. Met asynchrone replicatie kan de master op volle snelheid doorgaan.

Synchrone replicatie garandeert dat gegevens naar ten minste . worden geschreven twee knooppunten voordat de gebruiker of toepassing wordt verteld dat een transactie is uitgevoerd.

De gebruiker kan de vastleggingsmodus van elke transactie selecteren , zodat het mogelijk is om zowel synchrone als asynchrone commit-transacties gelijktijdig te laten lopen.

Dit maakt flexibele afwegingen mogelijk tussen prestaties en zekerheid van transactieduurzaamheid.

Synchroon vastleggen configureren

Voor het instellen van synchrone replicatie in Postgres moeten we synchronous_commit . configureren parameter in postgresql.conf.

De parameter geeft aan of de transactie-commit wacht tot WAL-records naar de schijf zijn geschreven voordat de opdracht een succes retourneert indicatie aan de opdrachtgever. Geldige waarden zijn aanremote_applyremote_write , lokaal , en uit . We zullen bespreken hoe dingen werken in termen van synchrone replicatie wanneer we synchronous_commit instellen parameter met elk van de gedefinieerde waarden.

Laten we beginnen met Postgres-documentatie (9.6):

Hier begrijpen we het concept van synchrone commit, zoals we beschreven in het inleidende gedeelte van de post, je bent vrij om synchrone replicatie in te stellen, maar als je dat niet doet, is er altijd een risico op gegevensverlies. Maar zonder risico op inconsistentie in de database, in tegenstelling tot het uitschakelen van fsync off - maar dat is een onderwerp voor een andere post -. Ten slotte concluderen we dat als we geen gegevens willen verliezen tussen replicatievertragingen en er zeker van willen zijn dat de gegevens naar ten minste twee knooppunten worden geschreven voordat de gebruiker/toepassing wordt geïnformeerd dat de transactie is gepleegd , we moeten accepteren dat er wat prestatieverlies is.

Laten we eens kijken hoe verschillende instellingen werken voor verschillende synchronisatieniveaus. Voordat we beginnen, laten we het hebben over hoe commit wordt verwerkt door PostgreSQL-replicatie. Client voert query's uit op het hoofdknooppunt, de wijzigingen worden geschreven naar een transactielogboek (WAL) en via het netwerk gekopieerd naar WAL op het stand-byknooppunt. Het herstelproces op het standby-knooppunt leest vervolgens de wijzigingen van WAL en past ze toe op de gegevensbestanden, net als tijdens crashherstel. Als de stand-by in hot stand-by staat modus kunnen clients alleen-lezen query's op het knooppunt uitvoeren terwijl dit gebeurt. Voor meer details over hoe replicatie werkt, kun je de replicatieblogpost in deze serie bekijken.

Fig.1 Hoe replicatie werkt

synchronous_commit =uit

Wanneer we sychronous_commit = off, de COMMIT wacht niet tot het transactierecord naar de schijf is gewist. Dit wordt gemarkeerd in Fig.2 hieronder.

Fig.2 synchronous_commit =uit

synchronous_commit =lokaal

Wanneer we synchronous_commit = local, de COMMIT wacht totdat het transactierecord naar de lokale schijf is gewist. Dit wordt gemarkeerd in Fig.3 hieronder.

Fig.3 synchronous_commit =local

synchronous_commit =aan (standaard)

Wanneer we synchronous_commit = on, de COMMIT zal wachten tot de server(s) gespecificeerd door sychronous_standby_names bevestigen dat het transactierecord veilig naar de schijf is geschreven. Dit wordt gemarkeerd in Fig.4 hieronder.

Opmerking: Wanneer sychronous_standby_names leeg is, gedraagt ​​deze instelling zich hetzelfde als synchronous_commit = local .

Fig.4 synchronous_commit =aan

synchronous_commit =remote_write

Wanneer we synchronous_commit = remote_write, de COMMIT zal wachten tot de server(s) gespecificeerd door sychronous_standby_names bevestig het schrijven van het transactierecord naar het besturingssysteem, maar heeft de schijf niet noodzakelijkerwijs bereikt. Dit wordt gemarkeerd in Fig.5 hieronder.

Fig.5 synchronous_commit =remote_write

synchronous_commit =remote_apply

Wanneer we synchronous_commit = remote_apply, de COMMIT zal wachten tot de server(s) gespecificeerd door sychronous_standby_names bevestig dat het transactierecord is toegepast op de database. Dit wordt gemarkeerd in Fig.6 hieronder.

Fig.6 synchronous_commit =remote_apply

Laten we nu eens kijken naar sychronous_standby_names parameter in details, waarnaar hierboven wordt verwezen bij het instellen van synchronous_commit als onremote_apply of remote_write .

synchronous_standby_names =‘standby_name [, …]’

De synchrone commit wacht op antwoord van een van de standbys die in de volgorde van prioriteit worden vermeld. Dit betekent dat als de eerste standby is aangesloten en streamt, de synchrone commit altijd zal wachten op een antwoord, zelfs als de tweede standby al heeft geantwoord. De speciale waarde van  * kan worden gebruikt als stanby_name die overeenkomt met elke aangesloten stand-by.

synchronous_standby_names ='num (standby_name [, …])'

De synchrone commit wacht op antwoord van ten minste num aantal standbys in volgorde van prioriteit. Dezelfde regels als hierboven zijn van toepassing. Dus bijvoorbeeld het instellen van synchronous_standby_names = '2 (*)' zal synchrone commit laten wachten op antwoord van 2 willekeurige standby-servers.

synchronous_standby_names is leeg

Als deze parameter leeg is, zoals weergegeven, verandert het gedrag van de instelling synchronous_commit naar on , remote_write of remote_apply hetzelfde gedragen als local (dwz de COMMIT wacht alleen op het doorspoelen naar de lokale schijf).

Conclusie

In deze blogpost hebben we synchrone replicatie besproken en verschillende beveiligingsniveaus beschreven die beschikbaar zijn in Postgres. We gaan verder met logische replicatie in de volgende blogpost.

Referenties

Speciale dank aan mijn collega Petr Jelinek voor het idee voor illustraties.

PostgreSQL-documentatie
PostgreSQL 9 Administration Cookbook – Tweede editie


  1. SET NULL:geef een tekenreeks op die moet worden geretourneerd wanneer een null-waarde voorkomt in SQLcl / SQL*Plus

  2. DBMS-zelfstudie:een complete spoedcursus over DBMS

  3. ORA-00933:SQL-opdracht niet correct beëindigd

  4. Een weergave maken met de ORDER BY-component