
نصبح ما نراه. أولاً نقوم بتشكيل الأدوات ، ثم تقوم الأدوات بتشكيلنا.
مارشال ماكلوهان
أود أن أعرب عن خالص الشكر والتعبير عن امتناني لصديقي العزيز ريكاردو سويراس على مراجعته ومساهمته وعدم السماح لي بمغادرة هذا المقال. ريكاردو ، أنت مجرد أسطورة!
من المهم أن تتذكر أن هندسة الفوضى ليست عند إطلاق القرود وإدخال حالات الفشل بشكل عشوائي. هندسة الفوضى هي تقنية تجريبية محددة بشكل جيد.
"تنطوي هندسة الفوضى على الملاحظة الدقيقة والشك الشديد فيما يتعلق بموضوع الملاحظة ، لأن الافتراضات المعرفية تشوه تفسير النتائج. تتضمن هذه التقنية صياغة الفرضيات من خلال الاستقراء استنادًا إلى ملاحظات مماثلة ؛ الاختبار التجريبي والقائم على الاستنتاجات المقدمة من فرضيات مماثلة ؛ التعديل أو رفض الفرضيات على أساس النتائج التجريبية "
-Wikipedia
تبدأ هندسة الفوضى بفهم الحالة المستقرة للنظام الذي تتعامل معه ، والصياغة اللاحقة للفرضية ، وأخيرا التجربة التي تؤكد ذلك ، مما يساعد على زيادة هامش أمان النظام.

مراحل هندسة الفوضى
في الجزء الأول من سلسلة من المقالات ، قمت بتقديم هندسة الفوضى وناقشت كل خطوة من المنهجية المذكورة أعلاه.
في الجزء الثاني ، نظرت إلى المجالات التي تحتاج إلى الاستثمار فيها عند تصميم التجارب على هندسة الفوضى ، وكيفية اختيار الفرضيات الصحيحة.
في هذا الجزء الثالث ، سأركز على التجربة نفسها وسأقدم مجموعة مختارة من الأدوات والأساليب التي تغطي مجموعة واسعة من حالات الفشل.
القائمة ليست شاملة ، ولكن بادئ ذي بدء ، ولتقديم الغذاء للتفكير ، ينبغي أن تكون كافية.
مقدمة من الفشل - ما هو وما هو؟
يستخدم الفشل للتحقق من أن استجابة النظام تلبي المواصفات في ظل ظروف التحميل العادية. لأول مرة تم استخدام هذه التقنية عندما تم عرض حالات الفشل عند مستوى "الحديد" - على مستوى الاتصالات ، عن طريق تغيير الإشارات الكهربائية على الأجهزة.
في البرمجة ، يساعد إدخال الإخفاقات على تحسين ثبات نظام البرمجيات ويسمح لك بتصحيح أوجه القصور في مقاومة الإخفاقات المحتملة في النظام. وهذا ما يسمى استكشاف الأخطاء وإصلاحها. كما أنه يساعد في تقييم الأضرار الناجمة عن الفشل - أي نصف قطر الضرر ، حتى قبل حدوث الفشل في بيئة الإنتاج. وهذا ما يسمى خطأ التنبؤ.
ينطوي تقديم الإخفاقات على العديد من الفوائد الرئيسية ، مما يساعد على:
- فهم وممارسة الاستجابات للحوادث والحوادث.
- فهم آثار الفشل الحقيقي.
- فهم فعالية وقيود آليات التسامح مع الخطأ.
- القضاء على أخطاء التصميم واكتشاف نقاط الفشل الشائعة.
- فهم وتحسين نظام الملاحظة.
- فهم نصف قطر فشل الفشل وتضييق عليه.
- فهم انتشار الخطأ بين مكونات النظام.
فئات الفشل
هناك 5 فئات لإدخال الفشل: على مستوى (1) مورد ؛ (2) الشبكة والتبعيات ؛ (3) التطبيق ، العملية ، والخدمة ؛ (4) البنية التحتية ؛ و (5) المستوى البشري **.
بعد ذلك ، سأقوم بدراسة كل فئة من الفئات وأعطي مثالاً على تقديم إخفاقات لكل منها. سأدرس أيضًا مثالًا لإدخال الإخفاقات وأدوات تزامن الكل في واحد.
** مهم! في هذا المنشور ، لا أتطرق إلى إدخال الإخفاقات على المستوى الإنساني ، لكنني سوف أفكر في الأمر فيما يلي.
1 - مقدمة من الفشل على مستوى الموارد ، ويعرف أيضا باسم نقص الموارد.
نعم ، لقد علمتنا تقنيات الحوسبة السحابية أن الموارد غير محدودة تقريبًا ، لكنني أسارع إلى خيبة أملك: فهي ليست بلا حدود. مثيل ، حاوية ، وظيفة ، إلخ. - بغض النظر عن التجريد ، تنتهي الموارد في النهاية. يسمى تجاوز الحد الأقصى المسموح به لاستنفاد الموارد بالإنفاد.

