Back-ups zijn het vitale en belangrijke onderdeel van elk rampherstelplan, het maken van back-ups van de productiedatabase is ook een basis en een belangrijk onderdeel van PostgreSQL-beheer. DBA's valideren echter niet vaak dat die back-ups betrouwbaar zijn.
Elke organisatie maakt back-ups van PostgreSQL-databases in een andere vorm, sommige kunnen een (fysieke) back-up van het bestandssysteem maken van de PostgreSQL-gegevensmappen (met tools zoals Barman, PGBackRest), terwijl andere alleen logische back-ups maken (met behulp van pg_dump), en zelfs anderen kunnen snapshots op blokniveau maken met behulp van tools zoals EBS of VMWare snapshot.
In deze blog laten we u zien hoe u uw PostgreSQL-back-up valideert door de back-up terug te zetten naar een Docker-container met behulp van de tool pgBackRest voor het maken en terugzetten van de back-up. We gaan ervan uit dat je al kennis hebt van het gebruik van PostgreSQL, Docker en pgBackRest.
Waarom zou je Docker gebruiken?
Docker maakt automatisering eenvoudiger en vergemakkelijkt ook de integratie van onze PostgreSQL-back-upvalidatietaak in CI/CD-tools zoals CircleCI, Travis, GitLab of Jenkins. Het gebruik van Docker vermijdt de tijd en middelen die we moeten besteden aan het opzetten van de nieuwe omgeving voor het testen van de back-up.
Demo instellen
Host
Rol
Geïnstalleerd
Pakketten
Crontab
node-1 192.168.0.111
CentOS-7
Posgresql-11 primaire instantie.
Gebruiker en database "pgbench" gemaakt en geïnitialiseerd met pgbench-tabellen.
postgresql-11, pgbackrest-2.15
Pgbench elke 5 minuten uitvoeren om de werkbelasting te simuleren.
node-2
192.168.0.112
CentOS-7
Testmachine - we zullen onze Docker-validatie op deze host uitvoeren.
docker-ce-18.06, pgbackrest-2.15
knooppunt-3
192.168.0.113
CentOS-7
pgBackRest-opslagplaatshost
pgbackrest-2.15
Pgbackrest wordt uitgevoerd om elke 4 uur een Incr-back-up te maken
Diff back-up elke dag
Wekelijkse volledige back-up
Om pgbackrest te laten werken, heb ik wachtwoordloze SSH-toegang tussen deze nodes ingesteld.
Gebruiker “postgres” op node-1 en node-2 kan wachtwoordloos inloggen op gebruiker “pgbackrest” op node-3.
[[email protected] ~]$ sudo -u postgres ssh [email protected] uptime
13:31:51 up 7:00, 1 user, load average: 0.00, 0.01, 0.05
[[email protected] ~]$ sudo -u postgres ssh [email protected] uptime
13:31:27 up 7:00, 1 user, load average: 0.00, 0.01, 0.05
Gebruiker “pgbackrest” op node-3 kan wachtwoordloos inloggen op gebruiker “postgres” op node-1 en node-2.
[[email protected] ~]$ sudo -u pgbackrest ssh [email protected] uptime
13:32:29 up 7:02, 1 user, load average: 1.18, 0.83, 0.58
[[email protected] ~]$ sudo -u pgbackrest ssh [email protected] uptime
13:32:33 up 7:01, 1 user, load average: 0.00, 0.01, 0.05
Overzicht van back-upvalidatie
Hieronder vindt u een kort overzicht van de stappen die we zullen volgen voor onze PostgreSQL-back-upvalidatie.
- Met behulp van de pgbackrest restore-opdracht halen we de laatste back-up op van de pgBackRest Repository Host (node-3) naar de Test Machine (node-2) directory /var/lib/pgsql/11/data
- Tijdens het uitvoeren van de docker koppelen we de hostmachine (node-2) directory /var/lib/pgsql aan de docker-container en starten we de postgres/postmaster-daemon vanuit de gekoppelde directory. We zouden ook poort 5432 van container naar hostmachine poort 15432 blootleggen.
- Zodra de docker-container is gestart, maken we verbinding met de PostgreSQL-database via node-2:15432 en controleren we of alle tabellen en rijen zijn hersteld. We zouden ook de PostgreSQL-logboeken controleren om er zeker van te zijn dat er geen FOUT-bericht is tijdens het herstel en dat de instantie ook de consistente status heeft bereikt.
De meeste stappen voor back-upvalidatie worden uitgevoerd op hostnode-2.
De Docker-afbeelding bouwen
Maak op node-2 Dockerfile en bouw de docker-image "postgresql:11". In het onderstaande Docker-bestand passen we de volgende wijzigingen toe op de centos:7-basisafbeelding.
- Postgresql-11, pgbackrest en openssh-clients installeren. Openssh-clients zijn nodig voor pgbackrest.
- Pgbackrest configureren - We hebben de pgbackrest-configuratie in de afbeelding nodig om PITR te testen, zonder dat de configuratie van de pgbackrest restore_command zou mislukken. Als onderdeel van de pgbackrest-configuratie
- We voegen de pgbackrest repository host ip (192.168.0.113) toe aan het configuratiebestand /etc/pgbackrest.conf.
- We hebben ook SSH-toegang zonder wachtwoord nodig tussen de docker-container en de pgbackrest-repositoryhost. Hiervoor kopieer ik SSH_PRIVATE_KEY die ik al heb gegenereerd en ik heb ook de openbare sleutel toegevoegd aan de pgbackrest-repositoryhost ([email protected]).
- VOLUME ["${PGHOME_DIR}"] - Definieert de containerdirectory /var/lib/pgsql als een koppelpunt. Tijdens het uitvoeren van het docker run-commando zullen we node-2 host-directory specificeren naar dit koppelpunt.
- USER postgres - Elke opdracht die op de container wordt uitgevoerd, wordt uitgevoerd als een postgres-gebruiker.
$ cat Dockerfile
FROM centos:7
ARG PGBACKREST_REPO_HOST
ARG PGHOME_DIR=/var/lib/pgsql
## Adding Postgresql Repo for CentOS7
RUN yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
## Installing PostgreSQL
RUN yum -y install postgresql11 postgresql11-server postgresql11-devel postgresql11-contrib postgresql11-libs pgbackrest openssh-clients
## Adding configuration for pgbackrest, needed for WAL recovery and replication.
RUN echo -ne "[global]\nrepo1-host=${PGBACKREST_REPO_HOST}\n\n[pgbench]\npg1-path=/var/lib/pgsql/11/data\n" > /etc/pgbackrest.conf
## Adding Private Key to the Docker. Docker container would use this private key for pgbackrest wal recovery.
RUN mkdir -p ${PGHOME_DIR}/.ssh && chmod 0750 ${PGHOME_DIR}/.ssh
COPY --chown=postgres:postgres ./SSH_PRIVATE_KEY ${PGHOME_DIR}/.ssh/id_rsa
RUN chmod 0600 ${PGHOME_DIR}/.ssh/id_rsa
RUN echo -ne "Host ${PGBACKREST_REPO_HOST}\n\tStrictHostKeyChecking no\n" >> ${PGHOME_DIR}/.ssh/config
## Making "/var/lib/pgsql" as a mountable directory in the container
VOLUME ["${PGHOME_DIR}"]
## Setting postgres as the default user for any remaining commands
USER postgres
We hebben nu twee bestanden, Dockerfile gebruikt door docker build en SSH_PRIVATE_KEY die we naar de docker-image zullen kopiëren.
$ ls
Dockerfile SSH_PRIVATE_KEY
Voer het onderstaande commando uit op node-2 om onze docker-image te bouwen. Ik heb de pgbackrest-repository-host-IP in de opdracht genoemd en deze IP zal worden gebruikt in de pgbackrest-parameter "repo-host".
$ docker build --no-cache -t postgresql:11 --build-arg PGBACKREST_REPO_HOST=192.168.0.113 .
Sending build context to Docker daemon 230.4kB
Step 1/12 : FROM centos:7
---> 9f38484d220f
Step 2/12 : ARG PGBACKREST_REPO_HOST
---> Running in 8b7b36c6f151
Removing intermediate container 8b7b36c6f151
---> 31510e46e286
Step 3/12 : ARG PGHOME_DIR=/var/lib/pgsql
...
Step 4/12 : RUN yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
...
...
Step 12/12 : USER postgres
---> Running in c91abcf46440
Removing intermediate container c91abcf46440
---> bebce78df5ae
Successfully built bebce78df5ae
Successfully tagged postgresql:11
Zorg ervoor dat de afbeelding met succes is gemaakt en controleer of de afbeelding "postgresql:11" recent is gemaakt, zoals hieronder wordt weergegeven.
$ docker image ls postgresql:11
REPOSITORY TAG IMAGE ID CREATED SIZE
postgresql 11 2e03ed2a5946 3 minutes ago 482MB
De PostgreSQL-back-up herstellen
We zullen nu onze PostgreSQL-back-up herstellen die wordt onderhouden in pgbackrest back-uprepository host node-3.
Hieronder staat het pgbackrest configuratiebestand aanwezig op host node-2 en ik heb node-3 genoemd als pgbackrest repository host. Directory genoemd in het param pg1-pad is waar de PostgreSQL-gegevensdirectory zou worden hersteld.
[[email protected] ~]$ cat /etc/pgbackrest.conf
[global]
log-level-file=detail
repo1-host=node-3
[pgbench]
pg1-path=/var/lib/pgsql/11/data
Met het onderstaande pgbackrest restore commando, wordt de postgresql data directory hersteld op node-2:/var/lib/pgsql/11/data.
Om PITR te valideren met de pgbackrest-back-up heb ik --type=time --target='2019-07-30 06:24:50.241352+00' ingesteld, zodat het WAL-herstel stopt voordat de genoemde tijd.
[[email protected] ~]$ sudo -u postgres bash -c "/usr/bin/pgbackrest --type=time --target='2019-07-30 06:24:50.241352+00' --target-action=promote --recovery-option='standby_mode=on' --stanza=pgbench restore"
De bovenstaande opdracht kan enige tijd duren, afhankelijk van de back-upgrootte en de netwerkbandbreedte. Controleer na het herstellen de grootte van de gegevensmap en controleer ook recovery.conf.
[[email protected] ~]$ sudo -u postgres du -sh /var/lib/pgsql/11/data
2.1G /var/lib/pgsql/11/data
[[email protected] ~]$ sudo -u postgres cat /var/lib/pgsql/11/data/recovery.conf
standby_mode = 'on'
restore_command = '/usr/bin/pgbackrest --stanza=pgbench archive-get %f "%p"'
recovery_target_time = '2019-07-30 06:24:50.241352+00'
Archiefmodus uitschakelen voor PostgreSQL-dockercontainer.
[[email protected] ~]$ sudo -u postgres bash -c "echo 'archive_mode = off' >> /var/lib/pgsql/11/data/postgresql.auto.conf"
Start de docker-container met de afbeelding "postgresql:11". In de opdracht zijn we
-
Containernaam instellen als "pgbench"
-
Docker host(node-2) directory /var/lib/psql koppelen aan de docker-containerdirectory /var/lib/psql
-
Containerpoort 5432 blootstellen aan poort 15432 op knooppunt-2.
-
De postgres-daemon starten met het commando /usr/pgsql-11/bin/postmaster -D /var/lib/pgsql/11/data
[[email protected] ~]$ docker run --rm --name "pgbench" -v /var/lib/pgsql:/var/lib/pgsql -p 15432:5432 -d postgresql:11 /usr/pgsql-11/bin/postmaster -D /var/lib/pgsql/11/data
e54f2f65afa13b6a09236a476cb1de3d8e499310abcec2b121a6b35611dac276
Controleer of de "pgbench"-container is gemaakt en actief is.
[[email protected] ~]$ docker ps -f name=pgbench
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e54f2f65afa1 postgresql:11 "/usr/pgsql-11/bin/p…" 34 seconds ago Up 33 seconds 0.0.0.0:15432->5432/tcp pgbench
PostgreSQL valideren
Omdat de hostdirectory /var/lib/pgsql wordt gedeeld met de docker-container, zijn de logs die door de PostgreSQL-service worden gegenereerd, ook zichtbaar vanaf node-2. Controleer het logboek van vandaag om er zeker van te zijn dat PostgreSQL goed is gestart zonder FOUT en zorg ervoor dat de onderstaande logboekregels aanwezig zijn.
[[email protected] ~]$ sudo -u postgres tailf /var/lib/pgsql/11/data/log/postgresql-Tue.csv
..
2019-07-30 06:38:34.633 UTC,,,7,,5d3fe5e9.7,5,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"consistent recovery state reached at E/CE000210",,,,,,,,,""
2019-07-30 06:38:34.633 UTC,,,1,,5d3fe5e9.1,2,,2019-07-30 06:38:33 UTC,,0,LOG,00000,"database system is ready to accept read only connections",,,,,,,,,""
2019-07-30 06:38:35.236 UTC,,,7,,5d3fe5e9.7,6,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"restored log file ""000000010000000E000000CF"" from archive",,,,,,,,,""
2019-07-30 06:38:36.210 UTC,,,7,,5d3fe5e9.7,7,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"restored log file ""000000010000000E000000D0"" from archive",,,,,,,,,""
...
2019-07-30 06:39:57.221 UTC,,,7,,5d3fe5e9.7,37,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"recovery stopping before commit of transaction 52181192, time 2019-07-30 06:25:01.576689+00",,,,,,,,,""
...
2019-07-30 06:40:00.682 UTC,,,7,,5d3fe5e9.7,47,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"archive recovery complete",,,,,,,,,""
Bericht "consistente herstelstatus bereikt op E/CE000210", geeft aan dat we met de pgbackrest-back-upgegevensdirectory een consistente status konden bereiken.
Bericht "archiefherstel voltooid", geeft aan dat we het WAL-bestand waarvan een back-up is gemaakt door pgbackrest, opnieuw kunnen afspelen en zonder problemen kunnen herstellen.
Maak verbinding met postgresql-instantie via lokale poort 15432 en verifieer tabellen en rijtellingen.
[[email protected] ~]$ sudo -iu postgres /usr/pgsql-11/bin/psql -p 15432 -h localhost -U pgbench
Password for user pgbench:
psql (11.4)
Type "help" for help.
pgbench=> \dt
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+---------
public | pgbench_accounts | table | pgbench
public | pgbench_branches | table | pgbench
public | pgbench_history | table | pgbench
public | pgbench_tellers | table | pgbench
(4 rows)
pgbench=> select * from pgbench_history limit 1;
tid | bid | aid | delta | mtime | filler
-----+-----+---------+-------+----------------------------+--------
98 | 3 | 2584617 | 507 | 2019-07-30 06:20:01.412226 |
(1 row)
pgbench=> select max(mtime) from pgbench_history ;
max
----------------------------
2019-07-30 06:22:01.402245
(1 row)
pgbench=> select count(1) from pgbench_history ;
count
-------
90677
(1 row)
pgbench=> select count(1) from pgbench_accounts ;
count
----------
10000000
(1 row)
We hebben nu onze PostgreSQL-back-up op een docker-container hersteld en ook PITR geverifieerd. Nadat de back-up is gevalideerd, kunnen we de container stoppen en de gegevensmap verwijderen.
[[email protected] ~]$ docker stop pgbench
pgbench
[[email protected] ~]$ sudo -u postgres bash -c "rm -rf /var/lib/pgsql/11/data && mkdir -p /var/lib/pgsql/11/data && chmod 0700 /var/lib/pgsql/11/data"
Conclusie
In deze blog demonstreerde ik de back-upvalidatie met behulp van een kleine database op een kleine VirtualBox VM. Hierdoor was de back-upvalidatie in slechts enkele minuten voltooid. Het is belangrijk op te merken dat u in productie een juiste VM moet kiezen met voldoende geheugen, CPU en schijf om de back-upvalidatie succesvol te laten verlopen. U kunt het hele validatieproces ook automatiseren in een bash-script of zelfs door integratie met een CI/CD-pipeline, zodat u onze PostgreSQL-back-ups regelmatig kunt valideren.