— ett enkelt och effektivt verktyg för att säkerhetskopiera PostgreSQL till molnet. Med sin grundläggande funktionalitet är det en arvtagare till det populära verktyget , men omarbetat i Go. En viktig ny funktion i WAL-G är delta-kopior. Delta-kopior lagrar filens sidor som har ändrats sedan den senaste säkerhetskopian. WAL-G implementerar en hel del teknologier för att parallellisera säkerhetskopieringar. WAL-G fungerar mycket snabbare än WAL-E.
Du kan läsa mer om hur wal-g fungerar i artikeln:
S3-lagringsprotokollet har blivit populärt för att lagra data. En av fördelarna med S3 är möjligheten att få åtkomst via API, vilket möjliggör flexibel interaktion med lagringen, inklusive offentlig åtkomst för läsning, medan uppdatering av informationen i lagringen endast sker av auktoriserade personer.
Det finns flera både öppna och privata implementeringar av lagringslösningar som arbetar med S3-protokollet. Idag kommer vi att titta på en populär lösning för att organisera små lagringssystem — Minio.
För att testa wal-g räcker en PostgreSQL-server och Minio används som ersättning för S3.
Minio-server
Installation av Minio
yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minioÄndra AccessKey och SecretKey i /etc/minio/minio.conf
vi /etc/minio/minio.confOm du inte planerar att använda Nginx före Minio måste du ändra
--address 127.0.0.1:9000--address 0.0.0.0:9000Starta Minio
systemctl start minioGå till Minios webbgränssnitt och skapa en bucket (till exempel, pg-backups).
DB-server
Jag bygger WAL-G i rpm (Anton Patsev). , .
För dem utan RPM-baserat system, använd den officiella installationsanvisningen.
Tillsammans med binärfilerna för wal-g i rpm finns skript som importerar variabler från filen /etc/wal-g.d/server-s3.conf.
backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.shInstallera wal-g.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gKontrollera versionen av wal-g.
wal-g --version
wal-g version v0.2.14Redigera /etc/wal-g.d/server-s3.conf efter dina behov.
Konfigurationsfiler och datakataloger som används av databasens kluster lagras traditionellt tillsammans i datakatalogen för klustret, som vanligtvis kallas 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 # Какой метод сжатия использовать.
Vid inställning av WAL-G anger du WALG_DELTA_MAX_STEPS – det maximala antal steg som delta-backup kan avvika från basbackups, och anges policyn för delta-kopia. Antingen gör du en kopia med den senaste befintliga delta, eller så gör du en delta från den ursprungliga fullständiga backupen. Detta behövs i fall där en och samma komponent i databasen alltid förändras, samma data ändras ständigt.
Installera 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 mcVi initierar databasen.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKOm du testar på 1 server, behöver du omkonfigurera parametern wal_level till archive för PostgreSQL versioner mindre än 10, och replica för PostgreSQL version 10 och äldre.
wal_level = archiveVi gör backup av WAL-arkiven var 60:e sekund med hjälp av PostgreSQL själv. På produktion kommer du ha ett annat värde för archive_timeout.
archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Kommandot archive_command kommer att köras var 60:e sekund.Starta PostgreSQL
systemctl start postgresql-9.6I en separat konsol tittar vi på PostgreSQL-loggar för eventuella fel: (byt ut postgresql-Wed.log mot den aktuella).
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logLogga in i psql.
su - postgres
psqlSkapa en databas i psql.
Skapa en tabell i databasen test1.
create database test1;Byt till databasen test.
postgres=# c test1;Skapa tabellen indexing_table.
test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());Lägg till data.
Starta datainförseln. Vänta 10-20 minuter.
#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
doneSe till att göra en fullständig backup.
su - postgres
/usr/local/bin/backup-push.shTitta på poster i tabellen i databasen 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+Raden är den aktuella tiden.
Titta på listan över fullständiga backuper
/usr/local/bin/backup-list.shTesta återställning
Full återställning med applicering av alla tillgängliga WAL.
Stoppa PostgreSQL.
Ta bort allt från mappen /var/lib/pgsql/9.6/data.
Kör skriptet /usr/local/bin/backup-fetch.sh som användaren postgres.
su - postgres
/usr/local/bin/backup-fetch.shBackuputvinning slutförd.
Lägg till recovery.conf i mappen /var/lib/pgsql/9.6/data med följande innehåll.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'Starta PostgreSQL. PostgreSQL kommer att påbörja återställningsprocessen från arkiverade WAL, och först därefter öppnas databasen.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logÅterställning till en specifik tid.
Om vi vill återställa databasen till en viss tidpunkt, lägger vi till parametern recovery_target_time i recovery.conf - vi anger vilken tid vi vill återställa databasen till.
restore_command = '"/usr/local/bin/wal-fetch.sh "%f" "%p"'"
recovery_target_time = '2020-01-29 09:46:25'Efter återställning tittar vi 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+00Starta PostgreSQL. PostgreSQL kommer att påbörja återställningsprocessen från arkiverade WAL, och först därefter öppnas databasen.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logTestning
Vi genererar en 1GB databas enligt beskrivningen här
Vi begär storleken på bucketen efter att ha genererat 1GB data.
postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MBs4cmd — ett gratis kommandoradsverktyg för att hantera data som finns i Amazon S3-lagring. Verktyget är skrivet i programspråket Python och kan därför användas på både Windows och Linux.
Vi installerar s4cmd
pip install s4cmdLZ4
s4cmd --endpoint-url=http://ip-adress-till-server-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822 s3://pg-backups/wal_005/
840 MB i lz4 format endast WAL-loggar
Full backup med lz4 - 1GB data
time backup_push.sh
real 0m18.582s
Storleken på S3-bucket efter full backup
581480085 s3://pg-backups/basebackups_005/
842374424 s3://pg-backups/wal_005
581 MB tar upp full backupLZMA
Efter generering av 1GB data
338413694 s3://pg-backups/wal_005/
338 MB loggar i lzma format
Tid för full backupgenerering
time backup_push.sh
real 5m25.054s
Storleken på bucketen i S3
270310495 s3://pg-backups/basebackups_005/
433485092 s3://pg-backups/wal_005/
270 MB tar upp full backup i lzma formatBrotli
Efter generering av 1GB data
459229886 s3://pg-backups/wal_005/
459 MB loggar i brotli format
Tid för full backupgenerering
real 0m23.408s
Storleken på bucketen i S3
312960942 s3://pg-backups/basebackups_005/
459309262 s3://pg-backups/wal_005/
312 MB tar upp full backup i brotli format
Jämförelse av resultaten i diagrammet.

Som vi ser är Brotli jämförbar i storlek med LZMA, men backupen utförs på tiden för LZ4.
Chatt för den ryskspråkiga PostgreSQL-gemenskapen:
Sätt gärna en stjärna på Github om du använder
Källa: habr.com