قلة الموارد تحاكي هجوم رفض الخدمة ، ولكن ليس الهجوم المعتاد ، للتسلل إلى الخادم المقصود. قد تكون مقدمة حالات الفشل هذه واسعة الانتشار ، لأنه ، على الأرجح ، ليس من الصعب استخدامها.
نفاد موارد وحدة المعالجة المركزية والذاكرة وموارد الإدخال / الإخراج
واحدة من أدواتي المفضلة هي الإجهاد ، مراسلات أداة اختبار الإجهاد الأصلية ، تأليف Amos Waterland .
مع الإجهاد-نانوغرام ، يمكن إدخال الأخطاء عن طريق تحميل مختلف النظم الفرعية المادية للكمبيوتر ، وكذلك التحكم في واجهات جوهر النظام باستخدام اختبارات الإجهاد. تتوفر اختبارات الإجهاد التالية: وحدة المعالجة المركزية ، وذاكرة التخزين المؤقت لوحدة المعالجة المركزية ، والجهاز ، و I / O ، والمقاطعة ، ونظام الملفات ، والذاكرة ، والشبكة ، ونظام التشغيل ، وخط الأنابيب ، والجدولة ، و VM. تتضمن صفحات الرجل وصفًا كاملاً لجميع اختبارات الإجهاد المتاحة ، ولا يوجد سوى 220 منها!
فيما يلي بعض الأمثلة العملية لكيفية استخدام الإجهاد- ng:
يوفر الحمل على وحدة المعالجة المركزية matrixprod
المزيج الصحيح من العمليات مع الذاكرة وذاكرة التخزين المؤقت والنقطة العائمة. هذا ربما. أفضل طريقة لتسخين وحدة المعالجة المركزية بشكل جيد.
❯ stress-ng —-cpu 0 --cpu-method matrixprod -t 60s
تحميل iomix-bytes
يكتب N بايت لكل iomix
معالج iomix
؛ الافتراضي هو 1 غيغابايت ويعتبر مثاليًا لإجراء اختبار إجهاد الإدخال / الإخراج. في هذا المثال ، سأقوم بتعيين 80٪ من المساحة الحرة على نظام الملفات.
❯ stress-ng --iomix 1 --iomix-bytes 80% -t 60s
vm-bytes
عظيم لاختبارات الإجهاد الذاكرة. في هذا المثال ، يقوم الإجهاد ng بإجراء 9 اختبارات إجهاد للذاكرة الظاهرية ، والتي تستهلك معًا 90٪ من الذاكرة المتوفرة في الساعة. وبالتالي ، يستهلك كل اختبار tress 10٪ من الذاكرة المتوفرة.
❯ stress-ng --vm 9 --vm-bytes 90% -t 60s
نفاد مساحة القرص على محركات الأقراص الصلبة
dd
هي أداة مساعدة لسطر الأوامر تم تجميعها لتحويل الملفات ونسخها. ومع ذلك ، يمكن لـ dd
القراءة و / أو الكتابة من ملفات الأجهزة الخاصة مثل /dev/zero
و /dev/random
لمهام مثل النسخ الاحتياطي لقطاع التمهيد للقرص الصلب والحصول على كمية ثابتة من البيانات العشوائية. وبالتالي ، يمكن استخدامه لإدخال حالات الفشل على الخادم ومحاكاة تجاوز سعة القرص. هل تجاوزت ملفات السجل الخادم الخاص بك وأسقطت التطبيق؟ لذلك ، سوف يساعد dd
- وسوف يضر!
استخدم dd
بعناية فائقة. أدخل الأمر غير صحيح - وسيتم مسح البيانات الموجودة على القرص الصلب أو إتلافها أو الكتابة عليها!
❯ dd if=/dev/urandom of=/burn bs=1M count=65536 iflag=fullblock &
تطبيق API Slowdown
يعد أداء واجهة برمجة التطبيقات (API) وقدرتها على التوسع وقابليتها للتطوير من الأمور المهمة. تعد واجهات برمجة التطبيقات ضرورية لبناء التطبيقات وتنمية أعمالك.
يعتبر اختبار التحميل طريقة رائعة لاختبار التطبيق الخاص بك قبل بدء الإنتاج. هذه أيضًا طريقة رائعة لتحميل الإجهاد ، لأنها تكشف غالبًا عن استثناءات وقيود ، في ظل ظروف أخرى ، كانت ستظل غير مرئية قبل الاجتماع بحركة مرور حقيقية.
wrk
هو أداة قياس HTTP التي تضع ضغطًا كبيرًا على الأنظمة. أود بشكل خاص اختبار اختبارات إمكانية الوصول إلى واجهة برمجة التطبيقات ، خاصةً عندما يتعلق الأمر بفحوصات الأداء ، لأنها تكشف الكثير من الأشياء المتعلقة بقرارات التصميم على مستوى رمز المطور: كيف يتم تكوين ذاكرة التخزين المؤقت؟ كيف يتم تطبيق الحد الأقصى للسرعة؟ هل يعطي النظام الأولوية للفحوصات الصحية المتعلقة بموازنات التحميل؟
إليك من أين تبدأ:
❯ wrk -t12 -c400 -d20s http://127.0.0.1/api/health
يبدأ هذا الأمر في تشغيل 12 مؤشر ترابط ويبقي 400 اتصال HTTP مفتوحة لمدة 20 ثانية.
2 - تقديم الأعطال والتبعيات على مستوى الشبكة
يعد كتاب Peter Deutsch ، The Eight Fallies of Computing Computing ، مجموعة من الافتراضات التي يضعها المطورون عند تصميم الأنظمة الموزعة. ثم يطير الجواب في شكل عدم إمكانية الوصول ، وعليك إعادة كل شيء. هذه الافتراضات الخاطئة هي:
- الشبكة موثوقة.
- التأخير هو 0.
- عرض النطاق الترددي لا نهاية لها.
- الشبكة آمنة.
- طوبولوجيا لا يتغير.
- هناك مسؤول واحد فقط.
- تكلفة النقل 0.
- الشبكة متجانسة.
تعد هذه القائمة نقطة انطلاق جيدة لاختيار تجاوز الفشل إذا كنت تقوم باختبار لمعرفة ما إذا كان النظام الموزع يمكنه معالجة فشل الشبكة.
تقديم الكمون الشبكة ، والخسارة وانقطاع
تقديم استتار الشبكة أو فقدها أو انقطاعها
tc
( التحكم في حركة المرور ) هي أداة سطر أوامر Linux تستخدم لتكوين جدولة دفعات kernel Linux. إنه يحدد كيفية وضع الحزم في قائمة الانتظار للإرسال والاستقبال في واجهة الشبكة. تتضمن العمليات قائمة الانتظار وتعريف السياسة والتصنيف والتخطيط والتشكيل والخسارة.
يمكن استخدام tc
لمحاكاة التأخير وفقدان الحزمة لتطبيقات UDP أو TCP أو للحد من استخدام عرض النطاق الترددي لخدمة معينة - لمحاكاة ظروف حركة مرور الإنترنت.
- تقديم تأخير قدره 100 مللي ثانية
#Start ❯ tc qdisc add dev etho root netem delay 100ms #Stop ❯ tc qdisc del dev etho root netem delay 100ms
- إدخال تأخير قدره 100 مللي ثانية مع دلتا قدرها 50 مللي ثانية
#Start ❯ tc qdisc add dev eth0 root netem delay 100ms 50ms #Stop ❯ tc qdisc del dev eth0 root netem delay 100ms 50ms
- الأضرار التي لحقت 5 ٪ من حزم الشبكة
#Start ❯ tc qdisc add dev eth0 root netem corrupt 5% #Stop ❯ tc qdisc del dev eth0 root netem corrupt 5%
- فقدان الحزمة بنسبة 7٪ مع ارتباط بنسبة 25٪
#Start ❯ tc qdisc add dev eth0 root netem loss 7% 25% #Stop ❯ tc qdisc del dev eth0 root netem loss 7% 25%
! المهم 7٪ كافي لكي لا يسقط تطبيق TCP.
اللعب باستخدام "/ etc / hosts" - جدول بحث ثابت لأسماء المضيفين
/etc/hosts
هو ملف نصي بسيط يربط عناوين IP بأسماء المضيفين ، سطر واحد في المرة الواحدة. تتطلب كل عقدة سطرًا واحدًا يحتوي على المعلومات التالية:
IP_address canonical_hostname [aliases...]

