Pengenalan kepada sistem sandaran wal-g PostgreSQL

WAL-G ialah alat yang mudah dan berkesan untuk membuat sandaran PostgreSQL ke awan. Dari segi fungsi utamanya, ia adalah pewaris kepada alat yang popular WAL-E, tetapi ditulis semula dalam Go. Tetapi terdapat satu ciri baharu yang penting dalam WAL-G - salinan delta. salinan delta WAL-G 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: Kami overclock sandaran. Syarahan Yandex

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 minio

Edit AccessKey dan SecretKey dalam /etc/minio/minio.conf

vi /etc/minio/minio.conf

Jika anda tidak akan menggunakan nginx sebelum Minio, maka anda perlu menukar

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Melancarkan Minio

systemctl start minio

Pergi ke antara muka web Minio http://ip-адрСс-сСрвСра-minio:9000 dan buat baldi (contohnya, pg-backups).

pelayan DB

WAL-G dalam rpm dipasang oleh saya (Anton Patsev). Github, CPR Fedora.

Siapa yang tidak mempunyai sistem berasaskan RPM, gunakan rasmi arahan 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.sh

Pasang walg.

yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-g

Menyemak versi wal-g.

wal-g --version
wal-g version v0.2.14

Edit /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 mc

Kami memulakan pangkalan data.

/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK

Jika 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 = archive

Mari 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.6

Dalam 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.log

Mari pergi ke psql.

su - postgres
psql

Buat 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;
done

Pastikan anda membuat sandaran penuh.

su - postgres
/usr/local/bin/backup-push.sh

Kami 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.sh

Ujian 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.sh

Pengekstrakan 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.log

Pemulihan 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+00

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.log

Ujian

Menjana pangkalan data 1GB seperti yang diterangkan di sini https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Meminta saiz baldi selepas menjana 1GB data.

postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MB

s4cmd β€” бСсплатный инструмСнт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, располоТСнными Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Amazon S3. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° написана Π½Π° языкС программирования python, ΠΈ благодаря этому ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах ΠΈ Windowsdan Linux.

Memasang 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 keputusan pada carta.

Pengenalan kepada sistem sandaran wal-g PostgreSQL

Seperti yang anda lihat, saiz Brotli adalah setanding dengan LZMA, tetapi sandaran dilakukan dalam masa LZ4.

Sembang komuniti PostgreSQL berbahasa Rusia: https://t.me/pgsql

Sila berikan bintang kepada Github jika anda menggunakan wal-g

Sumber: www.habr.com

Beli pengehosan yang boleh dipercayai untuk tapak dengan perlindungan DDoS, pelayan VPS VDS πŸ”₯ Beli pengehosan laman web yang boleh dipercayai dengan perlindungan DDoS, pelayan VPS VDS | ProHoster