المشكلة باختصار
أغلب فرق التطوير العربية بتعتمد على pg_dump في cron كل ليلة. ده بيدّيك Recovery Point Objective (RPO) = 24 ساعة في أسوأ حالة. يعني لو شركة e-commerce بتعمل 200 طلب/يوم، وفقدت يوم كامل، ده يساوي تقريبًا 200 طلب ضايع + ثقة العملاء.
الـ WAL-G بيخفّض الـ RPO لـ ثانية واحدة عبر أرشفة الـ Write-Ahead Log بشكل مستمر، وبيخلي الاسترجاع نقطة-بنقطة (PITR) ممكن لأي لحظة في الفترة المحفوظة.
إيه هو WAL-G وليه مش زي pg_dump
قبل ما ندخل في الإعداد، خلّي بالك من الفرق الجوهري بين الأداتين بمثال بسيط للمبتدئ:
مثال للمبتدئ: دفتر يومية المحاسب
تخيّل محاسب بيشتغل في شركة. عنده طريقتين علشان يحتفظ بالحسابات:
- الطريقة الأولى (pg_dump): آخر اليوم، بياخد صورة من كل الدفاتر ويحطها في الخزنة. لو حصل خطأ الساعة 3 ضهر، الصورة بتاعت أمس مش هتساعده يرجّع تفاصيل اللي حصل النهارده الصبح.
- الطريقة الثانية (WAL-G): نفس صورة آخر اليوم في الخزنة، لكن كمان كل قيد بيكتبه بيتسجّل لحظة بلحظة في كشف منفصل برّه المكتب. لو حصل خطأ، يقدر يرجع لصورة آخر اليوم، ويعيد تنفيذ القيود واحد ورا التاني للحظة قبل الخطأ بالظبط.
التفسير العلمي الدقيق
الـ Write-Ahead Log (WAL) في PostgreSQL هو ملف بيتكتب فيه كل تعديل قبل ما يدخل ملفات البيانات الفعلية. ده بيضمن الـ durability في حالة crash. كل WAL segment حجمه 16MB افتراضيًا، وبيتولّد بسرعة حسب حجم الكتابة.
الـ WAL-G بيعمل حاجتين بالتوازي:
- Base backup دوري (يومي أو أسبوعي): نسخة كاملة من الـ data directory مضغوطة ومرفوعة على S3.
- WAL archiving مستمر: كل segment بيتقفل بيترفع تلقائيًا على S3 خلال ثوان عبر
archive_command.
ساعة الاسترجاع، WAL-G بينزل الـ base backup الأقرب، وPostgreSQL بيعيد تشغيل الـ WAL segments لحد الثانية اللي انت طلبتها.
الإعداد كامل خطوة بخطوة
الافتراض هنا: عندك Ubuntu 22.04 أو 24.04، PostgreSQL 16 أو 17، وbucket على S3 (أو S3-compatible زي Cloudflare R2 أو Backblaze B2).