يعد ملف hosts أحد الأنظمة العديدة التي تصل إلى عقد الشبكة على شبكة الكمبيوتر وترجمة أسماء المضيفين التي يفهمها الناس إلى عناوين IP. ونعم ، لقد خمنت الأمر: من المريح خداع أجهزة الكمبيوتر بفضلها. فيما يلي بعض الأمثلة:
- منع الوصول إلى DynamoDB API لمثيل EC2
#Start # make copy of /etc/hosts to /etc/host.back ❯ cp /etc/hosts /etc/hosts.back ❯ echo "127.0.0.1 dynamodb.us-east-1.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 dynamodb.us-east-2.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 dynamodb.us-west-1.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 dynamodb.us-west-2.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 dynamodb.eu-west-1.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 dynamodb.eu-north-1.amazonaws.com" >> /etc/hosts #Stop # copy back the old version /etc/hosts ❯ cp /etc/hosts.back /etc/hosts
- منع الوصول إلى EC2 API من مثيل EC2
#Start # make copy of /etc/hosts to /etc/host.back ❯ cp /etc/hosts /etc/hosts.back ❯ echo "127.0.0.1 ec2.us-east-1.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 ec2.us-east-2.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 ec2.us-west-1.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 ec2.us-west-2.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 ec2.eu-west-1.amazonaws.com" >> /etc/hosts ❯ echo "127.0.0.1 ec2.eu-north-1.amazonaws.com" >> /etc/hosts #Stop # copy back the old version /etc/hosts ❯ cp /etc/hosts.back /etc/hosts
شاهد البث المباشر: أولاً ، واجهة برمجة تطبيقات EC2 متوفرة ec2 describe-instances
بنجاح.

