wal-g á¡áá¯ááºáá¯ááºáá¯á¶á¡áá±ážá
áááºááᯠáá±á¬ááºážáá«ážááœáẠááœá±á·ááá¯ááºáááº-
S3 ááá¯ááŸá±á¬ááºááŸá¯áááá¯ááá¯áá±á¬ááẠáá±áá¬ááááºážáááºážáááºá¡ááœáẠáá±áááºážá á¬ážáá¬áá²á·áááºá S3 á á¡á¬ážáá¬áá»ááºáá»á¬ážáá²ááŸáá áºáá¯ááŸá¬ API ááŸáá áºááá·áº áááºáá±á¬ááºááá¯ááºááŸá¯ááŒá áºááŒá®ážá á¡áá»á¬ážáá°ááŸá¬áááºááŸá¯ááá¯ááºááœáá·áº á¡áá«á¡ááẠááá¯ááŸá±á¬ááºááŸá¯ááŸáá·áº ááá¯ááºáá»á±á¬áá®ááœá±ááŸááá±á¬ á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯ááᯠá á¯á ááºážááá¯ááºá á±áᬠááá¯ááŸá±á¬ááºáááºážá¡ááœááºážááŸá á¡áá»ááºá¡áááºáá»á¬ážááᯠá¡ááºááááºáá¯ááºááŒááºážááŸá¬ ááá¬ážáááºááœáá·áºááŒá¯áá¬ážáá°áá»á¬ážáᬠááŒá áºááá·áºá¡ááœáẠááŒá áºáááºá
S3 áááá¯ááá¯áá±á¬ááᯠá¡áá¯á¶ážááŒá¯ááá·áº á¡áá»á¬ážáá°ááŸá¬ááŸáá·áº áá¯áá¹áááá ááá¯ááŸá±á¬ááºááŸá¯ á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ á¡áá»á¬ážá¡ááŒá¬ážááŸááááºá ááá±á· áá»áœááºá¯ááºááá¯á·ááẠáá±ážáááºáá±á¬ ááá¯ááŸá±á¬ááºááŸá¯á¡á¬áž á á®á ááºááŒááºážá¡ááœáẠáá±áááºážá á¬ážáá±á¬ ááŒá±ááŸááºážáá»ááºáá áºáᯠ- Minio ááᯠááŒáá·áºááŸá¯áá«áááºá
PostgreSQL áá¬áá¬áá áºáá¯áááºážááẠwal-g á ááºážáááºáááºá¡ááœáẠáá±á¬ááºážááœááºááŒá®áž Minio ááᯠS3 á¡ááœáẠá¡á á¬ážááá¯ážá¡ááŒá Ạá¡áá¯á¶ážááŒá¯áá«áááºá
Minio áá¬áá¬
Minio áááºáááºááŒááºážá
yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minio
/etc/minio/minio.conf ááœáẠAccessKey ááŸáá·áº SecretKey ááᯠáááºážááŒááºáá«á
vi /etc/minio/minio.conf
Minio áááá¯ááºáá® nginx ááᯠá¡áá¯á¶ážáááŒá¯áá«áá ááŒá±á¬ááºážáá²ááẠááá¯á¡ááºáá«áááºá
--address 127.0.0.1:9000
--address 0.0.0.0:9000
Minio ááᯠá áááºááŒááºážá
systemctl start minio
Minio áááºá¡ááºáá¬áá±á·á
áºááá¯ááœá¬ážáá«á
DB áá¬áá¬
WAL-G ááᯠrpm ááœáẠáá»áœááºá¯áẠ(Anton Patsev) á០á
á¯á
ááºážáá¬ážáááºá
RPM-based á
áá
áºáááŸááá«á ááá¬ážáááºá¡áá¯á¶ážááŒá¯áá«á
wal-g binary ááŸáá·áºá¡áá°á rpm ááœáẠ/etc/wal-gd/server-s3.conf ááá¯ááºá០ááááºážááŸááºáá»á¬ážááᯠáááºááœááºážááá·áº script áá»á¬ážáá«ááŸááááºá
backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.sh
wlg ááᯠinstall áá¯ááºáá«á
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-g
wal-g áá¬ážááŸááºážááᯠá á áºáá±ážáá±áááºá
wal-g --version
wal-g version v0.2.14
ááá·áºááá¯á¡ááºáá»ááºáá»á¬ážá¡ááœáẠ/etc/wal-gd/server-s3.conf ááᯠáááºážááŒááºáá«á
áá±áá¬áá±á·á
Ạá¡á
á¯á¡áá±ážáá
áºáá¯á០á¡áá¯á¶ážááŒá¯ááá·áº ááœá²á·á
ááºážááŸá¯ááá¯ááºáá»á¬ážááŸáá·áº áá±áá¬ááá¯ááºáá»á¬ážááᯠá¡á
ááºá¡áá¬á¡á¬ážááŒáá·áº á¡á
á¯á¡áá±ážáá±áá¬áááºážááœáŸááºááœáẠá¡áá°ááᜠááááºážáááºážáá¬ážáááºáᯠá¡áá»á¬ážá¡á¬ážááŒáá·áº áááºááœáŸááºážáááºá 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 # ÐакПй ЌеÑПЎ ÑжаÑÐžÑ ÐžÑпПлÑзПваÑÑ.
WAL-G ááᯠááŒááºáááºáááºááŸááºááá·áºá¡áá«á áááºááẠWALG_DELTA_MAX_STEPS - ááŒá áºááá»áœááºážáá±á«áºá¡áááºáá°ážááŒááºážááᯠá¡ááŒá±áá¶áááá¹áá°á០á¡áá»á¬ážáá¯á¶ážááŒá áºááŒá®ážá ááŒá áºááá»áœááºážáá±á«áºá¡áááºáá°ážáá°ááŸá¯áá°áá«áááᯠáááºááŸááºáá«á áááºááẠáá±á¬ááºáá¯á¶ážááŸáááŒá®ážáá¬áž ááŒá áºááá»áœááºážáá±á«áºáá±áá០áááá¹áá°áá áºáᯠááŒá¯áá¯ááºáááºááŒá áºá á± ááá¯á·ááá¯áẠáá°áááºáž á¡ááŒáá·áºá¡á á¡áááºáá°ážáá°ááŸá¯á០ááŒá áºááá»áœááºážáá±á«áºáá±ááá áºáᯠááŒá¯áá¯ááºááá¯ááºáááºá áá±áá¬áá±á·á áºááá°áá®áá±á¬á¡á áááºá¡ááá¯ááºážááẠááá·áºáá±áá¬áá±á·á áºááœááºá¡ááŒá²áááºážááŒá±á¬ááºážáá²áá±ááá·áºá¡áá«ááœááºá áá°áá®áá±á¬áá±áá¬ááẠá¡áááºáááŒááºááŒá±á¬ááºážáá²áá±áá±á¬á¡áá«ááœáẠáááºážááẠááá¯á¡ááºáá«áááºá
áá±áá¬áá±á·á áºááá¯ááá·áºááœááºážááŒááºážá
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
áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬áá±á·á áºááᯠá áááºáá¯ááºáá±á¬ááºáá«áááºá
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK
á¡áááºá áááºááẠáá¬áᬠ1 áá¯áá±á«áºááœáẠá ááºážáááºáá±áá«áá ááá¯á·áá±á¬áẠPostgreSQL áá¬ážááŸááºáž 10 áááºáááºážáá±á¬ PostgreSQL á¡ááœáẠááááºážáááºážááẠwal_level ááá·áºáááºáá»ááºá¡á¬áž ááŒááºáááºáááºááŸááºáááºááŸáá·áº PostgreSQL áá¬ážááŸááºáž 10 ááŸáá·áºá¡áááºá¡ááœáẠáá¯á¶áá°ááŒá¯áá¯ááºááẠááá¯á¡ááºáááºá
wal_level = archive
PostgreSQL ááá¯ááºááá¯ááºá¡áá¯á¶ážááŒá¯á WAL áá±á¬áºááœááºážááá¯ááºááᯠá áá¹ááá·áº 60 ááá¯ááºáž á¡áááºááááºážááŒáá«á áá¯á·á prod ááœááºá áááºááẠááá°áá®áá±á¬ archive_timeout áááºááá¯ážáá áºáá¯ááŸááááá·áºáááºá
archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # ÐажЎÑе 60 ÑекÑМЎ бÑÐŽÐµÑ Ð²ÑпПлМÑÑÑÑ ÐºÐŸÐŒÐ°ÐœÐŽÐ° archive_command.
PostgreSQL á áááºááŒááºážá
systemctl start postgresql-9.6
áá®ážááŒá¬áž ááœááºááá¯ážááºáá áºáá¯ááœááºá á¡ááŸá¬ážáá»á¬ážá¡ááœáẠPostgreSQL ááŸááºáááºážáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· ááŒáá·áºááŸá¯áááº- (postgresql-Wed.log ááᯠáááºááŸááá áºáá¯ááá¯á· ááŒá±á¬ááºážáá«)á
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log
psql ááá¯ááœá¬ážááŒáá·áºáá¡á±á¬ááºá
su - postgres
psql
psql ááœáẠdatabase áá áºáá¯áááºáá®ážáá«á
database test1 ááœáẠááá¬ážáá áºáá¯áááºáá®ážáá«á
create database test1;
áá±áá¬áá±á·á áºá ááºážáááºááŸá¯ááá¯á· ááŒá±á¬ááºážáá«á
postgres=# c test1;
áá»áœááºá¯ááºááá¯á·ááẠtable indexing_table ááá¯áááºáá®ážáááºá
test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());
áá±áá¬ááá·áºááŒááºážá
áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬ááᯠá áááºááá·áºááœááºážáá«áááºá áá»áœááºá¯ááºááá¯á·ááẠ10-20 áááá áºá á±á¬áá·áºááá¯ááºážáá±áááºá
#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
done
á¡áááºáá°ážáá°ááẠáá±áá»á¬áá«á á±á
su - postgres
/usr/local/bin/backup-push.sh
áá±áá¬áá±á·á áºá ááºážáááºááŸá¯ á ááŸá ááá¬ážááŸá ááŸááºáááºážáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· ááŒáá·áºááŸá¯áááºá
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+
á á¬áááºážááẠáááºááŸáá¡áá»áááºááŒá áºáááºá
á¡áááºááááºážáááºážááŸá¯ á¡ááŒáá·áºá¡á á¯á¶á á¬áááºážááᯠááŒáá·áºáá«á
/usr/local/bin/backup-list.sh
ááŒááºáááºáá°áá±á¬ááºáá±ážá ááºážáááºááŸá¯
áááŸáááá¯ááºáá±á¬ WAL á¡á¬ážáá¯á¶ážááᯠááŸááá·áºááœááºážááŒááºážááŒáá·áº ááŒááºáááºááá°ááŒááºáž á¡ááŒáá·áºá¡á á¯á¶á
Postgresql áááºáá«á
/var/lib/pgsql/9.6/data ááá¯ááºááœá²á០á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá»ááºáá«á
Postgres á¡áá¯á¶ážááŒá¯áá°á¡áá±ááŒáá·áº /usr/local/bin/backup-fetch.sh script ááá¯ááœáá·áºáá«á
su - postgres
/usr/local/bin/backup-fetch.sh
á¡áááºáá¯ááºáá°ááŒááºáž ááŒá®ážáá«ááŒá®á
á¡á±á¬ááºáá«á¡ááŒá±á¬ááºážá¡áá¬ááŒáá·áº /var/lib/pgsql/9.6/data ááá¯ááºááœá²ááá¯á· recovery.conf ááᯠááá·áºáá«á
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
áá»áœááºá¯ááºááá¯á·ááẠPostgreSQL ááá¯á áááºáááºá PostgreSQL ááẠááááºážáááºážáá¬ážáá±á¬ WALs á០ááŒááºáááºááá°ááŒááºážáá¯ááºáááºážá ááºááᯠá áááºáááºááŒá áºááŒá®áž ááá¯ááŸáᬠáá±áá¬áá±á·á áºááᯠááœáá·áºáááºááŒá áºáááºá
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log
á¡áá»áááºá¡ááá¯ááºážá¡áá¬áá áºáá¯á¡áá ááŒááºáááºááá°áá«á
áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬áá±á·á áºááᯠá¡áá»áááºá¡ááá¯ááºážá¡áá¬áá áºáá¯á¡áá ááŒááºáááºááá°ááá¯áá«áá ááá¯á·áá±á¬áẠrecovery_target_time parameter ááᯠrecovery.conf ááá¯á· áá±á«ááºážááá·áºááẠ- áá±áá¬áá±á·á áºááᯠááŒááºáááºááá°áááá·áºá¡áá»áááºááᯠáá»áœááºá¯ááºááá¯á·ááœáŸááºááŒáá«áááºá
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'
ááŒááºáááºááá°ááŒá®ážáá±á¬ááºá ááá¬áž 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
áá»áœááºá¯ááºááá¯á·ááẠPostgreSQL ááá¯á áááºáááºá PostgreSQL ááẠááááºážáááºážáá¬ážáá±á¬ WALs á០ááŒááºáááºááá°ááŒááºážáá¯ááºáááºážá ááºááᯠá áááºáááºááŒá áºááŒá®áž ááá¯ááŸáᬠáá±áá¬áá±á·á áºááᯠááœáá·áºáááºááŒá áºáááºá
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log
á ááºážáááºááŒááºáž
á€áá±áá¬ááœáẠáá±á¬áºááŒáá¬ážááá·áºá¡ááá¯ááºáž 1GB áá±áá¬áá±á·á
áºááᯠáááºáá®ážááŒááºážá
áá±áᬠ1GB áá¯ááºáá±ážááŒá®ážáá±á¬áẠáá¯á¶ážá¡ááœááºá¡á á¬ážááᯠáá±á¬ááºážááá¯ááŒááºážá
postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MB
s4cmd ááẠAmazon S3 ááá¯ááŸá±á¬ááºááŸá¯ááœáẠáá±áá¬áá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºáááºá¡ááœáẠá¡ááá²á· command line tool áá áºáá¯ááŒá áºáááºá á¡ááá¯áá« utility ááᯠpython áááá¯ááááºážáááºážáá¬áá¬á áá¬ážááŒáá·áºáá±ážáá¬ážáá¬ážáá±á¬ááŒá±á¬áá·áºáááºážááᯠWindows ááŸáá·áº Linux áááºáááºááŸá¯á áá áºááŸá áºáá»áá¯ážáá¯á¶ážááœááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
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
ááá¬ážáá±á«áºááŸá ááááºáá»á¬ážááᯠááŸáá¯ááºážááŸááºááŒááºážá
áááºááœá±á·ááŒááºáááá·áºá¡ááá¯ááºáž Brotli ááẠLZMA ááŸáá·áº á¡ááœááºá¡á á¬ážáá°áá±á¬áºáááºáž á¡áááºááááºážááŒááºážááᯠLZ4 á¡áá»áááºá¡ááœááºáž áá¯ááºáá±á¬ááºáá«áááºá
áá¯ááŸá¬ážá
áá¬ážááŒá±á¬ PostgreSQL á¡ááá¯ááºážá¡ááá¯ááºážá á
áá¬ážááŒá±á¬áááºáž-
áááºá¡áá¯á¶ážááŒá¯áá«á Github ááá¯á·ááŒááºáá
áºááœáá·áºáá±ážáá«á
source: www.habr.com