— uno strumento semplice ed efficace per il backup di PostgreSQL nel cloud. Per la sua funzionalità principale, è l'erede di uno strumento popolare , ma riscritto in Go. Ma in WAL-G c'è una importante novità: le copie delta. Le copie delta memorizzano le pagine dei file che sono cambiate rispetto alla versione precedente del backup. WAL-G implementa molte tecnologie per il parallelismo dei backup. WAL-G funziona molto più velocemente rispetto a WAL-E.
Puoi leggere ulteriori dettagli sul funzionamento di wal-g nell'articolo:
Il protocollo di archiviazione S3 è diventato popolare per la memorizzazione dei dati. Uno dei vantaggi di S3 è la possibilità di accesso tramite API, che consente di organizzare interazioni flessibili con lo storage, inclusi accessi pubblici in lettura, mentre l'aggiornamento delle informazioni nello storage avviene solo da parte di utenti autorizzati.
Esistono sia implementazioni aperte che private degli archivi che operano secondo il protocollo S3. Oggi esamineremo una soluzione popolare per l'organizzazione di piccoli archivi: Minio.
Per testare wal-g è sufficiente un server PostgreSQL, mentre Minio è utilizzato come sostituto di S3.
Server Minio
Installazione di Minio
yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minioModifichiamo AccessKey e SecretKey in /etc/minio/minio.conf
vi /etc/minio/minio.confSe non utilizzerai nginx davanti a Minio, dovrai modificare
--address 127.0.0.1:9000--address 0.0.0.0:9000Avviamo Minio
systemctl start minioAccediamo all'interfaccia web di Minio e creiamo un bucket (ad esempio, pg-backups).
Server DB
Compilo WAL-G in rpm io stesso (Anton Patsev). , .
Chi non ha un sistema basato su RPM utilizzi la guida ufficiale per l'installazione.
Insieme al binario wal-g in rpm sono presenti script che importano le variabili dal file /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.shInstalliamo wal-g.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gControlliamo la versione di wal-g.
wal-g --version
wal-g version v0.2.14Modifica /etc/wal-g.d/server-s3.conf secondo le tue esigenze.
I file di configurazione e i file dati utilizzati dal cluster del database sono tradizionalmente memorizzati insieme nella directory dei dati del cluster, che di solito viene chiamata 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 # Какой метод сжатия использовать.
Durante la configurazione di WAL-G, specificate WALG_DELTA_MAX_STEPS: il numero massimo di passaggi che la copia delta può distaccarsi dal backup base e indicate la politica di copia delta. Potete fare una copia dall'ultima delta esistente oppure fare una delta dal backup completo originale. Questo è necessario nel caso in cui una certa componente del database cambi continuamente, gli stessi dati vengano costantemente modificati.
Installiamo il database.
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 mcInizializziamo il database.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKSe testate su un server, dovete riconfigurare il parametro wal_level su archive per PostgreSQL inferiore alla versione 10, e replica per PostgreSQL versione 10 e superiore.
wal_level = archiveEffettueremo il backup degli archivi WAL ogni 60 secondi utilizzando PostgreSQL stesso. In produzione avrete un altro valore per archive_timeout.
archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Il comando archive_command verrà eseguito ogni 60 secondi.Avviamo PostgreSQL
systemctl start postgresql-9.6In una console separata controlliamo i log di PostgreSQL per errori: (sostituite postgresql-Wed.log con l'attuale).
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logAccediamo a psql.
su - postgres
psqlIn psql creiamo il database.
Creiamo una tabella nel database test1.
create database test1;Passiamo al database test.
postgres=# c test1;Creiamo la tabella indexing_table.
test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());Aggiunta di dati.
Iniziamo l'inserimento dei dati. Aspettiamo 10-20 minuti.
#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
doneÈ fondamentale effettuare un backup completo.
su - postgres
/usr/local/bin/backup-push.shControlliamo le registrazioni nella tabella nel database 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 riga indica l'ora corrente.
Controlliamo l'elenco dei backup completi
/usr/local/bin/backup-list.shTest di ripristino
Ripristino completo applicando tutti i WAL disponibili.
Fermiamo PostgreSQL.
Eliminiamo tutto dalla cartella /var/lib/pgsql/9.6/data.
Eseguiamo lo script /usr/local/bin/backup-fetch.sh con l'utente postgres.
su - postgres
/usr/local/bin/backup-fetch.shEstrazione del backup completata.
Aggiungiamo recovery.conf nella cartella /var/lib/pgsql/9.6/data con il seguente contenuto.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'Avviamo PostgreSQL. PostgreSQL avvierà il processo di recupero dagli archivi WAL e solo dopo il database verrà aperto.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logRipristino a un momento specifico.
Se vogliamo ripristinare il database a un minuto specifico, aggiungiamo nel recovery.conf il parametro recovery_target_time — indichiamo a quale ora ripristinare il database.
restore_command = '\/usr\/local\/bin\/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'Dopo il ripristino guardiamo la tabella 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+00Avviamo PostgreSQL. PostgreSQL avvierà il processo di recupero dagli archivi WAL e solo dopo il database verrà aperto.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logTest
Generiamo un database di 1 GB come descritto qui
Richiediamo la dimensione del bucket dopo aver generato 1 GB di dati.
postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MBs4cmd è uno strumento gratuito da linea di comando per lavorare con i dati memorizzati su Amazon S3. L'utilità è scritta in Python, perciò può essere utilizzata sia su Windows che su Linux.
Installiamo s4cmd
pip install s4cmdLZ4
s4cmd --endpoint-url=http:\/\/ip-адрес-сервера-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3:\/\/pg-backups
840540822 s3:\/\/pg-backups\/wal_005\/\n840 MB in formato lz4 solo log WAL
Backup completo con lz4 - 1 GB di dati
time backup_push.sh
real 0m18.582s
Dimensione del bucket S3 dopo il backup completo
581480085 s3:\/\/pg-backups\/basebackups_005\/\n842374424 s3:\/\/pg-backups\/wal_005\n581 MB occupa il backup completoLZMA
Dopo la generazione di 1 GB di dati
338413694 s3:\/\/pg-backups\/wal_005\/\n338 MB di log in formato lzma
Tempo di generazione del backup completo
time backup_push.sh
real 5m25.054s
Dimensione del bucket in S3
270310495 s3:\/\/pg-backups\/basebackups_005\/\n433485092 s3:\/\/pg-backups\/wal_005\/\n
270 MB occupa il backup completo in formato lzmaBrotli
Dopo la generazione di 1 GB di dati
459229886 s3:\/\/pg-backups\/wal_005\/\n459 MB di log in formato brotli
Tempo di generazione del backup completo
real 0m23.408s
Dimensione del bucket in S3
312960942 s3:\/\/pg-backups\/basebackups_005\/\n459309262 s3:\/\/pg-backups\/wal_005\/\n
312 MB occupa il backup completo in formato brotli
Confronto dei risultati nel grafico.

Come vediamo, Brotli è comparabile in dimensione con LZMA, ma il backup viene eseguito in tempo LZ4.
Chat della comunità di PostgreSQL in lingua russa:
Per favore mettete una stella su Github se lo utilizzate
Fonte: habr.com