بمجرد أن أضفت 127.0.01 ec2.eu-west-1.amazonaws.com
إلى /etc/hosts
، 127.0.01 ec2.eu-west-1.amazonaws.com
مكالمة API EC2.

بالطبع ، هذا يعمل لجميع واجهات برمجة التطبيقات AWS.
أود أن أقول لك مزحة حول DNS ...

... ولكن ، أخشى ، لن يصل إليك إلا في اليوم الثاني. يعني بعد 24 ساعة.
في 21 أكتوبر 2016 ، بسبب هجوم DDoS Dyn ، لم يكن هناك عدد كبير من المنصات والخدمات في أوروبا وأمريكا الشمالية. وفقًا لتقرير ThousandEyes حول أداء DNS في جميع أنحاء العالم في عام 2018 ، فإن 60٪ من الشركات وموفري SaaS ما زالوا يعتمدون على مزود DNS مصدر واحد ، وبالتالي يصبحون عرضة لفشل DNS. وبما أنه لن يكون هناك إنترنت بدون DNS ، سيكون من الرائع محاكاة فشل DNS في تقييم مرونتك لفشل DNS التالي.
Blackholing هي الطريقة التي تقليديا تقليص الأضرار الناجمة عن هجوم DDoS . يتم توجيه حركة مرور الشبكة غير الصحيحة إلى الثقب الأسود وإلقائها في الفراغ. إصدار /dev/null
للعمل على الشبكة :-) يمكنك استخدامه لمحاكاة فقدان حركة مرور الشبكة أو البروتوكول ، كما يقول DNS نفسه.
لهذه المهمة ، تحتاج إلى أداة iptables
، والتي تُستخدم لتكوين حزمة IP وصيانتها والتحقق منها في نواة Linux.
للحصول على حركة مرور DNS عبر blackhole ، جرّب هذا:
#Start ❯ iptables -A INPUT -p tcp -m tcp --dport 53 -j DROP ❯ iptables -A INPUT -p udp -m udp --dport 53 -j DROP #Stop ❯ iptables -D INPUT -p tcp -m tcp --dport 53 -j DROP ❯ iptables -D INPUT -p udp -m udp --dport 53 -j DROP
مقدمة من الفشل باستخدام Toxiproxy.
أدوات Linux مثل tc
و iptables
مشكلة واحدة - ولكن ليست المشكلة الوحيدة. أنها تتطلب إذن الجذر لتشغيل ، وهذا يخلق مشاكل لبعض المنظمات والبيئات. يرجى الحب وصالح - Toxiproxy !
Toxiproxy هو وكيل TCP مفتوح المصدر تم تطويره بواسطة فريق Shopify من المهندسين . يساعد في محاكاة ظروف الشبكة والنظام الفوضوي أو الأنظمة الحقيقية. ضعه بين المكونات المختلفة للهندسة المعمارية كما هو موضح أدناه.

