Categories
Database Backup

**

بالنسبة لمسؤولي قواعد البيانات (DBAs) ومهندسي DevOps الذين يديرون PostgreSQL في بيئات الإنتاج، فإن تحقيق هدف نقطة الاسترداد (RPO) القريب من الصفر يعد تفويضاً أساسياً. وفي قلب قدرات التعافي من الكوارث والاسترداد في نقطة زمنية محددة (PITR) في PostgreSQL، تكمن سجلات الكتابة المسبقة (WAL). وبينما تضمن WAL الامتثال لمعايير ACID من خلال تسجيل المعاملات قبل كتابتها في ملفات البيانات، فإن أرشفة WAL هي الآلية التي تحفظ هذه السجلات للنسخ الاحتياطي طويل الأمد والنسخ المتماثل.

ومع ذلك، فإن تكوين أرشفة WAL ليس عملية “اضبطها وانساها”. فالتكوينات الخاطئة، والإخفاقات الصامتة، وسوء الفهم المعماري يمكن أن تؤدي إلى فقدان كارثي للبيانات، أو سيناريوهات “الدماغ المنقسم” (split-brain)، أو انقطاع كامل لقاعدة البيانات.

في هذا الدليل الشامل، سنستكشف بنية أرشفة WAL في PostgreSQL، ونحدد أكثر المخاطر شيوعاً التي تؤدي إلى فقدان البيانات، ونوضح أفضل الممارسات على مستوى الإنتاج لضمان بقاء قاعدة بياناتك مرنة.

فهم بنية WAL في PostgreSQL

قبل الغوص في المخاطر، من الضروري فهم كيفية تعامل PostgreSQL مع سجلات المعاملات.

تقوم PostgreSQL بكتابة جميع التعديلات في مقاطع WAL (التي يبلغ حجمها الافتراضي 16 ميجابايت) الموجودة في دليل pg_wal (المعروف سابقاً باسم pg_xlog في الإصدارات الأقدم من 10). يتم تسجيل كل معاملة بشكل تسلسلي، ويتم تمييزها برقم تسلسل السجل (LSN).

عندما يمتلئ مقطع WAL، تنتقل PostgreSQL إلى مقطع جديد. ولمنع دليل pg_wal من النمو إلى ما لا نهاية، تقوم PostgreSQL بإعادة تدوير أو إزالة مقاطع WAL القديمة بمجرد عدم الحاجة إليها لاستعادة البيانات بعد التعطل أو للنسخ المتماثل.

أرشفة WAL تعترض عملية إعادة التدوير هذه. عند تمكين archive_mode، تقوم PostgreSQL بتنفيذ archive_command محدد من قبل المستخدم (أو تستخدم archive_library في إصدار PostgreSQL 15 وما بعده) لنسخ مقطع WAL المكتمل إلى موقع ثانوي آمن قبل حذفه أو الكتابة فوقه.

لإجراء استرداد في نقطة زمنية محددة (PITR)، تحتاج إلى مكونين:
1. نسخة احتياطية أساسية صالحة.
2. سلسلة غير منقطعة من ملفات WAL المؤرشفة من وقت النسخة الاحتياطية الأساسية حتى وقت الاسترداد المستهدف.

إذا انقطعت سلسلة WAL هذه، سيفشل استردادك (PITR).

تكوين أرشفة WAL للإنتاج

لتمكين أرشفة WAL، يجب عليك تعديل ملف postgresql.conf الخاص بك. يتطلب التكوين الأساسي ضبط wal_level، وتمكين archive_mode، وتحديد archive_command.

# postgresql.conf
wal_level = replica             # 'replica' أو 'logical' مطلوب للأرشفة
archive_mode = on               # تمكين عملية الأرشفة
archive_command = 'test ! -f /mnt/nfs/archive/%f && cp %p /mnt/nfs/archive/%f'
archive_timeout = 600           # فرض تبديل WAL كل 10 دقائق

في archive_command:
* %p يمثل المسار الكامل لملف WAL المراد أرشفته.
* %f يمثل اسم ملف WAL.

على الرغم من أن التكوين أعلاه يبدو مباشراً، إلا أن الاعتماد على أوامر shell بسيطة في بيئات المؤسسات يطرح مخاطر كبيرة.

