Com configurar PostgreSQL 12 Streaming Replication a CentOS 8


La base de dades PostgreSQL admet diverses solucions de replicació per crear aplicacions d'alta disponibilitat, escalables i tolerants a errors, una de les quals és l'enviament de registres d'escriptura anticipada (WAL). Aquesta solució permet implementar un servidor d'espera mitjançant l'enviament de registres basat en fitxers o la replicació en temps real, o quan sigui possible, una combinació d'ambdós enfocaments.

Amb la replicació en continu, es configura un servidor de bases de dades en espera (esclau de replicació) per connectar-se al servidor principal/primari, que transmet els registres WAL a l'espera a mesura que es generen, sense esperar que s'ompli el fitxer WAL.

De manera predeterminada, la replicació en temps real és asíncrona on les dades s'escriuen als servidors en espera després que s'hagi confirmat una transacció al servidor principal. Això vol dir que hi ha un petit retard entre la confirmació d'una transacció al servidor mestre i els canvis que es fan visibles al servidor en espera. Un dels inconvenients d'aquest enfocament és que, en cas que el servidor mestre es bloqueja, és possible que les transaccions no compromeses no es puguin replicar i això pot provocar la pèrdua de dades.

Aquesta guia mostra com configurar una rèplica de transmissió en espera mestre de Postgresql 12 a CentOS 8. Utilitzarem \ranures de replicació per a l'espera com a solució per evitar que el servidor mestre recicli els segments WAL antics abans que els hagi rebut l'espera.

Tingueu en compte que, en comparació amb altres mètodes, les ranures de rèplica només conserven el nombre de segments que se sap que són necessaris.

Aquesta guia suposa que us heu connectat als vostres servidors de base de dades mestre i en espera com a root mitjançant SSH (utilitzeu l'ordre Sudo quan sigui necessari si esteu connectat com a usuari normal amb drets d'administrador):

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

Els dos servidors de bases de dades han de tenir instal·lat Postgresql 12, en cas contrari, vegeu: Com instal·lar PostgreSQL i pgAdmin a CentOS 8.

Nota: PostgreSQL 12 inclou canvis importants a la implementació i configuració de la rèplica, com ara la substitució de recovery.conf i la conversió dels paràmetres de recovery.conf a paràmetres de configuració normals de PostgreSQL, cosa que fa que sigui molt més fàcil configurar la rèplica del clúster.

Pas 1: Configuració del servidor principal/principal de bases de dades PostgreSQL

1. Al servidor mestre, canvieu al compte del sistema de postgres i configureu les adreces IP en què el servidor mestre escoltarà les connexions dels clients.

En aquest cas, utilitzarem * que significa tot.

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

L'ordre ALTER SYSTEM SET SQL és una característica potent per canviar els paràmetres de configuració d'un servidor, directament amb una consulta SQL. Les configuracions es guarden al fitxer postgresql.conf.auto situat a l'arrel de la carpeta de dades (p. ex. /var/lib/pgsql/12/data/) i es llegeixen a més de les emmagatzemades a postgresql.conf. Però les configuracions del primer tenen prioritat sobre les del posterior i altres fitxers relacionats.

2. A continuació, creeu una funció de rèplica que s'utilitzarà per a les connexions des del servidor d'espera al servidor mestre mitjançant el programa createuser. A l'ordre següent, el senyalador -P demana una contrasenya per a la nova funció i -e fa ressò de les ordres que createuser genera i envia al servidor de bases de dades.

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

3. A continuació, introduïu l'entrada següent al final del fitxer de configuració d'autenticació del client /var/lib/pgsql/12/data/pg_hba.conf amb el camp de la base de dades configurat com a rèplica tal com es mostra a la captura de pantalla.

host    replication     replicator      10.20.20.8/24     md5

4. Ara reinicieu el servei Postgres12 utilitzant l'ordre systemctl següent per aplicar els canvis.

# systemctl restart postgresql-12.service

5. A continuació, si teniu el servei tallafocs en execució, heu d'afegir el servei Postgresql a la configuració del tallafocs per permetre les sol·licituds del servidor d'espera al mestre.

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

Pas 2: fer una còpia de seguretat base per arrencar el servidor d'espera

6. A continuació, heu de fer una còpia de seguretat bàsica del servidor mestre des del servidor d'espera; això ajuda a arrencar el servidor d'espera. Heu d'aturar el servei postgresql 12 al servidor d'espera, canviar al compte d'usuari de postgres, fer una còpia de seguretat del directori de dades (/var/lib/pgsql/12/data/), després suprimir tot el que hi ha a sota tal com es mostra, abans de prendre la base. còpia de seguretat.

