الموثوقية والإتاحة والمرونة

التعافي من الأعطال والكوارث

18 دقيقة الدرس 3 من 10

التعافي من الأعطال والكوارث

التكرار (الذي تناولناه في الدرس السابق) يجيب على السؤال: "هل لدينا طاقة احتياطية؟" أما التبديل عند الفشل فيجيب على التساؤل التالي: "كيف ننتقل فعلياً إلى تلك الطاقة الاحتياطية حين يتعطل شيء؟" والتعافي من الكوارث (DR) يجيب على السؤال الأصعب: "كيف ننجو من فشل كامل لموقع أو منطقة أو مركز بيانات ونعود بأدنى قدر من فقدان البيانات؟" هذه المفاهيم الثلاثة مترابطة ارتباطاً وثيقاً، وإتقانها هو الفارق بين نظام يدّعي توافراً بنسبة 99.9% ونظام يُحقق ذلك فعلاً.

التبديل النشط-السلبي مقابل التبديل النشط-النشط

ثمة طريقتان أساسيتان لترتيب المكونات المتكررة:

النشط-السلبي (الأساسي-الاحتياطي): تتعامل عقدة واحدة مع كل حركة المرور في أي وقت (العقدة النشطة). تجلس عقدة واحدة أو أكثر في وضع الخمول، وتستقبل باستمرار الحالة المنسوخة من العقدة النشطة، لكنها لا تخدم أي طلبات (عقد الاستعداد السلبي). عند فشل العقدة النشطة، تُرفَّع أفضل عقدة احتياطية لتصبح العقدة النشطة الجديدة، ويُعاد توجيه حركة المرور إليها.

النشط-النشط: تتعامل جميع العقد مع حركة المرور الحية في آنٍ واحد. تتوزع الطاقة والحمل والحالة (في بعض الإعدادات) بين العقد. عند فشل عقدة ما، تستوعب البقية حركة مرورها — دون الحاجة إلى خطوة "ترقية" صريحة لأن كل عقدة نشطة أصلاً.

Active-Passive vs Active-Active failover topology Active-Passive Client Health Monitor / VIP traffic idle Active Node serves all traffic Passive Node standby only repl. On failure: promote Passive → Active Downtime = detection + promotion time (typically 10 s – 3 min) Active-Active Client Load Balancer Node A 50% traffic Node B 50% traffic sync / repl. On failure: remaining node absorbs all traffic Downtime ≈ 0 (no promotion step) But: write conflicts possible; higher complexity
النشط-السلبي: عقدة واحدة تخدم حركة المرور وترتفع الاحتياطية عند الفشل. النشط-النشط: جميع العقد تخدم حركة المرور في آنٍ واحد؛ والعقدة الفاشلة يستوعب حملها البقية فوراً.

المقايضات: الاختيار بين النموذجين

لا يوجد نموذج أفضل عالمياً. يعتمد الاختيار الصحيح على RTO وRPO وطبيعة بياناتك:

  • النشط-السلبي أسهل في الاستيعاب — تذهب الكتابات إلى عقدة واحدة بالضبط، فلا خطر من تعارض الكتابات. العيب هو أن العقدة الاحتياطية تجلس خاملة مضيعةً للأجهزة، وهناك نافذة تبديل قابلة للقياس (عادةً 10 ثوانٍ إلى 3 دقائق تبعاً لسرعة الاكتشاف والترقية). MySQL Group Replication في وضع الأساسي الواحد، وPostgreSQL مع Patroni، ومعظم إعدادات قواعد البيانات العلائقية تعتمد هذا النموذج افتراضياً.
  • النشط-النشط يُلغي تأخير الترقية ويُضاعف إنتاجية الكتابة. لكن إذا قبلت عقدتان كتابات في آنٍ واحد، فأنت بحاجة إلى استراتيجية لحل التعارضات — إما تجنّب التعارضات بتوجيه كتابات المفتاح ذاته إلى العقدة ذاتها (التجزئة المتسقة)، أو قبول دلالة "آخر كتابة تفوز"، أو استخدام بروتوكول توافق (Raft أو Paxos). Cassandra وDynamoDB وCockroachDB مُصمَّمة للكتابات متعددة المناطق نشط-نشط.
