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 minio
Edit AccessKey dan SecretKey di /etc/minio/minio.conf
vi /etc/minio/minio.conf
Jika Anda tidak akan menggunakan nginx sebelum Minio, maka Anda perlu mengubahnya
--address 127.0.0.1:9000
--address 0.0.0.0:9000
Meluncurkan Minio
systemctl start minio
Buka antarmuka web Minio
server DB
WAL-G dalam rpm dirakit oleh saya (Anton Patsev).
Siapa yang tidak memiliki sistem berbasis RPM, gunakan yang resmi
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.sh
Instal Walg.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-g
Memeriksa versi wal-g.
wal-g --version
wal-g version v0.2.14
Edit /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 mc
Kami menginisialisasi database.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK
Jika 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 = archive
Mari 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.6
Di 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.log
Ayo pergi ke psql.
su - postgres
psql
Buat 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;
done
Pastikan untuk membuat cadangan penuh.
su - postgres
/usr/local/bin/backup-push.sh
Kami 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.sh
Pengujian 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.sh
Ekstraksi 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.log
Pemulihan 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+00
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.log
Pengujian
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 MB
s4cmd adalah alat baris perintah gratis untuk bekerja dengan data yang berada di penyimpanan Amazon S3. Utilitas ini ditulis dalam bahasa pemrograman python, dan karenanya dapat digunakan di sistem operasi Windows dan Linux.
Menginstal 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
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