# 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. A continuació, utilitzeu l'eina pg_basebackup per fer la còpia de seguretat base amb la propietat correcta (l'usuari del sistema de base de dades, és a dir, Postgres, dins del compte d'usuari de Postgres) i amb els permisos adequats.

A l'ordre següent, l'opció:

  • -h: especifica l'amfitrió que és el servidor mestre.
  • -D: especifica el directori de dades.
  • -U: especifica l'usuari de connexió.
  • -P: activa els informes de progrés.
  • -v: activa el mode detallat.
  • -R: permet crear una configuració de recuperació: crea un fitxer standby.signal i afegeix la configuració de connexió a postgresql.auto.conf al directori de dades.
  • -X: s'utilitza per incloure els fitxers de registre d'escriptura anticipada (fitxers WAL) necessaris a la còpia de seguretat. Un valor de stream significa transmetre el WAL mentre es crea la còpia de seguretat.
  • -C: permet la creació d'una ranura de rèplica anomenada per l'opció -S abans d'iniciar la còpia de seguretat.
  • -S: especifica el nom de l'espai de rèplica.

$ 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. Quan s'hagi acabat el procés de còpia de seguretat, el nou directori de dades del servidor en espera hauria de semblar a la captura de pantalla. Es crea un standby.signal i la configuració de connexió s'afegeix a postgresql.auto.conf. Podeu llistar el seu contingut mitjançant l'ordre ls.

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

Un esclau de rèplica s'executarà en mode \Hot Standby si el paràmetre hot_standby està activat (el valor predeterminat) a postgresql.conf i hi ha un fitxer standby.signal present al directori de dades.

9. Ara de nou al servidor mestre, hauríeu de poder veure la ranura de rèplica anomenada pgstandby1 quan obriu la vista pg_replication_slots de la manera següent.

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

10. Per veure la configuració de connexió afegida al fitxer postgresql.auto.conf, utilitzeu l'ordre cat.

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

11. Ara comenceu les operacions normals de la base de dades al servidor d'espera iniciant el servei PostgreSQL de la manera següent.

# systemctl start postgresql-12

Pas 3: prova de la replicació de flux de PostgreSQL

12. Un cop s'estableixi correctament la connexió entre el mestre i l'espera, veureu un procés de receptor WAL al servidor d'espera amb un estat de transmissió, podeu comprovar-ho mitjançant la vista pg_stat_wal_receiver.

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

i un procés d'emissor WAL corresponent al servidor principal/primari amb un estat de transmissió i un estat de sincronització d'async, podeu comprovar aquesta visualització pg_stat_replication pg_stat_replication.

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

A partir de la captura de pantalla anterior, la replicació en streaming és asíncrona. A la següent secció, demostrarem com activar opcionalment la replicació síncrona.

13. Ara comproveu si la rèplica funciona bé creant una base de dades de prova al servidor mestre i comproveu si existeix al servidor en espera.
[master]postgres=# CREAR BASE DE DADES tecmint;
[standby]postgres=# \l

Opcional: activació de la replicació síncrona

14. La replicació síncrona ofereix la possibilitat de confirmar una transacció (o escriure dades) a la base de dades primària i a la rèplica/espera simultàniament. Només confirma que una transacció té èxit quan tots els canvis fets per la transacció s'han transferit a un o més servidors en espera síncrons.

Per habilitar la replicació síncrona, synchronous_commit també s'ha d'activar (que és el valor predeterminat, per tant, no cal fer cap canvi) i també cal que el paràmetre synchronous_standby_names sigui un valor no buit. Per a aquesta guia, la configurarem per a tots.

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

15. A continuació, torneu a carregar el servei PostgreSQL 12 per aplicar els nous canvis.

# systemctl reload postgresql-12.service

16. Ara, quan consulteu el procés del remitent WAL al servidor principal una vegada més, hauria de mostrar un estat de transmissió i un estat_sincronització de sincronització.

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

Hem arribat al final d'aquesta guia. Hem mostrat com configurar la rèplica de transmissió de bases de dades en espera mestra de PostgreSQL 12 a CentOS 8. També vam explicar com habilitar la replicació síncrona en un clúster de bases de dades PostgreSQL.

Hi ha molts usos de la rèplica i sempre podeu triar una solució que compleixi el vostre entorn informàtic i/o els requisits específics de l'aplicació. Per obtenir més detalls, aneu a Servidors d'espera d'enviament de registres a la documentació de PostgreSQL 12.