قاعدة عملية: استخدم النشط-السلبي لقواعد البيانات ذات الحالة حيث اتساق الكتابة هو الأولوية. استخدم النشط-النشط للخدمات عديمة الحالة (خوادم API، عقد الذاكرة المؤقتة) أو لقواعد البيانات المُصمَّمة خصيصاً لذلك. الجمع بين النموذجين في خدمة واحدة (مثلاً: طبقة تطبيقات نشط-نشط، وطبقة قاعدة بيانات نشط-سلبي) شائع جداً وغالباً ما يكون الخيار الأمثل.

أهداف التعافي: RTO وRPO

مقياسان يُحددان معنى "التعافي من الكوارث" لعملك:

هدف وقت التعافي (RTO) — أقصى مدة مقبولة للانقطاع. كم من الوقت يمكن أن يكون النظام غير متاح قبل أن يتضرر العمل ضرراً ملموساً؟ قد يُحدد معالج الدفع RTO بـ30 ثانية. لوحة تحليلات داخلية قد تتحمل 4 ساعات.

هدف نقطة التعافي (RPO) — أقصى قدر مقبول من فقدان البيانات، مقاساً بالزمن. كم من العمل يمكننا تحمّل فقدانه؟ RPO = 0 يعني فقدان صفري للبيانات (يجب أن تكون كل كتابة مُؤكَّدة قابلة للاسترداد). RPO = ساعة يعني تحمّل فقدان ما يصل إلى ساعة من المعاملات.

RTO and RPO illustrated on a timeline time Last Backup / Checkpoint DISASTER Service Restored RPO (data loss) RTO (downtime) normal operation outage window recovered
RPO يقيس نافذة فقدان البيانات (من آخر نسخة احتياطية حتى الكارثة). RTO يقيس نافذة التوقف (من الكارثة حتى استعادة الخدمة الكاملة). كلاهما قرار تجاري وليس تقنياً.

RTO وRPO قرارات تجارية أولاً، وتقنية ثانياً. يجب على الأعمال أن تُقرر ما يمكنها تحمّله مالياً وسمعياً من فقدان البيانات والتوقف. ثم يختار الفريق الهندسي وضع النسخ المتماثل وتكرار النسخ الاحتياطية وبنية الاستعداد التي تُحقق تلك الأهداف.

أهداف نموذجية حسب نوع العمل (إرشادات تقريبية):

  • المعاملات المالية / المدفوعات: RTO أقل من دقيقة، RPO = 0 (فقدان صفري للبيانات، النسخ المتزامن إلزامي)
  • إتمام طلبات التجارة الإلكترونية: RTO أقل من 5 دقائق، RPO أقل من 30 ثانية
  • تطبيق SaaS: RTO أقل من 30 دقيقة، RPO أقل من 5 دقائق
  • الأدوات الداخلية: RTO أقل من 4 ساعات، RPO أقل من ساعة

أنماط نشر التعافي من الكوارث

ثلاثة أنماط نشر تتوافق تقريباً مع تصاعد التكلفة وانخفاض RTO/RPO:

  1. النسخ الاحتياطي والاستعادة — لقطات دورية (مثلاً ليلية) تُكتب في موقع منفصل. RTO من ساعات إلى أيام، RPO مساوٍ لفترة اللقطات. الأرخص؛ مناسب فقط للبيانات غير الحرجة.
  2. الضوء الخافت (Pilot Light) — تعمل نسخة ضئيلة من النظام (نسخة مطابقة من قاعدة البيانات، الإعداد) باستمرار في موقع التعافي من الكوارث، لكن خوادم التطبيقات متوقفة. عند وقوع الكارثة، تُشغَّل خوادم التطبيقات ويُعاد توجيه DNS. RTO من 15 إلى 60 دقيقة، RPO قريب من الصفر لقاعدة البيانات (نسخ متماثل مستمر).
  3. الاستعداد الدافئ / المواقع المتعددة النشطة — تعمل نسخة مصغرة لكنها مُشغَّلة بالكامل في منطقة ثانية في جميع الأوقات. RTO من ثوانٍ إلى دقائق. النهج النشط-النشط متعدد المناطق هو أقصى نقاط هذا الطيف: طاقة كاملة في كل منطقة، RTO قريب من الصفر، لكن بأعلى تكلفة وتعقيد تشغيلي.
