Detaljer om, hvordan wal-g virker, kan findes i artiklen:
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
DB server
WAL-G i rpm er samlet af mig (Anton Patsev).
Hvem ikke har et RPM-baseret system, brug den officielle
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
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.
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:
Giv venligst en stjerne til Github, hvis du bruger
Kilde: www.habr.com