Slik konfigurerer du PostgreSQL 12 Streaming Replication i CentOS 8


PostgreSQL-databasen støtter flere replikeringsløsninger for å bygge høytilgjengelige, skalerbare, feiltolerante applikasjoner, hvorav en er Write-Ahead Log (WAL) Shipping. Denne løsningen gjør det mulig å implementere en standby-server ved å bruke filbasert loggforsendelse eller streaming-replikering, eller der det er mulig, en kombinasjon av begge tilnærmingene.

Med streaming-replikering er en standby-databaseserver (replikeringsslave) konfigurert til å koble til hoved-/primærserveren, som streamer WAL-poster til standby-en etter hvert som de genereres, uten å vente på at WAL-filen skal fylles ut.

Som standard er streaming-replikering asynkron der data skrives til standby-serveren(e) etter at en transaksjon har blitt utført på primærserveren. Dette betyr at det er en liten forsinkelse mellom å utføre en transaksjon i hovedserveren og endringene blir synlige i standbyserveren. En ulempe med denne tilnærmingen er at i tilfelle hovedserveren krasjer, kan det hende at eventuelle uforpliktede transaksjoner ikke replikeres, og dette kan føre til tap av data.

Denne guiden viser hvordan du setter opp en Postgresql 12 master-standby streaming-replikering på CentOS 8. Vi vil bruke \replikeringsspor» for standbyen som en løsning for å unngå at masterserveren resirkulerer gamle WAL-segmenter før standbyen har mottatt dem.

Legg merke til at sammenlignet med andre metoder, beholder replikeringsspor bare antallet segmenter som er kjent for å være nødvendige.

Denne veiledningen forutsetter at du er koblet til master- og standby-databaseservere som root via SSH (bruk Sudo-kommando der det er nødvendig hvis du er tilkoblet som en vanlig bruker med administrative rettigheter):

Postgresql master database server: 		10.20.20.9
Postgresql standby database server:		10.20.20.8

Begge databaseserverne må ha Postgresql 12 installert, ellers se: Hvordan installere PostgreSQL og pgAdmin i CentOS 8.

Merk: PostgreSQL 12 kommer med store endringer i replikeringsimplementering og konfigurasjon, som erstatning av recovery.conf og konvertering av recovery.conf-parametere til normale PostgreSQL-konfigurasjonsparametere, noe som gjør det mye enklere å konfigurere klyngreplisering.

Trinn 1: Konfigurere PostgreSQL Master/Primary Database Server

1. Bytt til postgres-systemkontoen på hovedserveren og konfigurer IP-adressen(e) som hovedserveren vil lytte til for tilkoblinger fra klienter.

I dette tilfellet vil vi bruke * som betyr alt.

# su - postgres
$ psql -c "ALTER SYSTEM SET listen_addresses TO '*';"

ALTER SYSTEM SET SQL-kommandoen er en kraftig funksjon for å endre en servers konfigurasjonsparametere, direkte med en SQL-spørring. Konfigurasjonene lagres i postgresql.conf.auto-filen som ligger i roten av datamappen (f.eks. /var/lib/pgsql/12/data/) og leses i tillegg til de som er lagret i postgresql.conf. Men konfigurasjoner i førstnevnte har forrang over de i senere og andre relaterte filer.

2. Lag deretter en replikeringsrolle som skal brukes for tilkoblinger fra standby-serveren til hovedserveren, ved å bruke createuser-programmet. I den følgende kommandoen ber -P-flagget om et passord for den nye rollen og -e ekko kommandoene som createuser genererer og sender til databaseserveren.

# su – postgres
$ createuser --replication -P -e replicator
$ exit

3. Skriv deretter inn følgende oppføring på slutten av /var/lib/pgsql/12/data/pg_hba.conf klientautentiseringskonfigurasjonsfilen med databasefeltet satt til replikering som vist på skjermbildet.

host    replication     replicator      10.20.20.8/24     md5

4. Start nå Postgres12-tjenesten på nytt ved å bruke følgende systemctl-kommando for å bruke endringene.

# systemctl restart postgresql-12.service

5. Deretter, hvis du kjører brannmurtjenesten, må du legge til Postgresql-tjenesten i brannmurkonfigurasjonen for å tillate forespørsler fra standby-serveren til masteren.

# firewall-cmd --add-service=postgresql --permanent
# firewall-cmd --reload

Trinn 2: Lage en base-sikkerhetskopi for å bootstrap standby-serveren

6. Deretter må du lage en grunnleggende sikkerhetskopi av hovedserveren fra standby-serveren; dette hjelper til med å starte opp standby-serveren. Du må stoppe postgresql 12-tjenesten på standby-serveren, bytte til postgres-brukerkontoen, sikkerhetskopiere datakatalogen (/var/lib/pgsql/12/data/), deretter slette alt under den som vist før du tar basen backup.