تم إنشاؤه خصيصًا للاختبار ، وبيئات CI ، وبيئات التطوير ، ويقدم تشويشًا محددًا مسبقًا أو عشوائيًا يتم التحكم فيه من خلال الإعدادات. يستخدم Toxiproxy مواد سامة لمعالجة العلاقة بين العميل ورمز المطور ، ويمكن تهيئته من خلال واجهة برمجة تطبيقات HTTP . وله في المجموعة هناك ما يكفي من المواد السامة للبدء.
يوضح المثال التالي كيف يعمل Toxiproxy مع رمز عميل المواد السمية عن طريق إدخال تأخير قدره 1000 مللي ثانية في الاتصال بين عميل Redis الخاص بي و redis-cli و Redis نفسه.

تم استخدام Toxiproxy بنجاح بواسطة Shopify في جميع بيئات الإنتاج والتطوير منذ أكتوبر 2014. مزيد من المعلومات على بلوق .
3 - مقدمة من الفشل في التطبيق ، العملية ومستوى الخدمة
البرنامج يسقط. هذه حقيقة. وماذا تفعل؟ هل يجب علي تسجيل الدخول عبر SSH على الخادم وإعادة تشغيل العملية الفاشلة؟ توفر أنظمة التحكم في العمليات وظائف التحكم في الحالة أو تغيير الحالة لنوع البدء أو الإيقاف أو إعادة التشغيل. عادة ما تستخدم أنظمة التحكم لضمان تحكم عملية مستقر. systemd
هو مجرد مثل هذه الأداة ، حيث يوفر لبنات التحكم في العمليات الأساسية لنظام Linux. يوفر Supervisord
التحكم في العديد من العمليات على أنظمة التشغيل مثل UNIX.
عند نشر التطبيق ، يجب عليك استخدام هذه الأدوات. إنها بالتأكيد ممارسة جيدة لاختبار الأضرار الناجمة عن قتل العمليات الحرجة. تأكد من تلقي التنبيهات ومن إعادة تشغيل العملية تلقائيًا.
- قتل عمليات جافا
❯ pkill -KILL -f java #Alternative ❯ pkill -f 'java -jar'
- قتل عمليات بايثون
❯ pkill -KILL -f python
بالطبع ، يمكنك استخدام الأمر pkill
لقتل عدد قليل من العمليات الأخرى التي تعمل على النظام.
تقديم فشل قاعدة البيانات
إذا كانت هناك رسائل فشل لا يرغب المشغلون في تلقيها ، فهذه هي الرسائل المتعلقة بفشل قاعدة البيانات. البيانات تستحق ثقلها في الذهب ، وبالتالي ، كلما تعطلت قاعدة البيانات ، يزداد خطر فقدان بيانات العميل.

