هي أداة بسيطة وفعالة لعمل نسخة احتياطية من 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 وقم بإنشاء مجموعة (على سبيل المثال، نسخ احتياطية من 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 جيجابايت كما هو موضح هنا
طلب حجم المجموعة بعد توليد 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 мб занимает полный бекап в формате lzmaBrotli
После генерации 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
