تجارب الفوضى: البنية التحتية
تجارب الفوضى: البنية التحتية
تختبر تجارب فوضى البنية التحتية أنماط الفشل الأكثر أهمية على نطاق واسع: الاختفاء المفاجئ للحوسبة، وإشباع مورد ما، وقطع مسار شبكي. هذه ليست حالات حافة نظرية — بل هي السيناريوهات بالضبط التي تسببت في انقطاعات كبرى في AWS وGoogle وكل نظام موزع ضخم. يعلمك هذا الدرس كيف تصمم هذه التجارب وتنفذها وتتعلم منها في الإنتاج دون أن تسبب الحوادث التي تسعى إلى منعها.
التجربة الأولى: إيقاف النسخ والمناطق
أكثر تجارب فوضى البنية التحتية جوهرية هي إنهاء تشغيل نسخة جارية أو إيقاف منطقة توافرية كاملة. هذا يتحقق من افتراض أساسي: يمكن لنظامك أن يفقد وحدة حوسبة دون التأثير على المستخدمين. إن لم يستطع، فأنت اكتشفت نقطة فشل وحيدة قبل أن يفعل ذلك مزود السحابة نيابةً عنك.
في كبرى شركات التقنية، تُجرى عمليات إنهاء النسخ بشكل مستمر. يفعل Chaos Monkey الأصلي لـ Netflix هذا تحديدًا: يُنهي نسخ EC2 عشوائيًا خلال ساعات العمل. المبرر هو أنك إذا أجريت الفوضى فقط في الليل، ستصبح متساهلًا — تحتاج إلى مهندسي الاستجابة لحالات الطوارئ حاضرين عندما يكون النظام تحت الضغط.
تصميم التجربة:
- الحالة الثابتة: زمن الاستجابة p99 أقل من 200 مللي ثانية، معدل الخطأ أقل من 0.1%، جميع فحوصات الصحة خضراء.
- الفرضية: إنهاء نسخة واحدة في مجموعة Auto Scaling لا يُدهور زمن الاستجابة للمستخدمين أكثر من 250 مللي ثانية p99 لأكثر من 60 ثانية.
- نطاق الانفجار: نسخة واحدة (1 من N في المجموعة). لا تُوقف أكثر من 33% من طبقة ما في آنٍ واحد في التشغيل الأول.
- التراجع: إعادة تفعيل الطاقة المُنهاة فورًا؛ الاستعادة من لقطة إذا لزم الأمر.
باستخدام AWS Fault Injection Service (FIS)، يمكنك إنهاء نسخة عبر وثيقة تجربة منظمة بدلًا من استدعاء API مباشر. هذا يمنحك مسارات تدقيق وإجراءات تراجع وشروط إيقاف:
كتلة stopConditions حيوية: إذا اشتعل إنذار CloudWatch الخاص بك (بمعنى أن النظام يعاني فعلًا من تدهور)، يوقف FIS التجربة تلقائيًا. هذا هو قاطع الدائرة الآلي — لا تُشغِّل تجارب فوضى بنية تحتية أبدًا بدون شرط إيقاف مرتبط بإنذار SLO حقيقي.
تجارب المنطقة الكاملة هي خطوة أبعد من إيقاف النسخ. محاكاة انقطاع منطقة توافرية تعني حجب كل حركة مرور بين طبقة تطبيقك وشبكات المنطقة المستهدفة. في Kubernetes يتم ذلك بإضافة سياسة شبكة تحظر الخروج إلى نطاقات CIDR للمنطقة الفاشلة:
topologySpreadConstraints في مواصفة البود، يمكن لجدوَل Kubernetes وضع جميع النسخ في منطقة توافرية واحدة، مما يجعل إيقاف المنطقة كارثيًا. وزّع الأحمال دائمًا عبر المناطق قبل تشغيل تجارب إيقاف المنطقة — ستعلمك التجربة ما إذا كان التوزيع يحدث فعلًا.
التجربة الثانية: استنفاد الموارد
تجارب استنفاد الموارد تجيب على السؤال: ماذا يحدث عندما تنفد موارد المضيف من CPU أو ذاكرة أو قرص؟ هذه الإخفاقات خفية لأنها تتدهور تدريجيًا، وتتسبب في تأثيرات متتالية عبر الخدمات على نفس المضيف، وغالبًا ما تُطلق أنماط فشل (قتل OOM، والتخبط، وانزياح الساعة) يستحيل إعادة إنتاجها بأي طريقة أخرى.
استنفاد CPU — الأداة stress-ng هي المعيار الإنتاجي لتوليد حمل CPU محكوم. اقرنها بحد زمني حتى لا تعمل إلى ما لا نهاية:
ضغط الذاكرة — إجبار عملية ما نحو حدود OOM يكشف كيف يتصرف تطبيقك في ظل منافسة الذاكرة. على Linux، يُنهي قاتل OOM في النواة العملية ذات أعلى درجة OOM. فهم أي عملية تُقتل أولًا أمر حيوي للأنظمة التي تحتوي على حاويات متعددة على عقدة:
استنفاد القرص — ملء نظام ملفات هو أبسط طريقة لإحداث تلف صامت في البيانات وإخفاق الكتابة وإخفاقات متتالية في خطوط أنابيب السجلات. شغّل دائمًا تجارب استنفاد القرص في نقطة تحميل tmpfs، لا على وحدة التخزين الجذرية أو وحدة البيانات:
التجربة الثالثة: تقسيمات الشبكة
تقسيمات الشبكة هي أخطر تجارب البنية التحتية وأكثرها كشفًا. تكشف حالات الدماغ المنقسم، والحالة غير المتسقة، وعواصف إعادة المحاولة، وأخطاء ضبط المهل الزمنية التي لا يمكن لأي اختبار وحدة أو تكامل اكتشافها. يصبح مبرهنة CAP حقيقيًا بشكل ملموس عندما تُقسّم مجموعة قاعدة بيانات في الإنتاج وتلاحظ ما إذا كان تطبيقك يختار الاتساق أم التوافرية.
الأداة المعيارية لحقن أعطال الشبكة على Linux هي tc (التحكم في حركة المرور) مع نظام netem. يمكن لـ tc netem حقن الكمون وفقدان الحزم والتكرار والتلف والثقوب السوداء الكاملة بدقة نانو ثانية:
على مستوى Kubernetes، استخدم NetworkPolicy لعزل بود أو نطاق اسم كامل عن اعتماده الأعلى. هذا أأمن من tc لأنه تصريحي وقابل للتراجع الكامل بمجرد حذف كائن السياسة:
kubectl logs -f وراقب مقاييسك بحثًا عن "ارتفاع التعافي" — إذا ارتفع p99 فوق الحالة الثابتة أثناء التعافي، فإن منطق إعادة المحاولة يحتاج إلى إصلاح.
قياس نتائج التجارب
يجب أن ترتبط كل تجربة فوضى بنية تحتية بإشارة حالة ثابتة قابلة للقياس. بدون القياس، لا تُجري تجربة — بل تكسر الأشياء فحسب. المجموعة الدنيا من المقاييس اللازمة لأي تجربة بنية تحتية:
- معدل الخطأ: نسبة الطلبات التي تُرجع 5xx. يجب تحديد خط الأساس قبل التجربة.
- مئينيات زمن الاستجابة: p50 وp95 وp99. غالبًا تُظهر إيقافات النسخ ارتفاعات مقبولة في زمن الاستجابة خلال الإخفاق؛ يجب أن تُظهر إيقافات المنطقة تعافيًا كاملًا ضمن نافذة SLO.
- الإشباع: وقت تقييد CPU، معدل أخطاء صفحات الذاكرة، انتظار إدخال/إخراج القرص. هذه تكشف ما إذا كان استنفاد الموارد قد أثّر على طبقة التطبيق.
- معدلات إعادة المحاولة والمهل: ارتفاع أعداد إعادة المحاولة دون ارتفاع معدلات الخطأ يعني أن سياسة إعادة المحاولة تعمل. ارتفاع إعادة المحاولات والأخطاء معًا يعني إخفاقًا متتاليًا.
الخلاصة
تجارب فوضى البنية التحتية — إيقاف النسخ، وإخفاق المناطق، واستنفاد الموارد، وتقسيمات الشبكة — تكشف كل منها فئة مميزة من أنماط الفشل في الإنتاج. تتحقق إيقافات النسخ من تكرارك وضبط الاسترداد التلقائي. تتحقق إيقافات المنطقة من أن توزيع حركة المرور متعدد المناطق فعلًا. تكشف تجارب استنفاد الموارد ما إذا كانت تطبيقاتك تتدهور بأناقة أم تفشل بصمت. تكشف تقسيمات الشبكة عن سلوك المهلة وإعادة المحاولة وقاطع الدائرة الذي لا يمكن لأي اختبار اصطناعي تكراره. شغّلها بترتيب تصاعدي من نطاق الانفجار، دائمًا مع شرط إيقاف، دائمًا مع فرضية موثقة، ودائمًا مع مقاييس مفتوحة على شاشتك الثانية.