مقدمه ای بر سیستم پشتیبان گیری wal-g PostgreSQL

WAL-G یک ابزار ساده و موثر برای پشتیبان گیری از PostgreSQL در فضای ابری است. از نظر عملکرد اصلی، وارث ابزار محبوب است WAL-E، اما در Go بازنویسی شده است. اما یک ویژگی جدید مهم در WAL-G وجود دارد - کپی های دلتا. کپی های دلتا WAL-G صفحات فایل هایی را که نسبت به نسخه پشتیبان قبلی تغییر کرده اند ذخیره کنید. WAL-G فناوری‌های زیادی را برای موازی‌سازی نسخه‌های پشتیبان پیاده‌سازی می‌کند. WAL-G بسیار سریعتر از WAL-E است.

جزئیات نحوه عملکرد wal-g را می توان در مقاله یافت: ما پشتیبان را اورکلاک می کنیم. سخنرانی Yandex

پروتکل ذخیره سازی 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 minio

AccessKey و 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 بروید http://ip-адрес-сервера-minio:9000 و یک سطل (مثلاً پشتیبان گیری از pg) ایجاد کنید.

سرور DB

WAL-G در دور در دقیقه توسط من (آنتون پاتسف) مونتاژ شده است. گیتهاب, فدورا COPR.

کسانی که سیستم مبتنی بر 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.sh

walg را نصب کنید.

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

PostgreSQL را شروع می کنیم. PostgreSQL فرآیند بازیابی را از WAL های بایگانی شده شروع می کند و تنها پس از آن پایگاه داده باز می شود.

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

آزمایش

ایجاد یک پایگاه داده 1 گیگابایتی همانطور که در اینجا توضیح داده شده است https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

درخواست اندازه سطل پس از تولید 1 گیگابایت داده.

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

s4cmd — бесплатный инструмент командной строки для работы с данными, расположенными в хранилище Amazon S3. Утилита написана на языке программирования python, и благодаря этому может использоваться в операционных системах и Windowsو Linux.

نصب 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

برتلی

После генерации 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

مقایسه نتایج روی نمودار

مقدمه ای بر سیستم پشتیبان گیری wal-g PostgreSQL

همانطور که می بینید، Brotli از نظر اندازه با LZMA قابل مقایسه است، اما پشتیبان گیری در زمان LZ4 انجام می شود.

چت جامعه روسی زبان PostgreSQL: https://t.me/pgsql

لطفا در صورت استفاده به Github یک ستاره بدهید وال-گ

منبع: www.habr.com

خرید هاست قابل اعتماد برای سایت های دارای حفاظت DDoS، سرورهای VPS VDS 🔥 خرید هاستینگ معتبر با محافظت در برابر حملات DDoS، سرورهای VPS و VDS | ProHoster