المخاطر الشائعة في أرشفة WAL

الخطر 1: “النجاح الصامت” لـ archive_command

تعتمد PostgreSQL كلياً على رمز الخروج الخاص بـ archive_command. إذا أعاد الأمر 0، تفترض PostgreSQL أن ملف WAL قد تمت أرشفته بأمان وتشرع في إعادة تدوير الملف الأصلي.

من الأخطاء الشائعة استخدام أمر يعيد 0 حتى لو لم يتم تفريغ البيانات بأمان إلى التخزين الدائم. على سبيل المثال، قد يعيد أمر cp البسيط النجاح بمجرد وصول البيانات إلى ذاكرة التخزين المؤقت لصفحات نظام التشغيل على الخادم الوجهة. إذا فقد الخادم الوجهة الطاقة قبل تفريغ ذاكرة التخزين المؤقت إلى القرص، فسيتم فقدان ملف WAL، لكن PostgreSQL تكون قد حذفت نسختها المحلية بالفعل.

الخطر: سلسلة WAL مكسورة وعدم القدرة على إجراء PITR، وهو ما لا يتم اكتشافه إلا أثناء سيناريو التعافي من الكوارث.

التخفيف: تأكد من أن برنامج الأرشفة النصي الخاص بك يفرض عمليات كتابة متزامنة. إذا كنت تستخدم أوامر shell قياسية، فاستخدم أدوات تضمن تفريغ البيانات، أو اكتب برنامجاً نصياً مغلفاً (wrapper script) يتحقق من حجم الملف والمجموع الاختباري (checksum) بعد النقل.

الخطر 2: استنفاد قسم pg_wal (تضخم WAL)

إذا فشل archive_command (أعاد رمز خروج غير صفري)—بسبب انقطاع الشبكة، أو أذونات غير صحيحة، أو امتلاء قرص الوجهة—فستحتفظ PostgreSQL بملف WAL في دليل pg_wal وتعيد محاولة الأمر إلى أجل غير مسمى.

بينما يمنع هذا فقدان البيانات من خلال عدم حذف ملفات WAL غير المؤرشفة، فإنه يطرح مخاطر جسيمة على التوافر. إذا كان دليل pg_wal موجوداً على قسم يمتلئ بنسبة 100%، فستصدر PostgreSQL خطأ PANIC وتتعطل. ولن تبدأ قاعدة البيانات مرة أخرى حتى يتم إخلاء مساحة.

الخطر: توقف كامل لقاعدة البيانات بسبب امتلاء قسم pg_wal.

التخفيف:
1. ضع دائماً pg_wal على قسم قرص مخصص.
2. نفذ مراقبة صارمة لحجم دليل pg_wal.
3. راقب عرض pg_stat_archiver لاكتشاف أوامر الأرشفة الفاشلة فوراً.

الخطر 3: النسخ الاحتياطية الأساسية غير المكتملة

النسخة الاحتياطية الأساسية عديمة الفائدة بدون ملفات WAL التي تم إنشاؤها أثناء عملية النسخ الاحتياطي. إذا قمت بأخذ لقطة على مستوى نظام الملفات أو استخدمت pg_basebackup دون بث ملفات WAL (-X stream)، فيجب عليك التأكد من أرشفة ملفات WAL التي تم إنشاؤها بين بداية ونهاية النسخ الاحتياطي بنجاح.

إذا كان برنامج الأرشفة الخاص بك متأخراً أو فاشلاً، وضاعت ملفات WAL تلك، فلا يمكن إيصال النسخة الاحتياطية الأساسية إلى حالة متسقة.

الخطر: نسخ احتياطية أساسية تالفة أو غير قابلة للاسترداد.

التخفيف: استخدم pg_basebackup -X stream لتضمين ملفات WAL الضرورية داخل حمولة النسخ الاحتياطي نفسها، أو استخدم حلول النسخ الاحتياطي للمؤسسات التي تدير تلقائياً التبعية بين النسخ الاحتياطية الأساسية ومقاطع WAL.

الخطر 4: ارتباك الخط الزمني وسيناريوهات “الدماغ المنقسم”

