Hoe PostgreSQL 12 Streaming-replicatie in CentOS 8 te configureren


De PostgreSQL-database ondersteunt verschillende replicatieoplossingen om schaalbare, fouttolerante toepassingen met hoge beschikbaarheid te bouwen, waaronder Write-Ahead Log (WAL) Shipping. Met deze oplossing kan een stand-by-server worden geïmplementeerd met behulp van op bestanden gebaseerde verzending van logboeken of streamingreplicatie, of waar mogelijk een combinatie van beide benaderingen.

Met streamingreplicatie wordt een standby-databaseserver (replicatieslaaf) geconfigureerd om verbinding te maken met de master/primaire server, die WAL-records naar de standby-server streamt terwijl ze worden gegenereerd, zonder te wachten tot het WAL-bestand is gevuld.

Standaard is streamingreplicatie asynchroon waarbij gegevens naar de stand-by server (s) worden geschreven nadat een transactie is vastgelegd op de primaire server. Dit betekent dat er een kleine vertraging zit tussen het plegen van een transactie in de masterserver en het zichtbaar worden van de wijzigingen in de standby-server. Een nadeel van deze aanpak is dat in het geval dat de masterserver crasht, eventuele niet-gecommitteerde transacties mogelijk niet worden gerepliceerd en dit kan leiden tot gegevensverlies.

Deze gids laat zien hoe je een Postgresql 12 master-standby streaming-replicatie op CentOS 8 instelt. We zullen “replicatieslots” voor de standby gebruiken als een oplossing om te voorkomen dat de masterserver oude WAL-segmenten recyclet voordat de standby ze heeft ontvangen.

Merk op dat in vergelijking met andere methoden replicatieslots alleen het aantal segmenten behouden waarvan bekend is dat ze nodig zijn.

Deze handleiding gaat ervan uit dat u verbonden bent met uw master- en standby-databaseservers als de root via SSH (gebruik het Sudo-commando waar nodig als u verbonden bent als een normale gebruiker met beheerdersrechten):

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

Op beide databaseservers moet Postgresql 12 zijn geïnstalleerd, zie anders: PostgreSQL en pgAdmin installeren in CentOS 8.

Opmerking: PostgreSQL 12 wordt geleverd met belangrijke wijzigingen in de implementatie en configuratie van replicatie, zoals vervanging van recovery.conf en de conversie van recovery.conf-parameters naar normale PostgreSQL-configuratieparameters, waardoor het veel eenvoudiger wordt om clusterreplicatie te configureren.

Stap 1: Configuratie van de PostgreSQL-hoofd- / primaire databaseserver

1. Schakel op de masterserver over naar het postgres-systeemaccount en configureer het IP-adres (sen) waarop de masterserver luistert naar verbindingen van clients.

In dit geval gebruiken we * , wat alles betekent.

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

De ALTER SYSTEM SET SQL-opdracht is een krachtige functie om de configuratieparameters van een server rechtstreeks met een SQL-query te wijzigen. De configuraties worden opgeslagen in het bestand postgresql.conf.auto dat zich in de root van de datamap bevindt (bijv./Var/lib/pgsql/12/data /) en worden gelezen naast de configuraties die zijn opgeslagen in postgresql.conf. Maar configuraties in de eerste hebben voorrang op die in de latere en andere gerelateerde bestanden.

2. Maak vervolgens een replicatierol die zal worden gebruikt voor verbindingen van de stand-by-server naar de masterserver, met behulp van het createuser-programma. In de volgende opdracht vraagt u200bu200bde vlag -P om een u200bu200bwachtwoord voor de nieuwe rol en geeft -e de opdrachten weer die createuser genereert en naar de databaseserver verzendt.

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

3. Voer vervolgens de volgende invoer in aan het einde van het /var/lib/pgsql/12/data/pg_hba.conf configuratiebestand voor clientauthenticatie met het databaseveld ingesteld op replicatie, zoals weergegeven in de schermafbeelding.

host    replication     replicator      10.20.20.8/24     md5

4. Start nu de Postgres12-service opnieuw met de volgende systemctl-opdracht om de wijzigingen toe te passen.

# systemctl restart postgresql-12.service

5. Vervolgens, als je de firewalld-service hebt uitgevoerd, moet je de Postgresql-service toevoegen aan de firewalld-configuratie om verzoeken van de standby-server naar de master toe te staan.

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

Stap 2: Een basisback-up maken om de standby-server op te starten

