یک ابزار ساده و موثر برای پشتیبان گیری از PostgreSQL در فضای ابری است. از نظر عملکرد اصلی، وارث ابزار محبوب است ، اما در Go بازنویسی شده است. اما یک ویژگی جدید مهم در WAL-G وجود دارد - کپی های دلتا. کپی های دلتا صفحات فایل هایی را که نسبت به نسخه پشتیبان قبلی تغییر کرده اند ذخیره کنید. WAL-G فناوریهای زیادی را برای موازیسازی نسخههای پشتیبان پیادهسازی میکند. WAL-G بسیار سریعتر از WAL-E است.
جزئیات نحوه عملکرد wal-g را می توان در مقاله یافت:
پروتکل ذخیره سازی S3 برای ذخیره سازی داده ها محبوب شده است. یکی از مزایای S3 امکان دسترسی از طریق API است که به شما امکان می دهد تعامل انعطاف پذیر با ذخیره سازی را سازماندهی کنید، از جمله دسترسی به خواندن عمومی، در حالی که به روز رسانی اطلاعات در ذخیره سازی فقط توسط افراد مجاز انجام می شود.
چندین پیاده سازی ذخیره سازی عمومی و خصوصی وجود دارد که از پروتکل S3 استفاده می کنند. امروز ما به یک راه حل محبوب برای سازماندهی ذخیره سازی کوچک - Minio نگاه خواهیم کرد.
یک سرور PostgreSQL برای آزمایش wal-g مناسب است و Minio به عنوان جایگزینی برای S3 استفاده می شود.
سرور Minio
نصب Minio
yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minioAccessKey و SecretKey را در /etc/minio/minio.conf ویرایش کنید
vi /etc/minio/minio.confاگر قبل از Minio از nginx استفاده نمی کنید، باید تغییر دهید
--address 127.0.0.1:9000--address 0.0.0.0:9000راه اندازی Minio
systemctl start minioبه رابط وب Minio بروید و یک سطل (مثلاً پشتیبان گیری از pg) ایجاد کنید.
سرور DB
WAL-G در دور در دقیقه توسط من (آنتون پاتسف) مونتاژ شده است. , .
کسانی که سیستم مبتنی بر RPM ندارند، از رسمی استفاده کنند با نصب
همراه با باینری wal-g، rpm حاوی اسکریپت هایی است که متغیرها را از فایل /etc/wal-gd/server-s3.conf وارد می کند.
backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.shwalg را نصب کنید.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gدر حال بررسی نسخه wal-g.
wal-g --version
wal-g version v0.2.14/etc/wal-gd/server-s3.conf را مطابق نیاز خود ویرایش کنید.
فایلهای پیکربندی و فایلهای دادهای که توسط یک خوشه پایگاه داده استفاده میشوند، به طور سنتی با هم در فهرست دایرکتوری دادههای خوشهای ذخیره میشوند که معمولاً به آنها گفته میشود. 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، WALG_DELTA_MAX_STEPS را مشخص میکنید - تعداد مراحلی که نسخه پشتیبان دلتا حداکثر از پشتیبانگیری پایه است، و خط مشی کپی دلتا را مشخص میکنید. یا از آخرین دلتای موجود یک کپی می گیرید یا از نسخه پشتیبان کامل اصلی یک دلتا می سازید. این در صورتی ضروری است که وقتی همان مؤلفه پایگاه داده در پایگاه داده شما همیشه در حال تغییر است، همان داده ها دائماً در حال تغییر هستند.
نصب دیتابیس
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پایگاه داده را مقدار دهی اولیه می کنیم.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKاگر روی 1 سرور آزمایش می کنید، باید پارامتر wal_level را برای بایگانی برای PostgreSQL کمتر از نسخه 10 و replica برای PostgreSQL نسخه 10 و بالاتر پیکربندی کنید.
wal_level = archiveبیایید با استفاده از خود PostgreSQL هر 60 ثانیه یکبار از آرشیوهای WAL پشتیبان تهیه کنیم. در prod، مقدار archive_timeout متفاوتی خواهید داشت.
archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Каждые 60 секунд будет выполнятся команда archive_command.شروع PostgreSQL
systemctl start postgresql-9.6در یک کنسول جداگانه، ما به گزارشهای PostgreSQL برای خطاها نگاه میکنیم: (postgresql-Wed.log را به فعلی تغییر دهید).
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logبریم سراغ psql.
su - postgres
psqlایجاد پایگاه داده در psql
یک جدول در پایگاه داده test1 ایجاد کنید.
create database test1;به آزمایش پایگاه داده بروید.
postgres=# c test1;جدول indexing_table را ایجاد می کنیم.
test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());افزودن داده ها
ما شروع به درج داده ها می کنیم. 10-20 دقیقه منتظریم.
#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
doneحتما یک نسخه پشتیبان کامل تهیه کنید.
su - postgres
/usr/local/bin/backup-push.shما به رکوردهای جدول در پایگاه داده 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+رشته زمان فعلی است.
لیست بک آپ های کامل را ببینید
/usr/local/bin/backup-list.shتست بازیابی
بازیابی کامل با چرخاندن همه WAL موجود.
Postgresql را متوقف کنید.
همه چیز را از پوشه /var/lib/pgsql/9.6/data حذف کنید.
اسکریپت /usr/local/bin/backup-fetch.sh را به عنوان کاربر postgres اجرا کنید.
su - postgres
/usr/local/bin/backup-fetch.shاستخراج نسخه پشتیبان کامل شد.
Recovery.conf را به پوشه /var/lib/pgsql/9.6/data با محتوای زیر اضافه کنید.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'PostgreSQL را شروع می کنیم. PostgreSQL فرآیند بازیابی را از WAL های بایگانی شده شروع می کند و تنها پس از آن پایگاه داده باز می شود.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logریکاوری برای مدت معین.
اگر بخواهیم پایگاه داده را تا یک دقیقه خاص بازیابی کنیم، پارامتر recovery_target_time را به recovery.conf اضافه می کنیم - نشان می دهیم که در چه زمانی باید پایگاه داده را بازیابی کنیم.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'پس از بازیابی، به جدول 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+00PostgreSQL را شروع می کنیم. PostgreSQL فرآیند بازیابی را از WAL های بایگانی شده شروع می کند و تنها پس از آن پایگاه داده باز می شود.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logآزمایش
ایجاد یک پایگاه داده 1 گیگابایتی همانطور که در اینجا توضیح داده شده است
درخواست اندازه سطل پس از تولید 1 گیگابایت داده.
postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MBs4cmd — бесплатный инструмент командной строки для работы с данными, расположенными в хранилище Amazon S3. Утилита написана на языке программирования python, и благодаря этому может использоваться в операционных системах и Windowsو Linux.
نصب 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 мб занимает полный бекап в формате lzmaبرتلی
После генерации 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
مقایسه نتایج روی نمودار

همانطور که می بینید، Brotli از نظر اندازه با LZMA قابل مقایسه است، اما پشتیبان گیری در زمان LZ4 انجام می شود.
چت جامعه روسی زبان PostgreSQL:
لطفا در صورت استفاده به Github یک ستاره بدهید
منبع: www.habr.com