عند ترقية خادم احتياطي (standby) إلى خادم أساسي، تقوم PostgreSQL بزيادة “معرف الخط الزمني” (الجزء الأول من اسم ملف WAL، على سبيل المثال 0000000200000001000000A4). هذا يمنع الخادم الأساسي الجديد من الكتابة فوق سجل WAL الخاص بالخادم الأساسي القديم.

ومع ذلك، إذا تم تشغيل الخادم الأساسي القديم عن طريق الخطأ دون عزله بشكل صحيح (سيناريو الدماغ المنقسم)، فقد يحاول دفع ملفات WAL إلى نفس موقع الأرشفة باستخدام الخط الزمني القديم. إذا كان archive_command الخاص بك يكتب فوق الملفات بشكل أعمى، فقد تتلف مستودع الأرشفة الخاص بك.

الخطر: ملفات WAL تمت الكتابة فوقها، أرشيفات تالفة، وقواعد بيانات غير قابلة للاسترداد.

التخفيف: يجب ألا يقوم archive_command الخاص بك أبداً بالكتابة فوق ملف موجود. لاحظ في التكوين الأساسي سابقاً، استخدمنا test ! -f /mnt/nfs/archive/%f للفشل صراحةً إذا كان الملف موجوداً بالفعل.

تخفيف مخاطر فقدان البيانات: أفضل ممارسات الإنتاج

لتعزيز استراتيجية أرشفة PostgreSQL الخاصة بك، نفذ أفضل الممارسات التالية.

1. مراقبة عملية الأرشفة محلياً

توفر PostgreSQL عرضاً مدمجاً، pg_stat_archiver، الذي يتتبع نجاح وفشل عملية الأرشفة الخاصة بك. يجب عليك دمج هذا العرض في حزمة المراقبة الخاصة بك (مثل Prometheus أو Datadog أو Zabbix).

SELECT 
    archived_count,
    last_archived_wal,
    last_archived_time,
    failed_count,
    last_failed_wal,
    last_failed_time,
    stats_reset
FROM pg_stat_archiver;

عتبات التنبيه التي يجب تكوينها:
* تنبيه إذا زاد failed_count.
* تنبيه إذا تجاوز الفرق الزمني بين now() و last_archived_time عتبة RPO الخاصة بك (على سبيل المثال، 15 دقيقة)، مع الأخذ في الاعتبار أن قواعد البيانات ذات حركة المرور المنخفضة قد يكون لديها تأخيرات طبيعية ما لم يتم ضبط archive_timeout.

2. الاستفادة من archive_timeout

في قواعد البيانات ذات حجم الكتابة المنخفض، قد يستغرق ملف WAL بحجم 16 ميجابايت ساعات ليمتلئ. وحتى يمتلئ، لا تتم أرشفته. إذا تعطل الخادم وفُقد القرص المحلي، فستفقد ساعات من المعاملات.

ضبط archive_timeout = 600 (10 دقائق) يجبر PostgreSQL على التبديل إلى ملف WAL جديد وأرشفة الملف الحالي، حتى لو لم يكن ممتلئاً. هذا يضمن أن RPO الخاص بك لا يتجاوز 10 دقائق، على حساب استخدام أعلى قليلاً للتخزين بسبب ملفات WAL الممتلئة جزئياً.

3. الانتقال إلى archive_library (PostgreSQL 15+)

تاريخياً، كان archive_command ينشئ عملية shell جديدة لكل ملف WAL. في البيئات ذات الإنتاجية العالية التي تولد مئات ملفات WAL في الدقيقة، تصبح تكلفة إنشاء عمليات shell عنق زجاجة للأداء.

قدمت PostgreSQL 15 معلمة archive_library، مما يسمح بمعالجة أرشفة WAL بواسطة وحدات C محملة ديناميكياً. هذا يلغي تكلفة إنشاء shell ويوفر آلية أرشفة أكثر قوة وعالية الأداء. إذا كنت تستخدم PostgreSQL 15 أو أعلى، فابحث عن أدوات النسخ الاحتياطي التي تدعم وحدات الأرشفة المخصصة.

4. اختبار الاسترداد في نقطة زمنية محددة بانتظام