# systemctl stop postgresql-12.service
# su - postgres
$ cp -R /var/lib/pgsql/12/data /var/lib/pgsql/12/data_orig
$ rm -rf /var/lib/pgsql/12/data/*

7. Bruk deretter pg_basebackup-verktøyet til å ta grunnsikkerhetskopien med riktig eierskap (databasesystembrukeren, dvs. Postgres, innenfor Postgres-brukerkontoen) og med de riktige tillatelsene.

I følgende kommando, alternativet:

  • -h – spesifiserer verten som er hovedserveren.
  • -D – spesifiserer datakatalogen.
  • -U – spesifiserer tilkoblingsbrukeren.
  • -P – aktiverer fremdriftsrapportering.
  • -v – aktiverer detaljert modus.
  • -R – muliggjør opprettelse av gjenopprettingskonfigurasjon: Oppretter en standby.signal-fil og legger til tilkoblingsinnstillinger til postgresql.auto.conf under datakatalogen.
  • -X – brukes til å inkludere de nødvendige fremskrivningsloggfilene (WAL-filer) i sikkerhetskopien. En verdi av strøm betyr å streame WAL mens sikkerhetskopien opprettes.
  • -C – gjør det mulig å opprette et replikeringsspor navngitt av alternativet -S før du starter sikkerhetskopieringen.
  • -S – spesifiserer replikeringsspornavnet.

$ pg_basebackup -h 10.20.20.9 -D /var/lib/pgsql/12/data -U replicator -P -v  -R -X stream -C -S pgstandby1
$ exit

8. Når sikkerhetskopieringsprosessen er ferdig, skal den nye datakatalogen på standby-serveren se slik ut på skjermbildet. Et standby.signal opprettes og tilkoblingsinnstillingene legges til postgresql.auto.conf. Du kan liste innholdet ved å bruke ls-kommandoen.

# ls -l /var/lib/pgsql/12/data/

En replikeringsslave vil kjøre i \Hot Standby-modus hvis hot_standby-parameteren er satt til på (standardverdien) i postgresql.conf og det er en standby.signal-fil i datakatalogen.

9. Nå tilbake på hovedserveren, bør du kunne se replikeringssporet kalt pgstandby1 når du åpner pg_replication_slots-visningen som følger.

# su - postgres
$ psql -c "SELECT * FROM pg_replication_slots;"
$ exit

10. For å se tilkoblingsinnstillingene som er lagt til i postgresql.auto.conf-filen, bruk cat-kommandoen.

# cat /var/lib/pgsql/12/data/postgresql.auto.conf

11. Begynn nå normale databaseoperasjoner på standby-serveren ved å starte PostgreSQL-tjenesten som følger.

# systemctl start postgresql-12

Trinn 3: Testing av PostgreSQL-streamingreplikering

12. Så snart en forbindelse er opprettet mellom master og standby, vil du se en WAL-mottakerprosess i standby-serveren med status for streaming, du kan sjekke dette ved å bruke pg_stat_wal_receiver-visningen.

$ psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"

og en tilsvarende WAL-avsenderprosess i hoved-/primærserveren med en status for streaming og en sync_state of async, kan du sjekke denne pg_stat_replication pg_stat_replikeringsvisningen.

$ psql -c "\x" -c "SELECT * FROM pg_stat_replication;"

Fra skjermbildet ovenfor er streaming-replikasjonen asynkron. I neste avsnitt vil vi demonstrere hvordan du eventuelt aktiverer synkron replikering.

13. Test nå om replikeringen fungerer bra ved å opprette en testdatabase i hovedserveren og sjekk om den finnes i standbyserveren.
[master]postgres=# LAG DATABASE tecmint;
[standby]postgres=# \l

Valgfritt: Aktivering av synkron replikering

14. Synkron replikering tilbyr muligheten til å forplikte en transaksjon (eller skrive data) til primærdatabasen og standby/replika samtidig. Den bekrefter bare at en transaksjon er vellykket når alle endringer som er gjort av transaksjonen er overført til en eller flere synkrone standby-servere.

For å aktivere synkron replikering, må synchronous_commit også settes til on (som er standardverdien, og dermed ikke behov for noen endring), og du må også sette parameteren synchronous_standby_names til en ikke-tom verdi. For denne veiledningen vil vi sette den til alle.

$ psql -c "ALTER SYSTEM SET synchronous_standby_names TO  '*';"

15. Last deretter inn PostgreSQL 12-tjenesten på nytt for å bruke de nye endringene.

# systemctl reload postgresql-12.service

16. Nå når du spør etter WAL-avsenderprosessen på primærserveren en gang til, skal den vise en status for streaming og en sync_state of sync.

$ psql -c "\x" -c "SELECT * FROM pg_stat_replication;"

Vi har kommet til slutten av denne veiledningen. Vi har vist hvordan du setter opp PostgreSQL 12 master-standby databasestrømmingreplikering i CentOS 8. Vi dekket også hvordan du aktiverer synkron replikering i en PostgreSQL databaseklynge.

Det er mange bruksområder for replikering, og du kan alltid velge en løsning som oppfyller ditt IT-miljø og/eller applikasjonsspesifikke krav. For mer detaljer, gå til Log-Shipping Standby Servers i PostgreSQL 12-dokumentasjonen.