6. Vervolgens moet u een basisback-up maken van de masterserver vanaf de standby-server; dit helpt bij het opstarten van de stand-by server. U moet de postgresql 12-service op de standby-server stoppen, overschakelen naar het postgres-gebruikersaccount, een back-up maken van de gegevensdirectory (/ var/lib/pgsql/12/data /), en alles eronder verwijderen zoals weergegeven, voordat u de back-up.

# 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. Gebruik vervolgens de tool pg_basebackup om de basisback-up te maken met het juiste eigendom (de databasesysteemgebruiker, d.w.z. Postgres, binnen het Postgres-gebruikersaccount) en met de juiste machtigingen.

In de volgende opdracht, de optie:

  • -h – specifies the host which is the master server.
  • -D – specifies the data directory.
  • -U – specifies the connection user.
  • -P – enables progress reporting.
  • -v – enables verbose mode.
  • -R – enables the creation of recovery configuration: Creates a standby.signal file and append connection settings to postgresql.auto.conf under the data directory.
  • -X – used to include the required write-ahead log files (WAL files) in the backup. A value of stream means to stream the WAL while the backup is created.
  • -C – enables the creation of a replication slot named by the -S option before starting the backup.
  • -S – specifies the replication slot name.
$ 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. Wanneer het back-upproces is voltooid, zou de nieuwe gegevensdirectory op de stand-by-server er zo uit moeten zien in de schermafbeelding. Er wordt een standby.signaal gemaakt en de verbindingsinstellingen worden toegevoegd aan postgresql.auto.conf. U kunt de inhoud weergeven met de opdracht ls.

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

Een replicatieslaaf zal in “Hot Standby” -modus draaien als de hot_standby-parameter is ingesteld op on (de standaardwaarde) in postgresql.conf en er een standby.signal-bestand aanwezig is in de data-directory.

9. Nu terug op de masterserver, zou u het replicatieslot met de naam pgstandby1 moeten kunnen zien wanneer u de weergave pg_replication_slots als volgt opent.

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

10. Gebruik de opdracht cat om de verbindingsinstellingen die zijn toegevoegd aan het bestand postgresql.auto.conf te bekijken.

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

11. Start nu de normale databasebewerkingen op de standby-server door de PostgreSQL-service als volgt te starten.

# systemctl start postgresql-12

Stap 3: PostgreSQL-streamingreplicatie testen

12. Zodra een verbinding tot stand is gebracht tussen de master en de stand-by, ziet u een WAL-ontvangerproces op de stand-byserver met de status streaming. U kunt dit controleren met de weergave pg_stat_wal_receiver.

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

en een bijbehorend WAL-afzenderproces in de master/primaire server met een status van streaming en een sync_state van async, kunt u deze weergave pg_stat_replication pg_stat_replication bekijken.

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

Uit de bovenstaande schermafbeelding is de streamingreplicatie asynchroon. In de volgende sectie laten we zien hoe u optioneel synchrone replicatie inschakelt.

[standby] postgres u003d # \ l

Optioneel: synchrone replicatie inschakelen

14. Synchrone replicatie biedt de mogelijkheid om een u200bu200btransactie (of het schrijven van gegevens) tegelijkertijd naar de primaire database en de stand-by/replica vast te leggen. Het bevestigt alleen dat een transactie succesvol is als alle wijzigingen die door de transactie zijn aangebracht, zijn overgedragen naar een of meer synchrone stand-byservers.

Om synchrone replicatie mogelijk te maken, moet de synchrone_commit ook zijn ingesteld op on (wat de standaardwaarde is, dus geen wijziging nodig) en moet u ook de parameter synchrone_standby_names instellen op een niet-lege waarde. Voor deze gids zullen we alles op alles zetten.

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

15. Laad vervolgens de PostgreSQL 12-service opnieuw om de nieuwe wijzigingen toe te passen.

# systemctl reload postgresql-12.service

16. Wanneer u nu het WAL-afzenderproces nogmaals op de primaire server opvraagt, zou het een status van streaming en een sync_state van sync moeten tonen.

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

We zijn aan het einde van deze gids gekomen. We hebben laten zien hoe PostgreSQL 12 master-standby-databasestreamingreplicatie in CentOS 8 kan worden opgezet. We hebben ook besproken hoe je synchrone replicatie in een PostgreSQL-databasecluster kunt inschakelen.

Er zijn veel toepassingen van replicatie en u kunt altijd een oplossing kiezen die voldoet aan uw IT-omgeving en/of applicatiespecifieke vereisten. Ga voor meer informatie naar Log-Shipping Standby Servers in de PostgreSQL 12-documentatie.