Introduktion til wal-g PostgreSQL backup-systemet

WAL-G er et simpelt og effektivt værktøj til at sikkerhedskopiere PostgreSQL til skyerne. Med hensyn til dets hovedfunktionalitet er det arvingen til det populære værktøj WAL-E, men omskrevet i Go. Men der er en vigtig ny funktion i WAL-G - delta kopier. delta kopier WAL-G gemme sider med filer, der er ændret siden den forrige sikkerhedskopieringsversion. WAL-G implementerer en hel del teknologier til parallelisering af sikkerhedskopier. WAL-G er meget hurtigere end WAL-E.

Detaljer om, hvordan wal-g virker, kan findes i artiklen: Vi overclocker backup'en. Yandex foredrag

S3-lagringsprotokollen er blevet populær til lagring af data. En af fordelene ved S3 er muligheden for adgang via API, som giver dig mulighed for at organisere fleksibel interaktion med lageret, herunder offentlig læseadgang, mens opdatering af information i lageret kun sker af autoriserede personer.

Der er flere offentlige og private lagerimplementeringer, der bruger S3-protokollen. I dag vil vi se på en populær løsning til at organisere lille opbevaring - Minio.

En enkelt PostgreSQL-server er fin til at teste wal-g, og Minio bruges som erstatning for S3.

Minio server

Minio installation

yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minio

Rediger AccessKey og SecretKey i /etc/minio/minio.conf

vi /etc/minio/minio.conf

Hvis du ikke vil bruge nginx før Minio, så skal du ændre

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Lancering af Minio

systemctl start minio

Gå til Minio-webgrænsefladen http://ip-адрес-сервера-minio:9000 og opret en bucket (for eksempel pg-backups).

DB server

WAL-G i rpm er samlet af mig (Anton Patsev). Github, Fedora COPR.

Hvem ikke har et RPM-baseret system, brug den officielle instruktioner ved installation.

Sammen med wal-g binæren indeholder rpm scripts, der importerer variabler fra filen /etc/wal-gd/server-s3.conf.

backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.sh

Installer walg.

yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-g

Tjek wal-g version.

wal-g --version
wal-g version v0.2.14

Rediger /etc/wal-gd/server-s3.conf efter dine behov.

Konfigurationsfilerne og datafilerne, der bruges af en databaseklynge, gemmes traditionelt sammen i klyngedatabiblioteket, almindeligvis omtalt som PGDATA

#!/bin/bash

export PG_VER="9.6"

export WALE_S3_PREFIX="s3://pg-backups" # бакет, который мы создали в S3
export AWS_ACCESS_KEY_ID="xxxx" # AccessKey из /etc/minio/minio.conf 
export AWS_ENDPOINT="http://ip-адрес-сервера-minio:9000"
export AWS_S3_FORCE_PATH_STYLE="true"
export AWS_SECRET_ACCESS_KEY="yyyy" # SecretKey из /etc/minio/minio.conf

export PGDATA=/var/lib/pgsql/$PG_VER/data/
export PGHOST=/var/run/postgresql/.s.PGSQL.5432 # Сокет для подключения к PostgreSQL

export WALG_UPLOAD_CONCURRENCY=2 # Кол-во потоков для закачки 
export WALG_DOWNLOAD_CONCURRENCY=2 # Кол-во потоков для скачивания
export WALG_UPLOAD_DISK_CONCURRENCY=2 # Кол-во потоков на диске для закачки
export WALG_DELTA_MAX_STEPS=7
export WALG_COMPRESSION_METHOD=brotli # Какой метод сжатия использовать.

Når du konfigurerer WAL-G, specificerer du WALG_DELTA_MAX_STEPS - antallet af trin, som delta backup er maksimalt fra basis backup, og specificerer delta kopi politik. Enten laver du en kopi fra det sidste eksisterende delta, eller også laver du et delta fra den originale fulde backup. Dette er nødvendigt i tilfælde af, at den samme komponent af databasen altid ændrer sig i din database, ændres de samme data konstant.

Installation af databasen.

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.
noarch.rpm
yum install -y postgresql96 postgresql96-server mc

Vi initialiserer databasen.

/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK

Hvis du tester på 1 server, skal du omkonfigurere wal_level-parameteren til at arkivere for PostgreSQL mindre end version 10 og replika for PostgreSQL version 10 og ældre.

wal_level = archive

Lad os sikkerhedskopiere WAL-arkiver hvert 60. sekund ved hjælp af PostgreSQL selv. På prod vil du have en anden archive_timeout værdi.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Каждые 60 секунд будет выполнятся команда archive_command.

Starter PostgreSQL

