أهم ثلاثة مفاهيم المتعلقة بالفشل التي يجب تعلمها
الترحيب
تفشل الأنظمة المتوزعة في الأنماط. بمجرد تعلم الأنماط، تصبح كل تقارير الموت بعد الموت تمثيلًا تعترف به بدلاً من أن تكون لغز.
تغطي ثلاثة مفاهيم معظم ما يهم في تحليل الفشل في الإنتاج:
نقطة الفشل الواحدة (SPOF): مكون يفشل بسبب الفشل ويؤدي إلى إسقاط نظام أكبر. غالباً ما يكون مختبئًا: خادم DNS الذي يعتمد عليه الجميع؛ شهادة تتجدد ضدها كل شيء؛ المخزن الرئيسي الوحيد.
الفشل المتسلسل: فشل مكون يؤدي إلى فشل آخر، ثم يؤدي إلى فشل آخر. قاعدة البيانات البطيئة تسبب في توقفات في طبقة API، مما يؤدي إلى محاولات إعادة الارسال، مما يضاعف من الحمل على قاعدة البيانات، مما يؤدي إلى المزيد من التوقفات. ينشر الانفجار.
مدى الانفجار: مدى تضرر النظام عندما تفشل قطعة واحدة. تتمتع القرارات المعمارية بمجرد حصر أو عدم حصر مدى الانفجار. يمتلك SPOF مدى انفجار غير محدد. الخدمة bulkheaded لديها مدى انفجار محدد.
في نهاية هذا الدرس سيتم:
- تحديد نقاط الفشل الواحدة في تركيب نظام بواسطة الفحص
- التعرف على أنماط الفشل المتسلسل: العاصفة الصوتية، العاصفة من محاولات الارسال، سلة الموت
- قراءة جدول زمني حقيقي وم separation of the trigger من العيب السري التالف الذي تم استكشافه بواسطة العامل المتصاعد
- كتابة الأشياء المسببة للخطأ بلاذلة تهدف إلى توجيه أنظمة وليس الأشخاص، تغطي الوقاية / الكشف عن الفشل / استرداد
- التفكير في bulkheads & circuit breakers كأدوات حصر مدى الانفجار
انتبه إلى نقطة الفشل الواحدة
فحص تركيب الطبقات المليئة
考虑一个小型的架构 web:
- DNS: api.example.com -> IP واحد لخادم الاسم 203.0.113.10 المضيف بواسطة مقدم خدمات DNS واحد
- CDN: مقدم CDN واحد في مقدم API api.example.com
- Ingress: اثنين من أجهزة الوسائط العكسية الخلفية لوحة التوزيع
- Backend: ستة نسخ API في منطقة توافر الخدمة (two availability zones) (ثلاثة لكل منطقة)
- قاعدة البيانات: واحدة رئيسية + واحدة ثانوية للقراءة، في نفس منطقة توافر الخدمة
- Cache: مجموعة Redis، ثلاثة عقدة موزعة في نفس المناطق التوفر الخدمة (two availability zones)
السؤال: أي مكونات هي SPOFs؟ تنص الإشارة: SPOFs ليست دائمًا واضحة 'single machine' النوع. مجموعة من ثلاثة أجهزة كلها في منطقة توافر الخدمة واحدة هي SPOF لفشل المنطقة التوفر الخدمة.
ثلاثة نمط فشل كلاسيكي
الفشل يتجول عبر الاعتماديات
نمط 1: العاصفة الصاعقة. مورد مشترك (التخزين المؤقت، قفل، قاعدة بيانات) يفشل أو يبدأ مجددًا. كل عميل يعتمد عليه يحاول مجددًا في آن واحد. العواصف تفرط في ما يعود إلى العمل؛ المحاولات المكررة تفرط في ما يعود إلى العمل أسرع مما يمكنه استيعابه؛ لا يتم الانتهاء من الاسترداد أبدًا.
نمط 2: العاصفة المطردة. خدمة تحتية تتباطؤ. المستخدمون العلوية بدلاً من الفشل، يحاولون مجددًا. المحاولات المكررة تُضاعف السعة الأصلية. الخدمة البطيئة تتباطؤ أكثر، مما يؤدي إلى المزيد من المحاولات المكررة. في النهاية، يتعدي السعة المضاعفة حتى إصدار صحى من الخدمة.
نمط 3: سلاسل الموت. очередь مع عدم وجود ضغط خلفي تتلقى بشكل أسرع مما تعالج. تزداد القيود بدون حدة. تستهلك الذاكرة؛ يفشل المستهلك؛ يبدأ مجددًا؛ يجد قاعدة بيانات أكبر؛ يفشل مرة أخرى.
النقطة المشتركة: إزعاج صغير يؤدي إلى حلقة إيجابية التغذية. تستجيب النظام ذاته وتعزز الفشل بدلاً من تهدئته.
механиزمات التهدئة
الانزلاق المنزلي مع التشتت. يتأخر العملاء الذين يحاولون مجددًا بزمن أطول مع تشتت عشوائي. يمنع هذا الموجات المتزامنة من المحاولات المكررة.
مفتاح الدائرة. يتبع العميل تردد الفشل في الخدمات الأدنى. إذا تجاوز الرقم الأقصى، يتوقف العميل عن الاتصال لفترة استجمام وتعرض طلباته الفورية بدلاً من ذلك. يمنع هذا العمل الفائض، ويسمح للخدمة الأدنى بالاسترداد.
الجدار المائي. تisolat موارد مختلفة لكل اعتماد. حمولة اتصال A للقاعدة البيانية، حمولة اتصال B للخزنة. لا يمكن للقاعدة البيانية البطيئة تمنيع جميع الاتصالات؛ الاتصالات بالخزنة تستمر.
تجريد الحمولة. عند التشبع، يتم رفض الطلبات في الحافة بدلاً من القبول والفشل بطيئًا. 429 في 1 مللي ثانية أفضل من 500 في 30 ثانية.
ضغط الورق. عندما يكون المُنتِج بطيئًا عندما لا يمكن أن يُحافظ على التالي. تصبح الرفوف مقيدة؛ يُحَث المُرسِلون؛ يشعر المصدر الأصلي للعمل بالضغط.
تشخيص موجة الفشل
تتلف طبقة فريق التطبيق API أثناء عملية استبدال قاعدة البيانات الروتينية. الجدول الزمني:
- 14:00:00 — يقوم المشغل بتعيين قاعدة البيانات الاحتياطية. التوقعات: انقطاع دقيق حوالي 10 ثواني.
- 14:00:08 — الavailability الرئيسية غير متوفرة. تبدأ طلبات طبقة التطبيق API في الإخفاق مع أخطاء الاتصال بقاعدة البيانات.
- 14:00:08 — يكرر التطبيق API (تكوين افتراضي: 5 محاولات، لا توجد تأخير، 100 مللي ثانية بين كل محاولة).
- 14:00:11 — يتم تعيين الديناميكية الثانوية، القابلة للاتصال بالاتصالات الجديدة.
- 14:00:11 — يفتح التطبيق API آلاف الاتصالات الجديدة في وقت واحد (كل كائن نافذة التكرار × كل طلب مستمر × كل محاولة تجديد).
- 14:00:13 — تستهلك سلة التخصيص الجديدة للقاعدة الرئيسية الاتصالات، وترفض الاتصالات الجديدة.
- 14:00:13-14:05:00 — تستهلك سلاسل التطبيق API النمطية سلاسل التخصيص، وتطرح استثناءات، وتتوقف وتتكرر.
- 14:05:00 — يقف المشغل عن حركة التطبيق API؛ تصل إلى توازن قاعدة البيانات.
- 14:10:00 — تنتهي عملية استعادة حركة المرور التدريجية. انقطاع إجمالي: حوالي 10 دقائق (مقارنة بالتوقعات حوالي 10 ثواني).
SERVFAIL DNS: اثنان من العيوب المتعاقبة
تقرير استحواذي في الأصل
ما يلي هو نسخة منقوصة الأوصاف من حادث حقيقي. تغيير أسماء الموردين، وتحويل الأرقام IP إلى أنونيم، لكن الشكل والتوقيت والفوائد حقيقية.
ملخص
استجابت جميع قواعد بيانات DNS العامة للويب example.com بـ SERVFAIL من جميع قواعد DNS العامة للويب لمدة حوالي 3-4 ساعات. لم يتم تأثر 46 منطقة أخرى على نفس الماستر DNS. السبب الرئيسي: عيوب متعاقبة.
1. أضاف المورد أ (مورد DNS ثانوي) عنوان IP جديد لتنسيق التبديل الداخلي الذي لم يكن في قائمة allow-axfr-ips.
2. كان منطقة example.com يحتوي على تعارض CNAME مخالف للقواعد القديمة (RFC) منذ سنوات (conflict) (demo.example.com كان لديه كلاً من CNAME و MX / TXT في نفس العلامة) مما سبب للمورد أ رفض منطقة AXFR الجديدة.
الجدول الزمني (ت ع م)
- حوالي 15:00 — أضاف المورد أ عنوان IP جديد 198.51.100.42 إلى تركيبته
- 15:02 — first AXFR-out denied for 198.51.100.42 appears in primary DNS logs (no alerting on this signal)
- ~18:00 — SOA expire window reached; Vendor A drops example.com zone from cache
- ~18:30 — SERVFAIL detected externally
- ~19:45 — root cause identified
- 20:00 — 198.51.100.42 added to allow-axfr-ips; primary restarted
- 20:05 — NOTIFY sent; AXFR initiated; zone STILL SERVFAIL (CNAME conflict)
- 20:07 — check-zone reveals 1 error: CNAME conflict on demo.example.com
- 20:09 — CNAME replaced with A record; zone check clean (0 errors)
- 20:10 — NOTIFY sent; AXFR completes; Vendor A begins serving zone
- 20:11 — dig @8.8.8.8 example.com A returns correct IP — RESOLVED
Why Only example.com?
All 47 zones share the same DNS primary. The AXFR IP block affected all zones. But only example.com had the CNAME conflict, & only example.com needed a fresh AXFR at the moment the deny was enforced. Other zones had already refreshed before the deny or did not yet need to.
Latent defect
The CNAME conflict at demo.example.com had existed for years. It worked because the primary served the zone from its database (lenient about RFC violations) & Vendor A was serving from stale cached data from before the violation was introduced. When Vendor A dropped its cache & needed fresh data, the violation surfaced.
Trigger
Vendor A silently added a new sync IP. The primary's allowlist did not include it. AXFR denied. Three hours later (SOA expire), Vendor A dropped the zone. The latent defect surfaced when the system tried to recover.
Write Blameless Action Items
Blameless: Target Systems, Not People
A blameless action item names something the system should do differently, not something a person should do differently. 'Train the operator' is blameful. 'Add an automated check that catches this before deploy' is blameless.
Good blameless action items cluster into three dimensions:
- Prevention: make the bad thing harder or impossible
- Detection: notice it sooner if it happens
- Recovery: limit the damage when it happens
Each item should name (1) the specific system change, (2) an owner team, & (3) the dimension it serves.
غرف مغلقة تغرق دون غرق السفينة
استعارة من الهندسة البحرية
تتخذ السفن جدران مغلقة المياه: جدران عمودية تمتد بين الجسم والسفينة. يمكن أن تغرق غرفة واحدة دون غرق السفينة؛ يمكن أن تفشل أخرى دون تأثير على باقيها.
تستعير أنظمة التوزيع نفس الكلمة ونفس الفكرة.
نمط الجدران المغلقة: تisolate الموارد لكل تتمة الاعتماد. خدمة تستدعي ثلاثة APIs downstream تستخدم ثلاثة حمولات من المسابقة، ثلاثة حمولات من المجموعة، ثلاثة حمولات من الميزانية مجددا. API downstream بطيء أو فاشل لا يستهلك الموارد المخصصة للثاني.
بدون جدران مغلقة: تستهلك تتمة بطيئة الحزمة المشتركة للمجموعة؛ يتم استدعاء تتمات أخرى بالانتظار للحصول على الحزمة؛ تصبح الخدمة بأكملها غير مرئية.
مع جدران مغلقة: تستهلك تتمة بطيء حزمةها الخاصة؛ يتم رفض استدعاءها بسرعة؛ يتم استدعاء تتمات أخرى بشكل طبيعي؛ يظل نطاق الانفجار مقتصرًا على التمية الفاشلة.
مفاتيح الدائرة
نمط مفاتيح الدائرة: غطاء ذو حالة حول التمية الخارجة التي تتبع معدل الفشل. ثلاثة حالات:
- مغلق (طبيعي): يتم استدعاء المكالمات. الفشل يتم احتسابها.
- مفتوح (انفجار): بعد انفجار الفشل (قول 50% الفشل في آخر 30 ثانية)، يتم فتح المفتاح. المكالمات تفشل على الفور دون محاولة التمية. يحمي ذلك من إهدار العمل للصياد؛ يحمي ذلك من التمية من تلقي الشحن أثناء عدم صحته.
- نصف مفتوح (الاختبار): بعد فترة تهدئة، يسمح المفتاح لمجموعة صغيرة من المكالمات. إذا نجحت، يغلق إلى الطبيعي. إذا فشلت، يفتح مجددًا لفترة تهدئة.
المفاجأة الرئيسية: مفاتيح الدائرة تحمي من إهدار العمل خلال الفترات المعروفة بالعدائية، وتوفر فرصة لتحسين التمية الخارجة من الشغل دون شحن مستمر.
الجدران المغلقة تحد من نطاق الانفجار. مفاتيح الدائرة تحمي من استمرار الانفجار.
حدد نطاق الانفجار
خدمات الـ API تستدعي اربعة خدمات فرعية: خدمة المستخدم، خدمة التوصيات، خدمة الإشعار، وواجهة برمجة تطبيقات الدفع الخارجية. سمعت الفريق "أن خدمة التوصيات كانت قليلاً مشبعة" ويريد أن يضمن أن إذا فشلت، ستظل باقي النظام صحيا.
في الوقت الحالي تستخدم الخدمة مساحة واحدة من المجموعة المشتركة من 200 سلسلة وأحواض HTTP واحدة. جميع الأربعة المنافسين على هذه الموارد. لا توجد وحدات منع.
صمم مراجعة الحالات الاستثنائية
التركيب
تعلمت تحديد SPOFs بالفحص، التعرف على أنماط الفشل المتسارع، قراءة ملخصات المخاوف بدون مسؤولية، كتابة أعمال مسؤولة بدون مسؤولية، وحدد نطاق الضرر بbulkheads + circuit breakers + التدهور اللطيف.
تطبيقه كل الخمسة.
فريقك يطرح خدمة بحث جديدة search.example.com تعتمد على ثلاث خدمات فرعية: مؤشر البحث الرئيسي (index.example.com)، خدمة التحليلات (analytics.example.com)، وخدمة التوصيات (recs.example.com). يريد الفريق منك أن تقود "مراجعة الحالات الاستثنائية" قبل الإطلاق.
أين يذهب هذا الدورة التالية
أين يذهب هذا الدورة التالية
يمكنك الآن تحديد SPOF، التعرف على التسارع، قراءة ملخصات المخاوف بشكل إيجابي، كتابة أعمال مسؤولة، وحدد نطاق الضرر بتصميم.
الدرس النهائي في هذا الدورة التعليمية (cs_distsys_observability_and_capacity) يشرح ما يجب قياسه حتى تكتشف أن المشكلة تحدث قبل أن يفعلها المستخدمون. فحوصات الصحة و endpoints للنسخ، والأربعة إشارات ذهبية في طبقة البروكسي، وكيف أن قرارات السعة الزائدة مرتبطة بالبيانات الملاحظة.
درس توأم: geometry_of_failure_modes_and_blast_radius يشتمل على تحديد الوسطية بين النقاط (النقطة التي هي العائق) و min-cut (الحد الأدنى لمدى انفجار الراديوس).
جيد جدا. سيرًا للأمام.