ialah alat yang mudah dan berkesan untuk membuat sandaran PostgreSQL ke awan. Dari segi fungsi utamanya, ia adalah pewaris kepada alat yang popular , tetapi ditulis semula dalam Go. Tetapi terdapat satu ciri baharu yang penting dalam WAL-G - salinan delta. salinan delta simpan halaman fail yang telah berubah sejak versi sandaran sebelumnya. WAL-G melaksanakan cukup banyak teknologi untuk menyelaraskan sandaran. WAL-G jauh lebih pantas daripada WAL-E.
Butiran tentang cara wal-g berfungsi boleh didapati dalam artikel:
Protokol storan S3 telah menjadi popular untuk menyimpan data. Salah satu kelebihan S3 ialah keupayaan untuk mengakses melalui API, yang membolehkan anda mengatur interaksi fleksibel dengan storan, termasuk akses baca awam, manakala mengemas kini maklumat dalam storan hanya berlaku oleh orang yang diberi kuasa.
Terdapat beberapa pelaksanaan storan awam dan persendirian yang menggunakan protokol S3. Hari ini kita akan melihat penyelesaian popular untuk mengatur storan kecil - Minio.
Pelayan PostgreSQL tunggal adalah baik untuk menguji wal-g, dan Minio digunakan sebagai pengganti S3.
pelayan minio
Pemasangan minio
yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minioEdit AccessKey dan SecretKey dalam /etc/minio/minio.conf
vi /etc/minio/minio.confJika anda tidak akan menggunakan nginx sebelum Minio, maka anda perlu menukar
--address 127.0.0.1:9000--address 0.0.0.0:9000Melancarkan Minio
systemctl start minioPergi ke antara muka web Minio dan buat baldi (contohnya, pg-backups).
pelayan DB
WAL-G dalam rpm dipasang oleh saya (Anton Patsev). , .
Siapa yang tidak mempunyai sistem berasaskan RPM, gunakan rasmi secara pemasangan.
Bersama-sama dengan binari wal-g, rpm mengandungi skrip yang mengimport pembolehubah daripada fail /etc/wal-gd/server-s3.conf.
backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.shPasang walg.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gMenyemak versi wal-g.
wal-g --version
wal-g version v0.2.14Edit /etc/wal-gd/server-s3.conf mengikut keperluan anda.
Fail konfigurasi dan fail data yang digunakan oleh kluster pangkalan data secara tradisinya disimpan bersama dalam direktori data kluster, biasanya dirujuk sebagai 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 # ΠΠ°ΠΊΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΆΠ°ΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ.
Apabila mengkonfigurasi WAL-G, anda tentukan WALG_DELTA_MAX_STEPS - bilangan langkah yang sandaran delta adalah maksimum daripada sandaran asas dan tentukan dasar penyalinan delta. Sama ada anda membuat salinan daripada delta sedia ada yang terakhir, atau anda membuat delta daripada sandaran penuh asal. Ini adalah perlu sekiranya komponen pangkalan data yang sama sentiasa berubah dalam pangkalan data anda, data yang sama sentiasa berubah.
Memasang pangkalan data.
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 mcKami memulakan pangkalan data.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKJika anda menguji pada 1 pelayan, maka anda perlu mengkonfigurasi semula parameter wal_level untuk mengarkibkan PostgreSQL kurang daripada versi 10 dan replika untuk PostgreSQL versi 10 dan lebih lama.
wal_level = archiveMari sandarkan arkib WAL setiap 60 saat menggunakan PostgreSQL sendiri. Pada prod, anda akan mempunyai nilai archive_timeout yang berbeza.
archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # ΠΠ°ΠΆΠ΄ΡΠ΅ 60 ΡΠ΅ΠΊΡΠ½Π΄ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° archive_command.Memulakan PostgreSQL
systemctl start postgresql-9.6Dalam konsol yang berasingan, kami melihat log PostgreSQL untuk ralat: (tukar postgresql-Wed.log kepada yang semasa).
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logMari pergi ke psql.
su - postgres
psqlBuat pangkalan data dalam psql
Cipta jadual dalam ujian pangkalan data1.
create database test1;Beralih kepada ujian pangkalan data.
postgres=# c test1;Kami mencipta jadual indexing_table.
test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());Menambah data.
Kami mula memasukkan data. Kami menunggu selama 10-20 minit.
#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
donePastikan anda membuat sandaran penuh.
su - postgres
/usr/local/bin/backup-push.shKami melihat rekod dalam jadual dalam ujian pangkalan data1
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+Rentetan ialah masa semasa.
Lihat senarai sandaran penuh
/usr/local/bin/backup-list.shUjian pemulihan
Pemulihan penuh dengan melancarkan semua WAL yang tersedia.
Hentikan Postgresql.
Padamkan semua daripada folder /var/lib/pgsql/9.6/data.
Jalankan skrip /usr/local/bin/backup-fetch.sh sebagai pengguna postgres.
su - postgres
/usr/local/bin/backup-fetch.shPengekstrakan sandaran selesai.
Tambahkan recovery.conf pada folder /var/lib/pgsql/9.6/data dengan kandungan berikut.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'Kami memulakan PostgreSQL. PostgreSQL akan memulakan proses pemulihan daripada WAL yang diarkibkan, dan hanya selepas itu pangkalan data akan dibuka.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logPemulihan untuk masa tertentu.
Jika kami ingin memulihkan pangkalan data sehingga minit tertentu, maka kami menambah parameter recovery_target_time ke recovery.conf - kami menunjukkan pada masa untuk memulihkan pangkalan data.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'Selepas pemulihan, lihat jadual 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+00Kami memulakan PostgreSQL. PostgreSQL akan memulakan proses pemulihan daripada WAL yang diarkibkan, dan hanya selepas itu pangkalan data akan dibuka.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logUjian
Menjana pangkalan data 1GB seperti yang diterangkan di sini
Meminta saiz baldi selepas menjana 1GB data.
postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MBs4cmd β Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Amazon S3. Π£ΡΠΈΠ»ΠΈΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° ΡΠ·ΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ python, ΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΈ Windowsdan Linux.
Memasang 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/
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 ΠΌΠ± Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΡΠΉ Π±Π΅ΠΊΠ°ΠΏ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ lzmaBrotli
ΠΠΎΡΠ»Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ 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
Perbandingan keputusan pada carta.

Seperti yang anda lihat, saiz Brotli adalah setanding dengan LZMA, tetapi sandaran dilakukan dalam masa LZ4.
Sembang komuniti PostgreSQL berbahasa Rusia:
Sila berikan bintang kepada Github jika anda menggunakan
Sumber: www.habr.com