سيكون مجرد صيانة سهلة. و- و- و- و- وهكذا ... سقط كل شيء
في بعض الأحيان ، تحدد القدرة على استعادة البيانات وجعل قاعدة البيانات في حالة صالحة للعمل في أسرع وقت ممكن مستقبل الشركة. لسوء الحظ ، ليس من السهل دائمًا التحضير لأنماط مختلفة من فشل قاعدة البيانات - وسيظهر الكثير منها في بيئة الإنتاج فقط.
ومع ذلك ، إذا كنت تستخدم Amazon Aurora ، فيمكنك اختبار مرونة مجموعة قاعدة بيانات Amazon Aurora في حالات الفشل في استخدام طلبات تجاوز الفشل .
الأمازون أورورا تحطم مقدمة
يتم إصدار طلبات الفشل كأوامر SQL لمثيل Amazon Aurora وتسمح لك بجدولة محاكاة لأحد الأحداث التالية:
- فشل في الكتابة DB مثيل.
- فشل أورورا المقلدة.
- فشل القرص.
- القرص الزائد.
عند إرسال طلب للفشل ، يجب عليك أيضًا تحديد مقدار الوقت الذي سيتم خلاله محاكاة حدث الفشل.
- تسبب فشل مثيل Amazon Aurora:
ALTER SYSTEM CRASH [ INSTANCE | DISPATCHER | NODE ];
- محاكاة فشل نسخة أورورا:
ALTER SYSTEM SIMULATE percentage PERCENT READ REPLICA FAILURE [ TO ALL | TO "replica name" ] FOR INTERVAL quantity { YEAR | QUARTER | MONTH | WEEK | DAY | HOUR | MINUTE | SECOND };
- محاكاة فشل القرص لمجموعة قاعدة بيانات Aurora:
ALTER SYSTEM SIMULATE percentage PERCENT DISK FAILURE [ IN DISK index | NODE index ] FOR INTERVAL quantity { YEAR | QUARTER | MONTH | WEEK | DAY | HOUR | MINUTE | SECOND };
- محاكاة فشل القرص لمجموعة قاعدة بيانات Aurora:
ALTER SYSTEM SIMULATE percentage PERCENT DISK CONGESTION BETWEEN minimum AND maximum MILLISECONDS [ IN DISK index | NODE index ] FOR INTERVAL quantity { YEAR | QUARTER | MONTH | WEEK | DAY | HOUR | MINUTE | SECOND };
تحطم في عالم التطبيقات الخوادم
يمكن أن يكون الفشل تحديًا حقيقيًا إذا كنت تستخدم مكونات بدون خادم ، لأن الخدمات بدون خادم مثل AWS Lambda لا تدعم الفشل بشكل أصلي.
تقديم فشل لامدا
لفهم هذه المشكلة ، كتبت مكتبة بيثون صغيرة وطبقة لامدا - لإدخال الإخفاقات في AWS Lambda . حاليًا ، يدعم كل من التأخير والأخطاء والاستثناءات وإدخال رمز خطأ HTTP. يتحقق الفشل من خلال تكوين AWS SSM Parameter Store على النحو التالي:
{ "isEnabled": true, "delay": 400, "error_code": 404, "exception_msg": "I really failed seriously", "rate": 1 }
يمكنك إضافة مصمم بيثون لوظيفة المعالج لإخفاق.
- رمي استثناء:
@inject_exception def handler_with_exception(event, context): return { 'statusCode': 200, 'body': 'Hello from Lambda!' } >>> handler_with_exception('foo', 'bar') Injecting exception_type <class "Exception"> with message I really failed seriously a rate of 1 corrupting now Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/.../chaos_lambda.py", line 316, in wrapper raise _exception_type(_exception_msg) Exception: I really failed seriously
- أدخل رمز الخطأ "HTTP غير صالح":
@inject_statuscode def handler_with_statuscode(event, context): return { 'statusCode': 200, 'body': 'Hello from Lambda!' } >>> handler_with_statuscode('foo', 'bar') Injecting Error 404 at a rate of 1 corrupting now {'statusCode': 404, 'body': 'Hello from Lambda!'}
- أدخل تأخير:
@inject_delay def handler_with_delay(event, context): return { 'statusCode': 200, 'body': 'Hello from Lambda!' } >>> handler_with_delay('foo', 'bar') Injecting 400 of delay with a rate of 1 Added 402.20ms to handler_with_delay {'statusCode': 200, 'body': 'Hello from Lambda!'}
انقر هنا لمعرفة المزيد عن مكتبة بايثون.
تقديم فشل لامدا من خلال قيود التزامن
يقوم Lambda بشكل افتراضي ، لأسباب أمنية ، بضبط التنفيذ الموازي لجميع الوظائف في منطقة محددة لكل حساب. تشير عمليات التنفيذ المتوازية إلى عدة عمليات تنفيذ لرمز دالة تحدث في أي لحظة من الزمن. يتم استخدامها لتوسيع نطاق استدعاء دالة لطلب وارد. ولكن يمكن أن تخدم الغرض المعاكس: وقف تنفيذ لامدا.
❯ aws lambda put-function-concurrency --function-name <value> --reserved-concurrent-executions 0
سيقلل هذا الأمر التزامن إلى الصفر ، مما يؤدي إلى فشل الاستعلام مع وجود خطأ مثل "الكبح" - DTC 429
.
Thundra - تتبع انتقال serverless
Thundra هي أداة مراقبة للتطبيقات بدون خادم ولديها قدرة مدمجة لحقن الفشل في التطبيقات الخالية من الخوادم . إنه يصنع معالجات مجمّعات لإدخال إخفاقات مثل "لا يوجد معالج خطأ" للعمليات مع DynamoDB ، أو "عدم تحييد الأخطاء" لمصدر البيانات ، أو "لا مهلة في طلبات HTTP الصادرة". لم أحاول ذلك بنفسي ، لكن في هذا المنشور من أجل تأليف يان تشوي وفي هذا الفيديو الرائع لمارشا فيلالبا ، تم وصف العملية جيدًا. يبدو واعدا.
وفي ختام القسم الخاص بالتطبيقات بدون خادم ، سأقول إن Yan Chui لديه مقالة ممتازة حول صعوبات هندسة الفوضى فيما يتعلق بالتطبيقات بدون خادم. أوصي الجميع بقراءته.
4 - مقدمة من الفشل على مستوى البنية التحتية
بدأ كل شيء بإدخال الإخفاقات على مستوى البنية الأساسية - لكل من Amazon و Netflix. من المحتمل أن يكون تطبيق الإخفاقات على مستوى البنية الأساسية - من فصل مركز بيانات بأكمله إلى حالات التوقف العشوائي - هو الأسهل في التنفيذ.
وبالطبع ، فإن مثال " قرد الفوضى " يتبادر إلى الذهن أولاً.
إيقاف مثيلات EC2 التي تم اختيارها عشوائيًا في منطقة توفر معينة.
في بدايتها ، أراد Netflix تقديم قواعد معمارية صارمة. قام بنشر "قرد الفوضى" كأحد تطبيقات AWS الأولى لتثبيت خدمات micros عديمي الجنسية autoscale - بمعنى أنه يمكن تدمير أي مثيل أو استبداله تلقائيًا دون التسبب في أي فقدان للحالة على الإطلاق. حرص قرد الفوضى على عدم انتهاك أي شخص لهذه القاعدة.
السيناريو التالي - يشبه "قرد الفوضى" - هو إيقاف أي مثيل بشكل عشوائي ، في منطقة توفر معينة داخل نفس المنطقة.
❯ stop_random_instance(az="eu-west-1a", tag_name="chaos", tag_value="chaos-ready", region="eu-west-1")
import boto3 import random REGION = 'eu-west-1' def stop_random_instance(az, tag_name, tag_value, region=REGION): ''' >>> stop_random_instance(az="eu-west-1a", tag_name='chaos', tag_value="chaos-ready", region='eu-west-1') ['i-0ddce3c81bc836560'] ''' ec2 = boto3.client("ec2", region_name=region) paginator = ec2.get_paginator('describe_instances') pages = paginator.paginate( Filters=[ { "Name": "availability-zone", "Values": [ az ] }, { "Name": "tag:" + tag_name, "Values": [ tag_value ] } ] ) instance_list = [] for page in pages: for reservation in page['Reservations']: for instance in reservation['Instances']: instance_list.append(instance['InstanceId']) print("Going to stop any of these instances", instance_list) selected_instance = random.choice(instance_list) print("Randomly selected", selected_instance) response = ec2.stop_instances(InstanceIds=[selected_instance]) return response
هل tag_name
tag_value
tag_name
و tag_value
؟ مثل هذه الأشياء الصغيرة ستمنع فشل الحالات الخاطئة. #lessonlearned