خطأ شائع — التعافي من الكوارث غير المُختبَر: كثير من الفرق تُعدّ نظاماً احتياطياً، وتُعلن هدف RPO/RTO، ولا تختبر عملية التبديل الفعلية أبداً. في الواقع، المرة الأولى التي تُجري فيها تبديلاً حقيقياً تكون أثناء حادثة فعلية — أسوأ وقت ممكن لاكتشاف أن العملية معطوبة. جدوِّل تدريبات التعافي من الكوارث بشكل منتظم (هندسة الفوضى أو تمارين الطاولة) تُجري فيها ترقية النسخة الاحتياطية فعلياً وتتحقق من أن التطبيقات أعادت الاتصال، وأن تأخر النسخ المتماثل كان ضمن RPO، وأن انتشار DNS حدث ضمن RTO. نتفليكس أتمتت هذا بشكل مشهور عبر Chaos Monkey.

التبديل عند طبقة قاعدة البيانات

يعدّ التبديل في قواعد البيانات الجزء الأصعب لأن الكتابات يجب ألا تُفقَد أو تُكرَّر. السؤال الجوهري أثناء الترقية هو: كم كانت النسخة متأخرة وقت وقوع الفشل؟ هذه الفجوة هي تأخر النسخ المتماثل، وتُحدد مباشرةً ما إذا كان RPO الفعلي قد حقق هدفك.

للحفاظ على تأخر النسخ المتماثل قريباً من الصفر لمتطلبات RPO = 0، استخدم النسخ المتماثل المتزامن: ينتظر الأساسي حتى تُقرّ نسخة واحدة على الأقل بالكتابة قبل تأكيدها للعميل. يُضيف هذا كموناً (~1–5 مللي ثانية لرحلات ذهاب وإياب عبر مراكز البيانات) لكنه يضمن فقداناً صفرياً للبيانات عند التبديل. PostgreSQL مع synchronous_commit = on، وMySQL Group Replication في وضع الأساسي الواحد، والنسخ المتزامن السداسي في AWS Aurora، كلها تُنفّذ هذا النمط.

لسيناريوهات التوافر العالي حيث يمكن تحمّل RPO صغير مقابل كمون كتابة أقل، يُستخدم النسخ المتماثل غير المتزامن — يؤكد الأساسي للعميل فوراً، وتلحق النسخة في الخلفية. المقايضة صريحة: إذا تعطّل الأساسي قبل اللحاق بالنسخة، فتلك الكتابات الأخيرة مفقودة.

فكرة جوهرية: RPO = 0 يتطلب نسخاً متزامناً؛ RPO أكبر من 0 يُجيز نسخاً غير متزامن. لا توجد طريقة لتحقيق فقدان صفري للبيانات دون دفع تكلفة الكمون المرتبطة بانتظار تأكيد نسخة واحدة على الأقل لكل كتابة. هذا قيد أساسي، وليس مشكلة أدوات.

ربط كل شيء معاً

تجمع استراتيجية التعافي من الكوارث المُصمَّمة جيداً عدة عناصر: هدف RTO وRPO واضح متفق عليه مع الأعمال، وبنية طوبولوجية (نشط-سلبي أو نشط-نشط) تتناسب مع متطلبات اتساق البيانات، ووضع نسخ متماثل (متزامن أو غير متزامن) يتوافق مع RPO، وتدريبات منتظمة على التعافي من الكوارث للتحقق من أن التبديل يعمل فعلاً ضمن الأهداف المُعلنة، ومراقبة تأخر النسخ المتماثل كمؤشر قيادي لصحة RPO. الهدف ليس منع كل فشل — بل ضمان أن لكل فشل تأثيراً معروفاً ومُختبَراً ومحدوداً.