Introducció al sistema de còpia de seguretat wal-g PostgreSQL

WAL-G és una eina senzilla i eficaç per fer còpies de seguretat de PostgreSQL als núvols. Pel que fa a la seva funcionalitat principal, és l'hereu de la popular eina WAL-E, però reescrit a Go. Però hi ha una nova característica important a WAL-G: còpies delta. còpies delta WAL-G emmagatzemar pàgines de fitxers que han canviat des de la versió de còpia de seguretat anterior. WAL-G implementa un munt de tecnologies per paral·lelitzar còpies de seguretat. WAL-G és molt més ràpid que WAL-E.

Podeu trobar detalls sobre com funciona wal-g a l'article: Overclockem la còpia de seguretat. Conferència Yandex

El protocol d'emmagatzematge S3 s'ha popularitzat per emmagatzemar dades. Un dels avantatges de S3 és la possibilitat d'accedir mitjançant API, que permet organitzar una interacció flexible amb l'emmagatzematge, inclòs l'accés de lectura pública, mentre que l'actualització de la informació a l'emmagatzematge només la fan persones autoritzades.

Hi ha diverses implementacions d'emmagatzematge públics i privats que utilitzen el protocol S3. Avui veurem una solució popular per organitzar un petit emmagatzematge: Minio.

Un únic servidor PostgreSQL està bé per provar wal-g i Minio s'utilitza com a substitut de S3.

Servidor Minio

Instal·lació de Minio

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

Editeu AccessKey i SecretKey a /etc/minio/minio.conf

vi /etc/minio/minio.conf

Si no utilitzareu nginx abans de Minio, haureu de canviar

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Llançament de Minio

systemctl start minio

Aneu a la interfície web de Minio http://ip-адрес-сервера-minio:9000 i creeu un cub (per exemple, pg-backups).

servidor de base de dades

WAL-G en rpm l'he muntat jo (Anton Patsev). Github, Fedora COPR.

Qui no tingui un sistema basat en RPM, utilitzi l'oficial instrucció per instal·lació.

Juntament amb el binari wal-g, rpm conté scripts que importen variables del fitxer /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

Instal·leu Walg.

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

S'està comprovant la versió wal-g.

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

Editeu /etc/wal-gd/server-s3.conf segons les vostres necessitats.

Els fitxers de configuració i els fitxers de dades utilitzats per un clúster de bases de dades s'emmagatzemen tradicionalment junts al directori de dades del clúster, comunament conegut com a 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 # Какой метод сжатия использовать.

Quan configureu WAL-G, especifiqueu WALG_DELTA_MAX_STEPS: el nombre de passos que la còpia de seguretat delta és màxima des de la còpia de seguretat base, i especifiqueu la política de còpia delta. O feu una còpia de l'últim delta existent, o bé feu un delta de la còpia de seguretat completa original. Això és necessari en cas que el mateix component de la base de dades estigui canviant sempre a la vostra base de dades, les mateixes dades canvien constantment.

Instal·lació de la base de dades.

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

Iniciem la base de dades.

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

Si esteu provant en 1 servidor, haureu de reconfigurar el paràmetre wal_level per arxivar per a PostgreSQL inferior a la versió 10 i la rèplica per a PostgreSQL versió 10 i anterior.

wal_level = archive

Fem una còpia de seguretat dels arxius WAL cada 60 segons mitjançant el mateix PostgreSQL. A prod, tindreu un valor archive_timeout diferent.

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

Iniciant PostgreSQL

systemctl start postgresql-9.6

En una consola independent, mirem els registres de PostgreSQL per detectar errors: (canvieu postgresql-Wed.log a l'actual).

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

Anem a psql.

su - postgres
psql

Crea una base de dades en psql

Creeu una taula a la base de dades test1.

create database test1;

Canvia a la prova de la base de dades.

postgres=# c test1;

Creem la taula indexing_table.

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

Afegint dades.

Comencem a inserir dades. Estem esperant 10-20 minuts.

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

Assegureu-vos de fer una còpia de seguretat completa.

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

Observem els registres de la taula de la base de dades test1

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+

La cadena és l'hora actual.

Consulteu la llista de còpies de seguretat completes

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

Proves de recuperació

Recuperació completa amb l'enrotllament de tots els WAL disponibles.

Atura Postgresql.

Suprimeix-ho tot de la carpeta /var/lib/pgsql/9.6/data.

Executeu l'script /usr/local/bin/backup-fetch.sh com a usuari de postgres.

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

S'ha completat l'extracció de la còpia de seguretat.

Afegiu recovery.conf a la carpeta /var/lib/pgsql/9.6/data amb el contingut següent.

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

Iniciem PostgreSQL. PostgreSQL iniciarà el procés de recuperació des dels WAL arxivats i només llavors s'obrirà la base de dades.

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

Recuperació durant un temps determinat.

Si volem restaurar la base de dades fins a un minut determinat, afegim el paràmetre recovery_target_time a recovery.conf: indiquem a quina hora restaurar la base de dades.

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

Després de la recuperació, mireu la taula 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

Iniciem PostgreSQL. PostgreSQL iniciarà el procés de recuperació des dels WAL arxivats i només llavors s'obrirà la base de dades.

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

Proves

Generant una base de dades d'1 GB tal com es descriu aquí https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Sol·licitar la mida del cub després de generar 1 GB de dades.

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

s4cmd és una eina de línia d'ordres gratuïta per treballar amb dades que resideixen a l'emmagatzematge d'Amazon S3. La utilitat està escrita en el llenguatge de programació Python, i per això es pot utilitzar tant en sistemes operatius Windows com Linux.

Instal·lant 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

Brotli

После генерации 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

Comparació de resultats al gràfic.

Introducció al sistema de còpia de seguretat wal-g PostgreSQL

Com podeu veure, Brotli és comparable en mida a LZMA, però la còpia de seguretat es realitza en temps LZ4.

Xat de la comunitat de parla russa de PostgreSQL: https://t.me/pgsql

Si us plau, doneu una estrella a Github si feu servir wal-g

Font: www.habr.com

Afegeix comentari