فحوصات الصحة والتعافي من الأعطال
فحوصات الصحة والتعافي من الأعطال
إضافة المزيد من الخوادم تحل مشكلة الطاقة الاستيعابية، لكنها تطرح فوراً سؤالاً أصعب: كيف يعرف موزع الحمل أي الخوادم جاهزة فعلاً لخدمة حركة المرور؟ عملية متعطلة، أو تطبيق استنفد ذاكرته، أو مجموعة اتصالات قاعدة البيانات التي نفدت، أو خيط تنفيذ متوقف — كل هذه الحالات تُبقي الخادم "يعمل" على مستوى الشبكة بينما هو عاجز تماماً عن خدمة الطلبات. بدون آلية منهجية لاكتشاف هذه الأعطال والتحويل حولها، سيستمر موزع الحمل في إرسال حركة المرور إلى فراغ، وسيرى مستخدموك أخطاء متتالية.
فحوصات الصحة والتعافي من الأعطال هي الآليات التي تحوّل مجموعة من الخوادم المستقلة إلى مجموعة تتعافى ذاتياً. وهي العمود الفقري التشغيلي لأي نظام عالي التوفر.
ما الذي يفحصه فحص الصحة فعلاً؟
ثمة ثلاثة مستويات من فحوصات الصحة تتصاعد في العمق، واختيار المستوى المناسب قرار تصميمي متعمد:
- المستوى الأول — فحص TCP / Ping: هل يمكننا فتح اتصال TCP على المنفذ 8080؟ هذا يخبرك أن نظام التشغيل حي والعملية تستمع. لكنه لا يقول شيئاً عن قدرة التطبيق على معالجة الطلبات فعلياً. معدل الإنذار الكاذب: مرتفع.
- المستوى الثاني — فحص حالة HTTP: هل يُعيد
GET /healthاستجابة HTTP 200؟ هذا يخبرك أن خادم الويب يستجيب. لكنه لا يخبرك عن إمكانية الوصول إلى التبعيات المصبّية (قاعدة البيانات، الذاكرة المؤقتة، قائمة الانتظار). معدل الإنذار الكاذب: متوسط. - المستوى الثالث — الفحص العميق / فحص التبعيات: هل يُعيد
GET /health/readyاستجابة 200 ويتحقق أيضاً من حيوية اتصال قاعدة البيانات وإمكانية الوصول إلى الذاكرة المؤقتة وعمل قائمة الانتظار؟ هذا أدق إشارة للجاهزية الفعلية، لكنه يضيف كموناً للفحص نفسه وقد يتسبب في موجة من حركة مرور الفحص تحت الضغط.
معاملات تكوين فحص الصحة
كل موزع حمل يعرض على الأقل هذه المعاملات الأربعة، وضبطها بشكل صحيح يصنع الفارق بين نظام يتعافى في 5 ثوانٍ وآخر يحتاج 3 دقائق:
- الفاصل الزمني (Interval) — مدة تكرار المسبار. النموذجي: 5–15 ثانية. أقصر = اكتشاف أسرع، لكن حركة مرور فحص أكبر.
- المهلة (Timeout) — مدة الانتظار للاستجابة قبل احتساب الفشل. النموذجي: 2–5 ثوانٍ. يجب أن تكون أقل من الفاصل الزمني.
- عتبة عدم الصحة (Unhealthy threshold) — عدد الإخفاقات المتتالية قبل إزالة المثيل من التدوير. النموذجي: 2–3. عتبة 1 تسبب تذبذباً عند حدوث اضطرابات شبكية عابرة.
- عتبة الصحة (Healthy threshold) — عدد النجاحات المتتالية قبل إعادة إضافة مثيل متعافٍ للتدوير. النموذجي: 2–3. هذا يمنع إعادة إضافة مثيل نجح عشوائياً في فحص واحد أثناء حالة متدهورة.
فحوصات الصحة السلبية مقابل النشطة
ثمة استراتيجيتان متكاملتان لاكتشاف الأعطال، وأنظمة الإنتاج تستخدم كلتيهما:
الفحوصات النشطة (استباقية): يبادر موزع الحمل بإرسال طلب مسبار مخصص لكل خادم خلفي وفق جدول زمني. ميزتها أنك تكتشف الأعطال حتى عند غياب حركة المرور الحقيقية. عيبها أن نقطة نهاية الصحة يجب أن تكون خفيفة — فحص تبعيات ثقيل كل 5 ثوانٍ على 50 خادماً يولّد حملاً كبيراً.
الفحوصات السلبية (تفاعلية): يراقب موزع الحمل استجابات الطلبات الحقيقية أثناء مرورها. إذا أعاد خادم ما أخطاء 5xx أو انتهت مهلته في N طلبات متتالية، يُعلَّم على أنه غير صحي. ميزتها عدم توليد حركة مرور إضافية. عيبها أنها لا تُشغَّل إلا عند تعرض المستخدمين الحقيقيين لأخطاء — لا يمكنك اكتشاف العطل قبل أن يصطدم به المستخدمون.
الإغلاق السلس وتفريغ الاتصالات
إزالة خادم من المجموعة أثناء نشر متداول أو حدث تقليص يمثل سيناريو فشل مقنّع. إذا أوقف موزع الحمل إرسال الاتصالات الجديدة في اللحظة التي يتلقى فيها إشارة الإغلاق، فإن الطلبات الجارية — التي قد تستغرق 0.5 إلى 30 ثانية — ستُقطع فجأة. يرى المستخدمون أخطاء ليس لها علاقة بالبق في كودك.
الحل هو تفريغ الاتصالات (تسميه AWS "تأخير إلغاء التسجيل"؛ وNGINX يسميه proxy_next_upstream). التسلسل هو:
- يُشير المثيل إلى أنه يغلق (SIGTERM، أو نقطة نهاية الصحة تُعيد 503).
- يوقف موزع الحمل توجيه الطلبات الجديدة لذلك المثيل.
- ينتظر موزع الحمل حتى مهلة تفريغ قابلة للتكوين (عادةً 30–90 ثانية) حتى تكتمل الطلبات الجارية.
- بعد انتهاء المهلة، تُغلق أي اتصالات متبقية قسراً ويُلغى تسجيل المثيل.
التعافي من الأعطال: التلقائي مقابل اليدوي
عند فشل خادم ما، يجب إعادة توزيع حركة المرور. هذه إعادة التوزيع هي التعافي من الأعطال، وتحدث على مستويين:
التعافي على مستوى المثيل يتم تلقائياً بواسطة موزع الحمل. عند إزالة الخادم C من المجموعة، تُعاد توزيع حصته من وزن الاتصالات على الخوادم السليمة المتبقية. يحدث هذا في غضون ثوانٍ ولا يتطلب أي تدخل بشري. الخطر هو الفشل المتتالي: إذا كانت الخوادم A وB تعملان بالفعل عند طاقة 70%، فإن استيعاب حركة مرور C ترفعهما إلى 105% — وتبدآن بالفشل هي أيضاً.
التعافي على مستوى المنطقة/الإقليم يتعامل مع الحالة التي يصبح فيها منطقة توفر كاملة أو مركز بيانات كاملاً غير متاح. Route 53 وموزعات الحمل العالمية الأخرى تدعم تحويل الفشل المستند إلى فحص الصحة عبر DNS: إذا فشل نقطة النهاية الأساسية في فحصها، يُحدَّث DNS تلقائياً للإشارة إلى المنطقة الثانوية. يجب تعيين TTL لـ DNS منخفضاً (60–120 ثانية) ليكون هذا فعّالاً — TTL بمقدار 300 ثانية يعني 5 دقائق من الأعطال قبل أن يرى العملاء السجل المحدَّث.
قواطع الدائرة: منع موجات إعادة المحاولة
يُزيل موزع الحمل الخلفيات غير الصحية من مجموعته الخاصة — لكن ماذا عن الاستدعاءات بين الخدمات في أعمق طبقات النظام؟ إذا كانت الخدمة A تستدعي الخدمة B، وكانت B مُثقلة، فإن كل إعادة محاولة من A تضيف مزيداً من الحمل على B، مما يجعل التعافي مستحيلاً. هنا تأتي قواطع الدائرة.
قاطع الدائرة آلة حالة لها ثلاث حالات:
- مغلق (التشغيل العادي): تتدفق الطلبات بشكل طبيعي. يُحصي القاطع الإخفاقات. إذا تجاوز معدل الفشل عتبة ما (مثلاً 50% من الطلبات في نافذة 10 ثوانٍ)، تنفتح الدائرة.
- مفتوح (الفشل السريع): جميع الاستدعاءات للخدمة المصبّية تُعيد خطأً فوراً دون إجراء أي استدعاء شبكي. هذا يمنح الخدمة المصبّية وقتاً للتعافي. بعد مهلة قابلة للتكوين (مثلاً 30 ثانية)، تدخل الدائرة في حالة نصف مفتوحة.
- نصف مفتوح (الاختبار): يُسمح لعدد محدود من طلبات الاختبار بالمرور. إذا نجحت، تُغلق الدائرة. وإذا فشلت، تُفتح مرة أخرى.
المقاييس الأساسية للمراقبة
تُطلق فحوصات الصحة إنذاراتها قبل أن تصبح الأعطال مرئية للمستخدمين، لكنك تحتاج أيضاً إلى إشارات فورية لفريق العمليات:
- نسبة صحة المثيلات: ما نسبة المثيلات التي تجتاز فحوصات الصحة حالياً؟ أطلق تنبيهاً عند أقل من 80%.
- معدل أحداث التعافي: كم مثيلاً أُزيل من المجموعة في الساعة الأخيرة؟ معدل غير صفري في الحالة الطبيعية يُشير إلى خطأ متكرر أو تسرب ذاكرة أو تبعية خارجية تنقطع بشكل دوري.
- متوسط وقت الاكتشاف (MTTD): كم يمر بين وقوع العطل وتحويل موزع الحمل حوله؟ هدفك يجب أن يكون أقل من 30 ثانية للخدمات المواجهة للمستخدم.
- معدل أخطاء 5xx أثناء التعافي: بعض الأخطاء خلال نافذة الاكتشاف (قبل إزالة المثيل غير الصحي) لا مفر منها. الهدف هو تقليص هذه النافذة، لا القضاء على الأخطاء كلياً.
فحوصات الصحة والتعافي من الأعطال تهدف في نهاية المطاف إلى بناء نظام يعرف إخفاقاته الخاصة قبل أن يعرفها مستخدموه، ويتخذ إجراءات تصحيحية تلقائياً. ادمجها مع تنبيهات جيدة وهامش سعة وقواطع دائرة، وستمتلك أساس نظام موزع يتعافى ذاتياً بشكل حقيقي.