Podeu trobar detalls sobre com funciona wal-g a l'article:
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
servidor de base de dades
WAL-G en rpm l'he muntat jo (Anton Patsev).
Qui no tingui un sistema basat en RPM, utilitzi l'oficial
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í
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.
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:
Si us plau, doneu una estrella a Github si feu servir
Font: www.habr.com