الإلمام بـ pg_probackup. الجزء الاول

صورة



مرحبًا ، أنا ألكسندر نيكيتين ، مدير النظام الرئيسي لمجموعة 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 وإنشاء نسخ احتياطية للأرشيف.



All Articles