ونعم ... إعادة تشغيل قاعدة البيانات - أحسنت [عفواً ، وليس هذا المثال]
5 - الفشل في تقديم وأدوات تزامن الكل في واحد
من المحتمل أن تضيع في العديد من الأدوات. لحسن الحظ ، هناك بعض مقدمات الرفض وأدوات التنسيق التي تتضمن معظمها وسهلة الاستخدام.
إحدى أدواتي المفضلة هي Chaos Toolkit ، وهي عبارة عن منصة هندسة مفتوحة المصدر مدعومة تجارياً من قبل فريق ChaosIQ الرائع. فيما يلي عدد قليل منهم: روس مايلز ، سيلفان هيليجوارش ومارك برين .
تُعرّف مجموعة أدوات Chaos Tool واجهة تعبيرية وقابلة للتوسعة لإجراء تجربة هندسة الفوضى بشكل ملائم. ويشمل ذلك برامج تشغيل AWS و Google Cloud Engine و Microsoft Azure و Cloud Foundry و Humino و Prometheus و Gremlin.
الإضافات هي مجموعة من الاختبارات والإجراءات المستخدمة للتجارب على النحو التالي: نوقف مثيلًا تم اختياره عشوائيًا في منطقة توفر محددة إذا كان tag-key
يحتوي chaos-ready
قيمة chaos-ready
.
{ "version": "1.0.0", "title": "What is the impact of randomly terminating an instance in an AZ", "description": "terminating EC2 instance at random should not impact my app from running", "tags": ["ec2"], "configuration": { "aws_region": "eu-west-1" }, "steady-state-hypothesis": { "title": "more than 0 instance in region", "probes": [ { "provider": { "module": "chaosaws.ec2.probes", "type": "python", "func": "count_instances", "arguments": { "filters": [ { "Name": "availability-zone", "Values": ["eu-west-1c"] } ] } }, "type": "probe", "name": "count-instances", "tolerance": [0, 1] } ] }, "method": [ { "type": "action", "name": "stop-random-instance", "provider": { "type": "python", "module": "chaosaws.ec2.actions", "func": "stop_instance", "arguments": { "az": "eu-west-1c" }, "filters": [ { "Name": "tag-key", "Values": ["chaos-ready"] } ] }, "pauses": { "after": 60 } } ], "rollbacks": [ { "type": "action", "name": "start-all-instances", "provider": { "type": "python", "module": "chaosaws.ec2.actions", "func": "start_instances", "arguments": { "az": "eu-west-1c" }, "filters": [ { "Name": "tag-key", "Values": ["chaos-ready"] } ] } } ] }
إجراء التجربة أعلاه بسيط:
❯ chaos run experiment_aws_random_instance.json

