مقدمة لنظام النسخ الاحتياطي wal-g PostgreSQL

وول جي هي أداة بسيطة وفعالة لعمل نسخة احتياطية من PostgreSQL على السحابة. من حيث وظيفتها الرئيسية، فهو وريث الأداة الشعبية وول-إي، ولكن أعيد كتابتها في Go. ولكن هناك ميزة جديدة مهمة في WAL-G - نسخ الدلتا. نسخ دلتا وول جي تخزين صفحات الملفات التي تغيرت منذ الإصدار الاحتياطي السابق. تطبق WAL-G عددًا لا بأس به من التقنيات لموازاة النسخ الاحتياطية. WAL-G أسرع بكثير من WAL-E.

يمكن العثور على تفاصيل حول كيفية عمل wal-g في المقالة: نحن فيركلوك النسخ الاحتياطي. محاضرة ياندكس

أصبح بروتوكول التخزين S3 شائعًا لتخزين البيانات. إحدى مزايا S3 هي القدرة على الوصول عبر واجهة برمجة التطبيقات (API)، والتي تتيح لك تنظيم تفاعل مرن مع وحدة التخزين، بما في ذلك الوصول العام للقراءة، بينما يتم تحديث المعلومات في وحدة التخزين فقط من قبل الأشخاص المصرح لهم.

هناك العديد من تطبيقات التخزين العامة والخاصة التي تستخدم بروتوكول S3. سننظر اليوم إلى حل شائع لتنظيم وحدات تخزين صغيرة - Minio.

يعد خادم PostgreSQL واحدًا مناسبًا لاختبار wal-g، ويتم استخدام Minio كبديل لـ S3.

خادم مينيو

تركيب مينيو

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

إذا كنت لن تستخدم nginx قبل Minio، فأنت بحاجة إلى التغيير

--address 127.0.0.1:9000

--address 0.0.0.0:9000

إطلاق مينيو

systemctl start minio

انتقل إلى واجهة الويب Minio http://ip-адрес-сервера-minio:9000 وقم بإنشاء مجموعة (على سبيل المثال، نسخ احتياطية من pg).

خادم قاعدة البيانات

تم تجميع 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.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

إذا كنت تختبر على خادم واحد، فأنت بحاجة إلى إعادة تكوين معلمة wal_level لأرشفة PostgreSQL أقل من الإصدار 1، والنسخة المتماثلة لـ PostgreSQL الإصدار 10 والأقدم.

wal_level = archive

لنقم بعمل نسخة احتياطية من أرشيفات WAL كل 60 ثانية باستخدام PostgreSQL نفسها. في المنتج، سيكون لديك قيمة 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 عملية الاسترداد من WALs المؤرشفة، وعندها فقط سيتم فتح قاعدة البيانات.

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 عملية الاسترداد من WALs المؤرشفة، وعندها فقط سيتم فتح قاعدة البيانات.

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

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

مقارنة النتائج على الرسم البياني.

مقدمة لنظام النسخ الاحتياطي wal-g PostgreSQL

كما ترون، Brotli مشابه في الحجم لـ LZMA، ولكن يتم إجراء النسخ الاحتياطي في وقت LZ4.

دردشة مجتمع PostgreSQL الناطق باللغة الروسية: https://t.me/pgsql

يرجى إعطاء نجمة لـ Github إذا كنت تستخدمها وول جي

المصدر: www.habr.com

شراء استضافة موثوقة للمواقع مع حماية DDoS وخوادم VPS VDS 🔥 اشترِ استضافة مواقع ويب موثوقة مع حماية من هجمات DDoS، وخوادم VPS وVDS | ProHoster