مرحبًا ، أنا ألكسندر نيكيتين ، مدير النظام الرئيسي لمجموعة BARS Group. في هذه المقالة ، أود أن أقدم لكم أداة pg_probackup .
Pg_probackup هو تطوير بواسطة Postgres Professional يساعد على عمل نسخ احتياطية من PostgreSQL DBMS. بخلاف الأداة المساعدة pg_basebackup القياسية ، تتيح لك هذه الأداة إنشاء نسخ احتياطية تدريجية على مستوى كتلة البيانات (8 كيلو بايت افتراضيًا) ، والتحقق من النسخ الاحتياطية ونظام إدارة قواعد البيانات ، وتعيين سياسات التخزين ، وغير ذلك الكثير.
في هذه المقالة ، لا أنوي وصف جميع الجوانب الممكنة للعمل مع pg_probackup ، أريد فقط أن أقدم فهمًا لكيفية استخدام هذه الأداة في عملك.
سيتم النظر في حالات الاستخدام التالية:
- wal-
1
معطى: لدينا خادمان (OS CentOS 7) ، في الأول لدينا قاعدة بياناتنا (hostname srv_db1 ، user postgres ، PostgreSQL 12.4 مثبت) ، والثاني سنخزن النسخ الاحتياطية (hostname srv_bkp ، user backup_user).
يجب تكوين النسخة الاحتياطية بحيث يتم تخزين نسخ مجموعة PostgreSQL على خادم srv_bkp.
الحل:
يمكن لـ pg_probackup العمل عبر وكلاء الإطلاق ssh على مضيف بعيد يستخدم اتصال ssh كقناة اتصال ونقل. وفقًا لذلك ، تحتاج إلى التأكد من أن backup_user الموجود على مضيف srv_bkp يمكنه الاتصال بمستخدم postgres على مضيف srv_db1.
1) قم بالاتصال بـ srv_bkp باستخدام backup_user وقم بتنفيذ الأوامر التالية:
ssh-keygen -t rsa
ssh-copy-id postgres@srv_db1
قم بتشغيل وضع بجنون العظمة وقم بتحرير الملف ~ / .ssh / author_keys على خادم srv_db1
قبل السطر الذي يحتوي على المفاتيح ، أدخل ما يلي:
command="pg_probackup-12 agent"
لذلك يجب أن ينتهي بك الأمر بشيء مثل هذا:
command="pg_probackup-12 agent" ssh-rsa AAAA....
نقول بهذا أنه لا يمكن إطلاق شيء سوى "وكيل pg_probackup-12" عبر SSH (يمكنك قراءة المزيد عن هذا هنا ).
2) نقوم بتثبيت pg_probackup على كلا الجهازين (في المثال نعمل على CentOS ، ولكن بالنسبة للتوزيعات الأخرى ، يتم وصف عملية التثبيت في الوثائق ):
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh https://repo.postgrespro.ru/pg_probackup/keys/pg_probackup-repo-centos.noarch.rpm
yum install pg_probackup-12
yum install pg_probackup-12-debuginfo
سيتم تثبيت أحدث إصدار متاح من pg_probackup ، في وقت كتابة هذا التقرير - 2.4.2.
3) أنشئ اسمًا مستعارًا على srv_bkp (هذا ليس ضروريًا ، ولكنه أكثر ملاءمة) وحدد متغيرًا يحتوي على المسار إلى الدليل مع النسخ الاحتياطية (بعد إنشاء هذا الدليل):
mkdir /home/backup_user/backup_db
echo "BACKUP_PATH=/home/backup_user/backup_db">>~/.bash_profile
echo "export BACKUP_PATH">>~/.bash_profile
echo "alias pg_probackup='pg_probackup-12'">>~/.bash_profile
تحميل الملف الشخصي
. .bash_profile
4) في srv_bkp ، قم بتهيئة دليل النسخ الاحتياطي وإضافة مثيل جديد:
pg_probackup init
أضف نسخة PostgreSQL إلى الدليل ، وأعطها الاسم db1 ، وحدد معلمات اتصال ssh - المضيف ، واسم المستخدم ، والمسار إلى PGDATA.
pg_probackup add-instance --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pgdata=/var/lib/pgsql/12/data
إذا ظهر الخط
INFO: Instance 'db1' successfully inited
لذلك كانت التهيئة ناجحة.
دعنا نحدد سياسة للاحتفاظ بالنسخ الاحتياطية:
pg_probackup set-config --instance db1 --retention-window=7 --retention-redundancy=2
تتلخص السياسة الناتجة في ما يلي:
من الضروري الاحتفاظ بجميع النسخ الاحتياطية أقل من 7 أيام ،
بينما يجب أن يكون عدد النسخ الاحتياطية الكاملة اثنين على الأقل
5) لإنشاء نسخ احتياطية ، تحتاج إلى الاتصال بنظام DBMS ، لذلك نقوم بإنشاء قاعدة بيانات في مجموعة PostgreSQL التي سيحدث الاتصال بها لإدارة عملية النسخ الاحتياطي (من وجهة نظر أمنية ، هذا أفضل من الاتصال بقاعدة بيانات المنتج) ، وكذلك تغيير معلمات قاعدة البيانات:
$ createdb backupdb
الانضمام إلى قاعدة بيانات جديدة
psql -d backupdb
إنشاء دور قاعدة بيانات نيابة عنه ستتم إدارة عملية النسخ الاحتياطي:
BEGIN;
CREATE ROLE backup WITH LOGIN REPLICATION password 'Strong_PWD';
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
دعنا ننتبه إلى المعلمة listen_addresses:
show listen_addresses;
إذا كان المضيف المحلي ، فقم بالتغيير إلى *
alter system set listen_addresses='*';
إذا قمت بتغيير listen_addresses ، فيجب إعادة تشغيل PostgreSQL.
لنرى أين حددنا موقع ملف pg_hba.conf
psql –c 'show hba_file'
أضف القواعد التالية إلى pg_hba.conf:
# pg_probackup access permission
host backupdb backup srv_bkp md5
host replication backup srv_bkp md5
نعيد قراءة التكوين:
psql -c 'select pg_reload_conf()'
نتحقق مما إذا كان هناك أي أخطاء إملائية:
psql -c 'select * from pg_hba_file_rules'
على srv_bkp ، في الدليل الرئيسي للمستخدم backup_user ، قم بإنشاء ملف نكتب فيه اسم الخادم أو عنوان IP الخاص به والمنفذ واسم قاعدة البيانات واسم المستخدم وكلمة المرور. هذا الملف مطلوب حتى يتم إدخال كلمة المرور تلقائيًا عند إنشاء نسخة احتياطية.
echo "srv_db1:5432:replication:backup:Strong_PWD">>~/.pgpass
echo "srv_db1:5432:backupdb:backup:Strong_PWD">>~/.pgpass
قم بتعيين حقوق الوصول الضرورية إلى هذا الملف
chmod 600 ~/.pgpass
وقم بإنشاء أول نسخة احتياطية:
pg_probackup backup --instance=db1 -j2 --backup-mode=FULL --compress --stream --delete-expired --pguser=backup --pgdatabase=backupdb --remote-host=srv_db1 --remote-user=postgres
إذا فعلنا كل شيء بشكل صحيح ، فسيظهر شيء كهذا على الشاشة:
INFO: Backup start, pg_probackup version: 2.4.2, instance: db1, backup ID: QFERC9, backup mode: FULL, wal mode: STREAM, remote: true, compress-algorithm: zlib, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
INFO: PGDATA size: 3373MB
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 1m:0s
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 1s
INFO: Validating backup QFERC9
INFO: Backup QFERC9 data files are valid
INFO: Backup QFERC9 resident size: 975MB
INFO: Backup QFERC9 completed
INFO: Evaluate backups by retention
INFO: Backup QFERC9, mode: FULL, status: OK. Redundancy: 1/2, Time Window: 0d/7d. Active
INFO: There are no backups to merge by retention policy
INFO: There are no backups to delete by retention policy
INFO: There is no WAL to purge by retention policy
انتبه إلى التحذير الصادر عن pg_probackup - لم يتم تمكين فحص المجموع الاختباري في نظامنا العنقودي ، لذلك لا يمكن التحقق من كتل البيانات للتأكد من صحتها. بمعنى آخر ، أنت لست محميًا من حقيقة أن كتل البيانات السيئة لا تدخل في النسخة الاحتياطية.
دعنا نرى الإعدادات الحالية:
pg_probackup show-config --instance db1
لنختصر الآن الأمر لإنشاء نسخ احتياطية - سنكتب بعض المعلمات في تكوين مثيل db1:
pg_probackup set-config --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pguser=backup --pgdatabase=backupdb --log-filename=backup_cron.log --log-level-file=log --log-directory=/home/backup_user/backup_db/log
دعنا نقارن: كيف كان وكيف أصبح
pg_probackup show-config --instance db1
| كانت | أصبح |
|---|---|
| # Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backup_user # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = OFF log-filename = pg_probackup.log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 # Compression parameters compress-algorithm = none compress-level = 1 # Remote access parameters remote-proto = ssh |
# Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backupdb pghost = srv_db1 pguser = backup # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = LOG log-filename = backup_cron.log log-directory = /home/backup_user/backup_db/log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-deep = 0 # معلمات الضغط ضغط الخوارزمية = لا شيء مستوى الضغط = 1 # معلمات الوصول عن بعد remote-proto = ssh remote-host = srv_db1 remote-user = postgres |
لنقم بعمل نسخة تدريجية في وضع DELTA دون تحديد المعلمات المعينة في التكوين:
pg_probackup backup --instance=db1 -j2 --progress -b DELTA --compress --stream --delete-expired
دعونا نرى ما حصلنا عليه
BACKUP INSTANCE 'db1'
=====================================================================================================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time Data WAL Zratio Start LSN Stop LSN Status
=====================================================================================================================================
db1 12 QFERKZ 2020-08-21 05:55:52-04 DELTA STREAM 1/1 9s 136kB 32MB 1.00 0/B0000028 0/B0000168 OK
db1 12 QFERC9 2020-08-21 05:51:34-04 FULL STREAM 1/0 1m:3s 959MB 16MB 3.52 0/AE000028 0/AE0001A0 OK
هناك الكثير من المعلومات ، يمكن العثور على وصف تفصيلي في الوثائق ، ومع ذلك ، دعنا نتحدث عن بعض النقاط:
وقت الاسترداد - الحد الأدنى من الوقت الذي يمكنك استرداده باستخدام
وضع النسخ الاحتياطي هذا - الوضع الذي تم فيه إنشاء النسخة ، يتوفر حاليًا 4 أوضاع - وضع WAL كامل (كامل) وثلاثة أوضاع تزايدية (PAGE و DELTA و PTRACK)
- الخيارات التالية ممكنة هنا - STREAM و ARCHIVE. تحتوي النسخ التي تم إنشاؤها في وضع STREAM على جميع الملفات اللازمة للاسترداد إلى حالة WAL المتسقة. فقط لكي يعمل هذا الوضع ، كان من الضروري إعطاء دور النسخ لمستخدم النسخ الاحتياطي لدينا. يفترض وضع الأرشفة أننا قمنا بتكوين أرشفة WAL ، ومن ثم سيتم وضع ملفات WAL الضرورية في المسار المعروف لـ pg_probackup.
الحالة - هناك الكثير من الحالات ، جميعها موصوفة في الوثائق ، ولكن إذا رأينا شيئًا مختلفًا عن "موافق" ، فمن المنطقي الذهاب إلى الوثائق ومعرفة الخطأ الذي حدث.
كما خمنت ، يمكننا تحليل إخراج الأمر pg_probackup show والحصول على حالة آخر نسخة احتياطية تم إجراؤها ومعالجتها وإرسالها إلى نظام المراقبة ، وهناك يمكننا بالفعل إعداد القواعد التي سيتم من خلالها تشغيل إشعار الموظفين المسؤولين عن نظام إدارة قواعد البيانات.
لنقم بإنشاء سكربت bkp_base.sh سيبدأ النسخ الاحتياطي ويرسل النتيجة إلى نظام المراقبة:
#! /bin/sh
#
. /home/backup_user/.bash_profile
# , (FULL, DELTA ..)
pg_probackup backup --instance=db1 -j 2 --progress -b $1 --compress --stream --delete-expired
# zabbix.
if [ "$(pg_probackup show --instance=db1 --format=json | jq -c '.[].backups[0].status')" == '"OK"' ]; then
result=0;
else
result=1;
fi
# zabbix zabbix_trapper pg.db_backup
# , , , .
/opt/zabbix/bin/zabbix_sender -c /opt/zabbix/etc/pg.zabbix_agentd.conf -k pg.db_backup -o $result
نكتب استدعاء للنص الناتج في crontab ، على سبيل المثال ، يمكنك ضبط الجدول التالي:
00 01 * * 7 /home/backup_user/scr/bkp_base.sh FULL
00 01 * * 1,2,3,4,5,6 /home/backup_user/scr/bkp_base.sh DELTA
هذا يكمل حل المهمة الأولى - قمنا بتكوين النسخة الاحتياطية ، وحددنا سياسة الاحتفاظ بالنسخ. نرسل أيضًا حالة النسخ الاحتياطية إلى نظام المراقبة.
في الجزء التالي ، سننظر في إنشاء أرشيف لملفات wal وإنشاء نسخ احتياطية للأرشيف.