تكمن قوة مجموعة أدوات Chaos Toolkit ، أولاً ، في أنها مفتوحة المصدر ويمكن تكييفها حسب احتياجاتك. ثانياً ، إنه مناسب تمامًا لخط أنابيب CI / CD ويدعم اختبار الفوضى المستمر.
الجانب السلبي لمجموعة أدوات الفوضى هو أن الأمر يتطلب بعض الوقت لإتقانها. علاوة على ذلك ، لا توجد تجارب جاهزة فيها ، لذلك عليك أن تكتبها بنفسك. ومع ذلك ، أنا على دراية بالفريق في ChaosIQ ، الذي يعمل بلا كلل ، وفهم هذه المهمة.
شبح
مفضل آخر لي هو الكرملين. أنه يحتوي على مجموعة شاملة من وسائط لإدخال الفشل في أداة بسيطة مع واجهة مستخدم بديهية. مثل هذه الفوضى كخدمة.
يدعم Gremlin تقديم الإخفاقات على مستوى الموارد والشبكة والاستعلام ، مما يتيح لك تجربة النظام بأكمله بسرعة ، بما في ذلك مع الأجهزة ، ومقدمي الخدمات السحابية المختلفة ، والبيئات المعبأة في حاويات ، بما في ذلك Kubernetes ، والتطبيقات ، وإلى حد ما ، التطبيقات بدون خادم.
بالإضافة إلى المكافأة - الرجال من Gremlin هم زملاء رائعون يكتبون محتوى رائعًا للمدونة ومستعدون دائمًا للمساعدة! إليكم البعض منهم: ماثيو ، كولتون ، تامي ، ريتش ، آنا و HML .
لا يوجد مكان لاستخدام Gremlin:
أدخل أولاً تطبيق Gremlin وحدد "إنشاء هجوم".

تعيين هدف - المثال.

حدد نوع الفشل الذي تريد تقديمه ، وقد تبدأ الفوضى!

يجب أن أعترف أنني أحببت دومًا Gremlin: مع ذلك ، فإن التجارب على هندسة الفوضى بسيطة بشكل حدسي.
— , . . , Gremlin- daemon , , .
Run Command AWS System Manager
Run command EC2 , 2015 , . — 2, . , , Systems Manager.
Run Command DevOps ad-hoc , .
, Run Command , Windows, -.
AWS System Manager . — !
!
, .
1 — - — , - . . — , — , , . , ! :
" . ".
— , - Amazon Prime Video
2 — , , . , -.
3 — , , .
4 — , , , . , - — , .
, , , . , . , , :-)
—