النسخة الاحتياطية التي لم يتم اختبارها ليست نسخة احتياطية؛ إنها مجرد أمنية. الطريقة الوحيدة للتحقق من أن أرشفة WAL تعمل بشكل صحيح، وأن سلسلة WAL الخاصة بك غير منقطعة، وأن نسخك الاحتياطية الأساسية متسقة، هي إجراء اختبارات PITR روتينية وآلية.

قم بتشغيل مثيل مؤقت، واستعد النسخة الاحتياطية الأساسية، وقم بتكوين restore_command للسحب من الأرشيف الخاص بك، واستعد إلى طابع زمني محدد. تحقق من أن قاعدة البيانات تصل إلى حالة متسقة وتفتح للاتصالات.

النسخ الاحتياطي والاسترداد للمؤسسات مع CloudSave

إن إدارة البرامج النصية المخصصة لـ archive_command، والتعامل مع إلغاء تكرار WAL، وضمان التخزين الآمن خارج الموقع لسجلات المعاملات يمكن أن تصبح بسرعة عبئاً تشغيلياً لفرق تكنولوجيا المعلومات.

هنا توفر CloudSave قيمة كبيرة لبيئات PostgreSQL للمؤسسات. تتكامل CloudSave مباشرة مع واجهات برمجة تطبيقات النسخ الاحتياطي وأرشفة WAL الأصلية في PostgreSQL للقضاء على المخاطر اليدوية التي تمت مناقشتها أعلاه.

بدلاً من كتابة برامج bash نصية هشة، توفر CloudSave تكاملاً قوياً يعتمد على وكيل أو بدون وكيل والذي:
* يضمن التسليم: يستبدل أوامر shell القياسية بعمليات نقل تم التحقق منها ومصادق عليها بالمجموع الاختباري إلى تخزين آمن خارج الموقع أو في السحابة.
* يمنع تضخم WAL: يراقب بنشاط دليل pg_wal وينبه المسؤولين قبل حدوث استنفاد للقسم بوقت طويل.
* يؤتمت PITR: يبسط الاسترداد في نقطة زمنية محددة من خلال واجهة بديهية. أنت تختار الدقيقة المحددة التي تريد الاسترداد إليها، وتقوم CloudSave تلقائياً باسترداد النسخة الاحتياطية الأساسية الصحيحة وبث التسلسل الدقيق لملفات WAL المطلوبة للوصول إلى تلك الحالة.
* يتعامل مع الخطوط الزمنية: يدير بذكاء سجلات الخط الزمني لـ PostgreSQL، مما يضمن أن عمليات تجاوز الفشل وسيناريوهات الدماغ المنقسم لا تتلف مستودع النسخ الاحتياطي الخاص بك.

من خلال تفريغ العبء الثقيل لإدارة WAL إلى CloudSave، يمكن لمسؤولي قواعد البيانات التركيز على تحسين الاستعلام وأداء قاعدة البيانات، مع العلم أن اتفاقيات مستوى الخدمة (SLAs) الخاصة بـ RPO و RTO محمية بواسطة منصة على مستوى المؤسسات.

الخلاصة

تعد أرشفة WAL في PostgreSQL العمود الفقري للتعافي من كوارث قواعد البيانات. وبينما يبدو مفهوم نسخ ملف من دليل إلى آخر بسيطاً، فإن الحالات الاستثنائية—الإخفاقات الصامتة، استنفاد القرص، وتباعد الخط الزمني—تشكل مخاطر جسيمة على سلامة البيانات.

من خلال فهم بنية pg_wal، وتجنب تكوينات archive_command المدمرة بصرامة، ومراقبة pg_stat_archiver، والاستفادة من منصات النسخ الاحتياطي للمؤسسات مثل CloudSave، يمكنك بناء بنية تحتية مرنة لـ PostgreSQL قادرة على النجاة من أعطال الأجهزة، والأخطاء البشرية، والانقطاعات الكارثية دون فقدان معاملة واحدة مؤكدة.

اكتشف المخاطر الشائعة لأرشفة WAL في PostgreSQL التي تؤدي إلى فقدان البيانات. تعلم أفضل ممارسات خبراء إدارة قواعد البيانات، ونصائح التكوين، وكيفية ضمان استرداد موثوق في نقطة زمنية محددة (PITR) لقواعد بيانات المؤسسات.

تصنيفات