Pengantar sistem cadangan wal-g PostgreSQL

WAL-G adalah alat sederhana dan efektif untuk mencadangkan PostgreSQL ke cloud. Dalam hal fungsi utamanya, ini adalah pewaris alat yang populer WAL-E, tetapi ditulis ulang di Go. Namun ada satu fitur baru yang penting di WAL-G - salinan delta. salinan delta WAL-G 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: Kami melakukan overclock pada cadangan. Kuliah Yandex

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 http://ip-адрСс-сСрвСра-minio:9000 dan buat bucket (misalnya, pg-backup).

server DB

WAL-G dalam rpm dirakit oleh saya (Anton Patsev). Github, Fedora COPR.

Siapa yang tidak memiliki sistem berbasis RPM, gunakan yang resmi petunjuk 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.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 https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

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.

Pengantar sistem cadangan wal-g PostgreSQL

Seperti yang Anda lihat, ukuran Brotli sebanding dengan LZMA, tetapi pencadangan dilakukan dalam waktu LZ4.

Obrolan komunitas PostgreSQL berbahasa Rusia: https://t.me/pgsql

Tolong beri bintang ke Github jika Anda menggunakannya wal-g

Sumber: www.habr.com

Tambah komentar