systemctl start postgresql-9.6

I en separat konsol ser vi på PostgreSQL-logfilerne for fejl: (skift postgresql-Wed.log til den nuværende).

tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Lad os gå til psql.

su - postgres
psql

Opret en database i psql

Opret en tabel i databasen test1.

create database test1;

Skift til databasetesten.

postgres=# c test1;

Vi opretter tabellen indexing_table.

test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());

Tilføjelse af data.

Vi begynder at indsætte data. Vi venter i 10-20 minutter.

#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
done

Sørg for at lave en fuld backup.

su - postgres
/usr/local/bin/backup-push.sh

Vi ser på posterne i tabellen i databasetest1

select * from indexing_table;
2020-01-29 09:41:25.226198+
2020-01-29 09:42:25.336989+
2020-01-29 09:43:25.356069+
2020-01-29 09:44:25.37381+
2020-01-29 09:45:25.392944+
2020-01-29 09:46:25.412327+
2020-01-29 09:47:25.432564+
2020-01-29 09:48:25.451985+
2020-01-29 09:49:25.472653+
2020-01-29 09:50:25.491974+
2020-01-29 09:51:25.510178+

Strengen er det aktuelle tidspunkt.

Se listen over fulde sikkerhedskopier

/usr/local/bin/backup-list.sh

Genopretningstest

Fuld genopretning med rullende alle tilgængelige WAL.

Stop Postgresql.

Slet alt fra mappen /var/lib/pgsql/9.6/data.

Kør scriptet /usr/local/bin/backup-fetch.sh som postgres-brugeren.

su - postgres
/usr/local/bin/backup-fetch.sh

Sikkerhedskopiering fuldført.

Tilføj recovery.conf til mappen /var/lib/pgsql/9.6/data med følgende indhold.

restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'

Vi starter PostgreSQL. PostgreSQL starter gendannelsesprocessen fra de arkiverede WAL'er, og først derefter åbnes databasen.

systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Restitution i en vis tid.

Hvis vi ønsker at gendanne databasen op til et bestemt minut, så tilføjer vi recovery_target_time parameteren til recovery.conf - vi angiver på hvilket tidspunkt databasen skal gendannes.

restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'

Efter gendannelse skal du se på tabellen indexing_table

 2020-01-29 09:41:25.226198+00
 2020-01-29 09:42:25.336989+00
 2020-01-29 09:43:25.356069+00
 2020-01-29 09:44:25.37381+00
 2020-01-29 09:45:25.392944+00

Vi starter PostgreSQL. PostgreSQL starter gendannelsesprocessen fra de arkiverede WAL'er, og først derefter åbnes databasen.

systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Test

Generering af en 1GB database som beskrevet her https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Anmodning om bøttestørrelsen efter generering af 1 GB data.

postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MB

s4cmd er et gratis kommandolinjeværktøj til at arbejde med data, der ligger i Amazon S3-lager. Hjælpeprogrammet er skrevet i programmeringssproget python, og på grund af dette kan det bruges i både Windows og Linux operativsystemer.

Installerer s4cmd

pip install s4cmd

LZ4

s4cmd --endpoint-url=http://ip-адрес-сервера-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822       s3://pg-backups/wal_005/
840 МБ в формате lz4 только WAL логов

Полный бекап с lz4 - 1GB данных
time backup_push.sh
real 0m18.582s

Размер S3 бакета после полного бекапа

581480085       s3://pg-backups/basebackups_005/
842374424   s3://pg-backups/wal_005
581 МБ занимает полный бекап

LZMA

После генерации 1ГБ данных
338413694       s3://pg-backups/wal_005/
338 мб логов в формате lzma

Время генерации полного бекапа
time backup_push.sh
real    5m25.054s

Размер бакета в S3
270310495       s3://pg-backups/basebackups_005/
433485092   s3://pg-backups/wal_005/

270 мб занимает полный бекап в формате lzma

Overtrædelse

После генерации 1ГБ данных
459229886       s3://pg-backups/wal_005/
459 мб логов в формате brotli

Время генерации полного бекапа
real    0m23.408s

Размер бакета в S3
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

312 мб занимает полный бекап в формате brotli

Sammenligning af resultater på diagrammet.

Introduktion til wal-g PostgreSQL backup-systemet

Som du kan se, er Brotli i størrelse sammenlignelig med LZMA, men sikkerhedskopieringen udføres i LZ4-tid.

Chat af det russisktalende PostgreSQL-fællesskab: https://t.me/pgsql

Giv venligst en stjerne til Github, hvis du bruger wal-g

Kilde: www.habr.com

Tilføj en kommentar