wal-g PostgreSQL yedekleme sistemine giriş

Wal-G PostgreSQL'i bulutlara yedeklemek için basit ve etkili bir araçtır. Ana işlevselliği açısından popüler aracın varisidir WAL-E, ancak Go'da yeniden yazıldı. Ancak WAL-G delta kopyalarında önemli bir yeni özellik var. delta kopyaları Wal-G Önceki yedekleme sürümünden bu yana değişen dosyaların sayfalarını saklayın. WAL-G, yedeklemeleri paralelleştirmek için oldukça fazla teknoloji uygulamaktadır. WAL-G, WAL-E'den çok daha hızlıdır.

Wal-g'nin nasıl çalıştığına ilişkin ayrıntıları makalede bulabilirsiniz: Yedeklemeyi overclock ediyoruz. Yandex dersi

S3 depolama protokolü veri depolamak için popüler hale geldi. S3'ün avantajlarından biri, depolama alanındaki bilgilerin güncellenmesi yalnızca yetkili kişiler tarafından yapılırken, genel okuma erişimi de dahil olmak üzere depolama alanıyla esnek etkileşimi düzenlemenize olanak tanıyan API aracılığıyla erişim yeteneğidir.

S3 protokolünü kullanan çeşitli genel ve özel depolama uygulamaları vardır. Bugün küçük depolamayı düzenlemek için popüler bir çözüme bakacağız - Minio.

Wal-g'yi test etmek için tek bir PostgreSQL sunucusu uygundur ve S3'ün yerine Minio kullanılır.

Mini sunucu

Minio kurulumu

yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minio

AccessKey ve SecretKey'i /etc/minio/minio.conf dosyasında düzenleyin

vi /etc/minio/minio.conf

Minio'dan önce nginx kullanmayacaksanız değiştirmeniz gerekir

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Minio'yu Başlatma

systemctl start minio

Minio web arayüzüne gidin http://ip-адрес-сервера-minio:9000 ve bir paket oluşturun (örneğin, pg-backups).

Veritabanı sunucusu

WAL-G rpm'de benim tarafımdan monte edilmiştir (Anton Patsev). Github, Fedora COPR.

Kim RPM tabanlı bir sisteme sahip değilse, resmi kullanın talimat Kurulum yoluyla.

Wal-g ikili dosyasıyla birlikte rpm, /etc/wal-gd/server-s3.conf dosyasından değişkenleri içe aktaran komut dosyalarını içerir.

backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.sh

Walg'ı yükleyin.

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

Wal-g sürümü kontrol ediliyor.

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

/etc/wal-gd/server-s3.conf dosyasını ihtiyaçlarınıza göre düzenleyin.

Bir veritabanı kümesi tarafından kullanılan yapılandırma dosyaları ve veri dosyaları, geleneksel olarak küme veri dizininde birlikte depolanır; 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 # Какой метод сжатия использовать.

WAL-G'yi yapılandırırken, WALG_DELTA_MAX_STEPS'i (delta yedeklemesinin temel yedeklemeden maksimum olduğu adım sayısı) belirtirsiniz ve delta kopyalama politikasını belirtirsiniz. Ya var olan son deltanın bir kopyasını alırsınız ya da orijinal tam yedeklemeden bir delta oluşturursunuz. Bu, veritabanının aynı bileşeninin veritabanınızda sürekli değişmesi durumunda, aynı verilerin sürekli değişmesi durumunda gereklidir.

Veritabanının kurulumu.

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

Veritabanını başlatıyoruz.

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

1 sunucuda test yapıyorsanız, Wal_level parametresini PostgreSQL sürüm 10'dan düşük olanlar için arşivlemek ve PostgreSQL sürüm 10 ve üzeri için replikasyon yapmak üzere yeniden yapılandırmanız gerekir.

wal_level = archive

PostgreSQL'in kendisini kullanarak WAL arşivlerini her 60 saniyede bir yedekleyelim. Prod'da farklı bir archive_timeout değerine sahip olacaksınız.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Каждые 60 секунд будет выполнятся команда archive_command.

PostgreSQL'i Başlatmak

systemctl start postgresql-9.6

Ayrı bir konsolda hatalar için PostgreSQL günlüklerine bakıyoruz: (postgresql-Wed.log'u mevcut olanla değiştirin).

tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Haydi psql'e gidelim.

su - postgres
psql

psql'de veritabanı oluşturma

Test1 veritabanında bir tablo oluşturun.

create database test1;

Veritabanı testine geçin.

postgres=# c test1;

indexing_table tablosunu oluşturuyoruz.

test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());

Veri ekleme.

Veri eklemeye başlıyoruz. 10-20 dakika kadar bekliyoruz.

#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
done

Tam yedekleme yaptığınızdan emin olun.

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

Test1 veritabanındaki tablodaki kayıtlara bakıyoruz.

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+

Dize geçerli zamandır.

Tam yedeklemelerin listesine bakın

/usr/local/bin/backup-list.sh

Kurtarma testi

Mevcut tüm WAL'ların yuvarlanmasıyla tam iyileşme.

Postgresql'i durdurun.

/var/lib/pgsql/9.6/data klasöründeki her şeyi silin.

Postgres kullanıcısı olarak /usr/local/bin/backup-fetch.sh betiğini çalıştırın.

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

Yedekleme çıkarma işlemi tamamlandı.

Recovery.conf dosyasını aşağıdaki içeriğe sahip /var/lib/pgsql/9.6/data klasörüne ekleyin.

restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'

PostgreSQL'i başlatıyoruz. PostgreSQL, arşivlenen WAL'lerden kurtarma işlemini başlatacak ve ancak o zaman veritabanı açılacaktır.

systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Belirli bir süre için iyileşme.

Veritabanını belirli bir dakikaya kadar geri yüklemek istiyorsak, Recovery.conf'a Recovery_target_time parametresini ekliyoruz - veritabanını ne zaman geri yükleyeceğimizi belirtiyoruz.

restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'

İyileştikten sonra indexing_table tablosuna bakın

 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

PostgreSQL'i başlatıyoruz. PostgreSQL, arşivlenen WAL'lerden kurtarma işlemini başlatacak ve ancak o zaman veritabanı açılacaktır.

systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Test

Burada açıklandığı gibi 1 GB'lık bir veritabanı oluşturuluyor https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

1 GB veri oluşturulduktan sonra paket boyutu isteniyor.

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

s4cmd, Amazon S3 depolama alanında bulunan verilerle çalışmaya yönelik ücretsiz bir komut satırı aracıdır. Yardımcı program python programlama dilinde yazılmıştır ve bu nedenle hem Windows hem de Linux işletim sistemlerinde kullanılabilir.

s4cmd'yi yükleme

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

Grafikteki sonuçların karşılaştırılması.

wal-g PostgreSQL yedekleme sistemine giriş

Gördüğünüz gibi Brotli, boyut olarak LZMA ile karşılaştırılabilir ancak yedekleme LZ4 zamanında gerçekleştirilir.

Rusça konuşan PostgreSQL topluluğunun sohbeti: https://t.me/pgsql

Lütfen kullanıyorsanız Github'a bir yıldız verin vel-g

Kaynak: habr.com

Yorum ekle