الاعتماد على pg_dump وتشغيله كل نصف ساعة هو خطأ شائع يقع فيه الكثيرون. هذه الطريقة تقتل أداء السيرفر (I/O spikes) وتتركك عرضة لفقدان البيانات في الفترات الفاصلة بين النسخ.
الحل المعياري في بيئات الإنتاج (Production) هو Continuous WAL Archiving. ببساطة: بدلاً من نسخ قاعدة البيانات كاملة مراراً وتكراراً، نقوم بتدفق التغييرات (WAL files) لحظياً إلى سيرفر خارجي.
في هذا الدليل، سأشاركك خطوات تطبيق هذا الحل باستخدام الأداة القوية pgBackRest مع التخزين السحابي (S3)، كما طبقناها على بيئة عمل حقيقية بنظام Rocky Linux.
لماذا نستخدم هذا الأسلوب؟
بإختصار، لأنك تريد تحقيق هدفين متعارضين عادةً:
- أمان بيانات كامل (RPO = 0): أي حركة تتم على القاعدة يتم حفظها فوراً.
- أداء مستقر: إلغاء الـ Disk I/O الهائل الناتج عن عمليات الـ Dump المتكررة.
- استعادة مرنة: القدرة على استرجاع البيانات لما قبل الخطأ بثانية واحدة (PITR).
بيئة العمل (Benchmark)
لغرض الشفافية، الإعدادات المذكورة في الأسفل (خاصة ما يتعلق بالأداء) تم ضبطها بناءً على السيرفر التالي. مهمتك هي تعديل الأرقام لتناسب عتادك.
- المعالج: Intel Core Ultra 7 265 (20 Cores).
- الرام: 62 GB.
- التخزين: NVMe SSD (RAID 1).
- النظام: Rocky Linux.
نصيحة عملية: في ملف الإعدادات لاحقاً، ستجد خيار
process-max=8. لقد اخترنا الرقم 8 لأن لدينا 20 نواة. كقاعدة عامة، خصص حوالي 30-40% من أنويتك لعملية الضغط والرفع لضمان سرعة عالية دون خنق السيرفر.
1. التثبيت (Installation)
سنحتاج لتثبيت مستودع PostgreSQL الرسمي للحصول على أحدث نسخة من pgbackrest.
# إضافة المستودع
sudo dnf install -y [https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm](https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm)
# تثبيت الأداة
sudo dnf install -y pgbackrest
2. ضبط PostgreSQL لتصدير الـ WALs
نحتاج لإخبار قاعدة البيانات: "لا تحذفي ملفات الـ WAL بعد تنفيذها، بل سلميها لـ pgBackRest".
عدل ملف postgresql.conf:
# ضروري لعمليات النسخ الاحتياطي والاستعادة
wal_level = replica
# تفعيل الأرشفة
archive_mode = on
# هذا هو "الجسر". كلما امتلأ ملف WAL، سيتم استدعاء هذا الأمر لرفعه
archive_command = 'pgbackrest --stanza=main archive-push %p'
# (اختياري) لزيادة عدد العمليات المسموح بها للأرشفة
max_wal_senders = 10
تذكير: لا تنسَ إعادة تشغيل الخدمة (
systemctl restart postgresql) لتفعيل هذه التغييرات.
3. إعداد pgBackRest (الربط مع S3)
هنا "مطبخ" العمليات. سنقوم بضبط الاتصال بـ S3 (أو أي خدمة متوافقة مثل Cloudflare R2)، تفعيل التشفير، وضبط الأداء.
ملف /etc/pgbackrest/pgbackrest.conf:
[global]
# --- إعدادات التخزين السحابي ---
repo1-type=s3
repo1-path=/pgbackrest-backups
# استبدل القيم التالية ببيانات الـ Bucket الخاص بك
repo1-s3-bucket=my-database-backups
repo1-s3-endpoint=https://<ACCOUNT_ID>.r2.cloudflarestorage.com
repo1-s3-region=auto
repo1-s3-key=<ACCESS_KEY>
repo1-s3-key-secret=<SECRET_KEY>
# --- الأمان (لا تهاون هنا) ---
# البيانات ستخرج للإنترنت، لذا التشفير إلزامي.
# اختر كلمة مرور قوية جداً واحفظها في مكان آمن (مدير كلمات مرور).
repo1-cipher-type=aes-256-cbc
repo1-cipher-pass=<STRONG_PASSWORD_HERE>
# --- ضبط الأداء (Performance Tuning) ---
# هذا الإعداد يعتمد على الـ Benchmark المذكور أعلاه.
# استخدام 8 عمليات متوازية للضغط والرفع (Parallel Processing).
process-max=8
# تجميع الملفات الصغيرة لتقليل طلبات الشبكة (يوفر التكلفة ويزيد السرعة)
repo1-bundle=y
# تفعيل النسخ الذكي (Block Incremental) لتسريع العملية
repo1-block=y
# --- سياسة الاحتفاظ (Retention) ---
# نحتفظ بنسختين كاملتين (أسبوعين) و4 نسخ تفاضلية
repo1-retention-full=2
repo1-retention-diff=4
# --- إعدادات عامة ---
start-fast=y
stop-auto=y
# ضغط lz4 ممتاز للأقراص السريعة (NVMe) لأنه سريع جداً ولا يستهلك CPU عالي
compress-type=lz4
compress-level=3
[main]
# مسار البيانات الفعلي على السيرفر
pg1-path=/var/lib/pgsql/18/data
pg1-port=5432
pg1-socket-path=/var/run/postgresql
4. تفعيل النظام (Initialization)
الآن نطلب من pgBackRest الاتصال بـ S3 وإنشاء هيكلية الملفات والتأكد من صحة التشفير.
# إنشاء الـ Stanza (تنفذ مرة واحدة عند الإعداد)
sudo -u postgres pgbackrest --stanza=main stanza-create
# اختبار الاتصال ورفع ملف تجريبي
sudo -u postgres pgbackrest --stanza=main check
يجب أن ترى completed successfully. إذا ظهر خطأ، راجع إعدادات S3 والـ Firewall.
5. استراتيجية النسخ الآلي (Automation)
لا داعي للنسخ كل ساعة. بما أننا نستخدم (Continuous Archiving)، فإن كل ثانية محفوظة بالفعل. الجدول التالي يوازن بين سرعة الاستعادة (RTO) وتوفير المساحة.
في crontab -e -u postgres:
# الجمعة فجراً: نسخة كاملة (Full Backup)
# هذه هي نقطة الارتكاز الأسبوعية
00 03 * * 5 pgbackrest --stanza=main --type=full backup
# باقي الأيام فجراً: نسخة تفاضلية (Differential)
# تنسخ فقط ما تغير منذ يوم الجمعة (سريعة جداً)
00 03 * * 0-4,6 pgbackrest --stanza=main --type=diff backup
6. ساعة الصفر: كيف تستعيد بياناتك؟ (Disaster Recovery)
النسخ الاحتياطي لا قيمة له إذا لم تكن تعرف كيف تستخدمه. في حال تعطل السيرفر أو تلف البيانات، إليك الخطوات الصحيحة للاستعادة:
أولاً: إيقاف النزيف يجب إيقاف خدمة قاعدة البيانات تماماً لمنع أي كتابة جديدة وللسماح باستبدال الملفات.
systemctl stop postgresql-18
ثانياً: الاستعادة الذكية نستخدم خيار --delta. هذا الخيار عبقري؛ فهو يفحص الملفات الموجودة ويستبدل فقط التالف أو المختلف، مما يوفر وقت التحميل بشكل هائل.
sudo -u postgres pgbackrest --stanza=main --delta restore
ملاحظة: سيتم قراءة كلمة المرور تلقائياً من ملف الكونفيج.
ثالثاً: العودة للعمل
systemctl start postgresql-18
بعد التشغيل، ستجد أن قاعدة البيانات عادت للعمل تماماً كما كانت في آخر لحظة قبل التوقف.