adalah alat sederhana dan efektif untuk mencadangkan PostgreSQL ke cloud. Dalam hal fungsi utamanya, ini adalah pewaris alat yang populer , tetapi ditulis ulang di Go. Namun ada satu fitur baru yang penting di WAL-G - salinan delta. salinan delta menyimpan halaman file yang telah berubah sejak versi cadangan sebelumnya. WAL-G mengimplementasikan cukup banyak teknologi untuk memparalelkan pencadangan. WAL-G jauh lebih cepat daripada WAL-E.
Detail cara kerja wal-g dapat ditemukan di artikel:
Protokol penyimpanan S3 telah menjadi populer untuk menyimpan data. Salah satu keunggulan S3 adalah kemampuan akses melalui API, yang memungkinkan Anda mengatur interaksi fleksibel dengan penyimpanan, termasuk akses baca publik, sementara informasi dalam penyimpanan hanya diperbarui oleh orang yang berwenang.
Ada beberapa implementasi penyimpanan publik dan pribadi yang menggunakan protokol S3. Hari ini kita akan melihat solusi populer untuk mengatur penyimpanan kecil - Minio.
Satu server PostgreSQL dapat digunakan untuk menguji wal-g, dan Minio digunakan sebagai pengganti S3.
Server Mini
Instalasi mini
yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minioEdit AccessKey dan SecretKey di /etc/minio/minio.conf
vi /etc/minio/minio.confJika Anda tidak akan menggunakan nginx sebelum Minio, maka Anda perlu mengubahnya
--address 127.0.0.1:9000--address 0.0.0.0:9000Meluncurkan Minio
systemctl start minioBuka antarmuka web Minio dan buat bucket (misalnya, pg-backup).
server DB
WAL-G dalam rpm dirakit oleh saya (Anton Patsev). , .
Siapa yang tidak memiliki sistem berbasis RPM, gunakan yang resmi dengan instalasi.
Bersama dengan biner wal-g, rpm berisi skrip yang mengimpor variabel dari file /etc/wal-gd/server-s3.conf.
backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.shInstal Walg.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gMemeriksa versi wal-g.
wal-g --version
wal-g version v0.2.14Edit /etc/wal-gd/server-s3.conf sesuai kebutuhan Anda.
File konfigurasi dan file data yang digunakan oleh cluster database secara tradisional disimpan bersama dalam direktori data cluster, yang biasa disebut 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 # ΠΠ°ΠΊΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΆΠ°ΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ.
Saat mengonfigurasi WAL-G, Anda menentukan WALG_DELTA_MAX_STEPS - jumlah langkah maksimum cadangan delta dari cadangan dasar, dan menentukan kebijakan penyalinan delta. Entah Anda membuat salinan dari delta terakhir yang ada, atau Anda membuat delta dari cadangan penuh asli. Hal ini diperlukan jika komponen database yang sama selalu berubah di database Anda, data yang sama terus berubah.
Menginstal basis 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 menginisialisasi database.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKJika Anda menguji pada 1 server, maka Anda perlu mengkonfigurasi ulang parameter wal_level untuk mengarsipkan PostgreSQL kurang dari versi 10, dan replika untuk PostgreSQL versi 10 dan yang lebih lama.
wal_level = archiveMari kita backup arsip WAL setiap 60 detik menggunakan PostgreSQL itu sendiri. Pada prod, Anda akan memiliki nilai archive_timeout yang berbeda.
archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # ΠΠ°ΠΆΠ΄ΡΠ΅ 60 ΡΠ΅ΠΊΡΠ½Π΄ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° archive_command.Memulai PostgreSQL
systemctl start postgresql-9.6Di konsol terpisah, kami melihat log PostgreSQL untuk mencari kesalahan: (ubah postgresql-Wed.log ke yang sekarang).
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logAyo pergi ke psql.
su - postgres
psqlBuat database di psql
Buat tabel di database test1.
create database test1;Beralih ke tes database.
postgres=# c test1;Kami membuat tabel indexing_table.
test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());Menambahkan data.
Kami mulai memasukkan data. Kami menunggu 10-20 menit.
#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
donePastikan untuk membuat cadangan penuh.
su - postgres
/usr/local/bin/backup-push.shKami melihat catatan dalam tabel di 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+Stringnya adalah waktu saat ini.
Lihat daftar cadangan lengkap
/usr/local/bin/backup-list.shPengujian pemulihan
Pemulihan penuh dengan menggulirkan semua WAL yang tersedia.
Hentikan Postgresql.
Hapus semuanya dari 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.shEkstraksi cadangan selesai.
Tambahkan recovery.conf ke folder /var/lib/pgsql/9.6/data dengan konten berikut.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'Kami memulai PostgreSQL. PostgreSQL akan memulai proses pemulihan dari WAL yang diarsipkan, dan baru setelah itu database akan terbuka.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logPemulihan untuk waktu tertentu.
Jika kita ingin memulihkan database hingga menit tertentu, maka kita menambahkan parameter recovery_target_time ke recovery.conf - kita menunjukkan jam berapa untuk memulihkan database.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'Setelah pemulihan, lihat tabel 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 memulai PostgreSQL. PostgreSQL akan memulai proses pemulihan dari WAL yang diarsipkan, dan baru setelah itu database akan terbuka.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logPengujian
Menghasilkan database 1GB seperti yang dijelaskan di sini
Meminta ukuran keranjang setelah menghasilkan 1 GB data.
postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MBs4cmd β Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Amazon S3. Π£ΡΠΈΠ»ΠΈΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° ΡΠ·ΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ python, ΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΈ WindowsDan Linux.
Menginstal 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 hasil pada grafik.

Seperti yang Anda lihat, ukuran Brotli sebanding dengan LZMA, tetapi pencadangan dilakukan dalam waktu LZ4.
Obrolan komunitas PostgreSQL berbahasa Rusia:
Tolong beri bintang ke Github jika Anda menggunakannya
Sumber: www.habr.com
