Налаштування Chaos Engineering через Chaos Monkey (Netflix)

Сервіс падає в найневідповідніший момент, бо відмову ніхто не перевіряв заздалегідь. Ми налаштовуємо chaos engineering під ключ: керовані експерименти знаходять слабкі місця до реальної аварії та помітно скорочують час простою. Обговоримо задачу й повернемося з оцінкою та планом.
Часті запитання

Чому без chaos engineering відмови ламають сервіс раптово

Типовий сценарій: у кластері відмовляє один вузол — диск, мережевий інтерфейс або процес. Контур відмовостійкості мав би перерозподілити навантаження за секунди, але натомість через кілька хвилин лягає сусідній сервіс.

Механіка каскадного збою передбачувана: клієнти повторюють невдалі запити, кількість звернень до вцілілих вузлів зростає в рази, черга завдань переповнюється, а таймаути починають спрацьовувати швидше, ніж сервіс встигає відповісти.

Деградація сервісу розповзається залежностями — сховище, кеш, черга повідомлень, — і зовнішній контур бачить уже не відмову вузла, а відмову всього ланцюжка.

Найгірше, що точка відмови зазвичай не там, де налаштовані перевірки. Моніторинг збирає метрики по кожному компоненту окремо й показує зелений: вузли живі, ресурси в нормі.

Зв'язки між сервісами, поведінка за часткової недоступності та порядок відновлення залишаються неперевіреними, бо у звичайному режимі вони не проявляються.

Підсумок — команда дізнається про інцидент від користувачів, а не від системи. План відновлення пишеться на ходу, черговий з'ясовує залежності за журналами подій, і кожна хвилина такого налагодження оплачується простоями та втраченими заявками.

Chaos engineering змінює порядок: ін'єкція відмов запускається за розкладом у контрольованому вікні, а не приходить як аварія.

Розбираємо, як це закривається: які відмови перевіряти в першу чергу, як обмежити радіус експерименту і що має з'явитися в плані відновлення після кожного прогону.

Що дає керована перевірка відмов у проді та на стенді

Регулярні експерименти над відмовами переводять стійкість сервісу з царини віри у вимірювану величину. Це не разова перевірка перед запуском, а режим: відмова вводиться контрольовано, з обмеженням радіуса, вікном спостереження та автоматичним поверненням конфігурації.

Підхід виріс із практики Netflix, де втрату вузла спочатку перевіряли вручну, а згодом зробили штатною процедурою.

Перевірка приносить користь, лише якщо її результат видно в цифрах. Ось що ми фіксуємо до та після кожного циклу і за чим видно, що експерименти справді працюють:

  • Час відновлення. Сервіс повертається до штатних показників за хвилини: межа відома заздалегідь, бо перевірена на живому контурі, а не на папері.
  • Виявлення дефектів заздалегідь. Помилки в обробці таймаутів, повторних спроб і недоступних залежностей вилазять на стенді, а не в нічному інциденті.
  • Готовність до збою. Черговий знає, що ламається першим, і діє за відпрацьованим порядком замість пошуку причини з нуля.
  • Зниклий клас інцидентів. Деградація зовнішньої залежності, розсинхрон кешу та втрата сесії перестають повторюватися від релізу до релізу.
  • Обмежений радіус. Керування відмовою обмежене за зоною та часом — експеримент не виходить за межі виділеного контуру.

Кожен цикл залишає по собі не звіт, а зміну: нову межу, автотест на відмову або правку схеми повторних спроб. Тому зростає не кількість проведених експериментів, а частка відмов, які система переживає без ручного втручання.

Режими експериментів і порівняння підходів

Режими різняться не силою впливу, а тим, який клас відмов ми перевіряємо і скільки ризику готові прийняти в робочому контурі. Планові навчання дають керований сценарій і розбір причин після, автоматичний вплив перевіряє стійкість постійно, але за вузькою областю.

В автоматичному режимі розклад задається заздалегідь: Chaos Monkey вибирає частку цілей у вікні, тому масштаб ефекту передбачуваний.

Варіант Коли підходить Обмеження
Планові навчання Перевіряємо гіпотези на критичних шляхах, потрібен розбір причин і правки за підсумками Потребують вікна й ручного контролю, не покривають рідкісні поєднання відмов
Фоновий вплив Потрібна постійна перевірка, що сервіси переживають відмову без втручання команди Силу й область доводиться жорстко обмежувати, інакше шум у метриках і хибні оповіщення
Ізоляція вузла Підтверджуємо відмовостійкість кластера: перемикання, таймаути, повтори запитів Видно лише горизонтальну стійкість, відмови зовнішніх залежностей не проявляються
Перевірка в тестовому контурі Обкатуємо нові та агресивні сценарії до робочого контуру Копія відрізняється за навантаженням і даними, частина відмов на ній не відтворюється

Як зібрати режими разом

Режими не конкурують: на копії контуру обкатуємо гіпотези, ізоляцією вузла підтверджуємо відмовостійкість, а в робочому контурі тримаємо фоновий вплив з обмеженням за силою.

Перехід від ручних навчань до автоматизації йде в міру накопичення даних — спочатку вузька область і коротке вікно, потім розширення.

Як ми впроваджуємо chaos engineering в інфраструктуру

Впровадження починається не із запуску збою, а з опису системи: поки немає карти залежностей, будь-який експеримент перетворюється на незаплановану аварію.

Ми проходимо шлях від інвентаризації до регламенту експлуатації, фіксуючи на кожному кроці, що саме перевіряємо і за якого сигналу зупиняємося.

Послідовність робіт

  1. Інвентаризація та карта залежностей. Збираємо сервіси, черги, сховища, зовнішні точки інтеграції та зв'язки між ними — включно з неявними викликами й спільними сховищами. Отримуємо схему, на якій видно, яка відмова куди поширюється.
  2. Визначення меж відмови. Позначаємо, які вузли допустимо зупиняти в робочому режимі, які лише в погоджене вікно, а що не чіпаємо взагалі. Для кожного вузла фіксуємо очікувану поведінку системи та допустиму деградацію.
  3. Проєктування сценарію експерименту. Формулюємо гіпотезу: що ламаємо, з якою часткою навантаження, що має статися. Заздалегідь задаємо метрику успіху та цільову зону — один екземпляр, окремий контур або частка трафіку.
  4. Підготовка зупинки експерименту. Налаштовуємо запобіжники: ліміт за часом, відкат за пороговою метрикою, автоматичне зняття збою. Експеримент має припинятися сам, без ручного втручання чергового.
  5. Проведення в контрольованому вікні. Запускаємо з мінімальної інтенсивності й розширюємо її поступово, спостерігаючи за оповіщеннями та станом залежностей. Чергова зміна знає сценарій і точку зупинки.
  6. Розбір результатів. Відновлюємо хронологію: де спрацювала відмовостійкість, де оповіщення прийшло пізніше за реакцію користувачів, які обхідні шляхи виявилися фіктивними. За кожним розходженням — конкретна зміна в конфігурації або коді.
  7. Передача регламенту експлуатації. Віддаємо список сценаріїв, правила їх запуску, ролі, порядок зупинки та інструкції для чергових. Далі команда проводить експерименти сама, без нашої участі.

Такий порядок дає передбачуваний результат: знайдені слабкі місця закриваються до реального збою, а експерименти залишаються керованою процедурою, а не разовою перевіркою на удачу.

Що залишається у вашої команди після впровадження

Передаємо не «доступ до інструмента», а робочий комплект: за ним черговий, який жодного разу не запускав хаос-експеримент, проводить навчання в ізольованому контурі, бачить відхилення й розуміє, у який момент зупиняти вплив.

  • Конфігурації експериментів — шаблони з областю впливу, часткою навантаження, вікном проведення та автоматичною умовою зупинки в разі виходу за поріг.
  • Схема відмовостійкості — карта сервісів із точками відмови, резервними зонами та межами, далі яких експеримент не випускаємо.
  • Політики доступу — ролі й підтвердження: хто має право запускати навчання в бойовому контурі, а хто працює лише на стенді.
  • Регламент навчань — періодичність, вікно, порядок повідомлення суміжних команд і правила зупинки за відхилень.
  • Матриця відповідальності — власник сервісу, черговий, той, хто ухвалює рішення про відкат, і канал ескалації на ніч.
  • Бібліотека сценаріїв і звітів — накопичені експерименти, знайдені вузькі місця та записи про те, чим їх закрили.
  • Перевірки перед викатом — запуск сценаріїв на стенді як крок конвеєра, а не ручне «давайте спробуємо в п'ятницю ввечері».

Через два-три цикли навчання йдуть за розкладом і без нас: команда сама додає сценарії, розбирає інциденти й розширює схему відмовостійкості. Ми залишаємося на зв'язку для розбору складних випадків, але вузьке місце більше не в знанні інструмента.

Кейс: як керовані відмови скоротили простій сервісу

До: про збій дізнавалися із звернень

Сервіс тримав планове навантаження, але падіння одного вузла вело частину запитів у помилки: балансувальник не встигав зняти екземпляр, користувачі отримували відмову, черговий дізнавався про проблему зі скарг.

Простій сервісу вважався десятками хвилин, підйом ішов вручну, і кожен повторний збій повторював той самий сценарій — архітектурні правки відкладали до планового вікна.

Що перевіряли і що змінили

Керовані відмови (Chaos Engineering) запустили в передпродуктовому середовищі через Chaos Monkey (Netflix): він гасить екземпляри сервісу за розкладом, без попередження команди.

Додатково перевіряли недоступність залежностей і затримки мережі — стійкість перестала бути разовою акцією і ввійшла у звичайний цикл розробки.

Метрики до та після знімали на одному наборі сценаріїв: частка успішних запитів, середній час відновлення, кількість повторних збоїв за вікно спостереження.

До впровадження доступність просідала за кожної відмови вузла, а відновлення займало десятки хвилин; тепер відмова екземпляра не видна користувачеві, повтори збоїв поодинокі.

В архітектурі винесли стан з локального диска в спільне сховище, обмежили й зробили ідемпотентними повтори запитів, додали перевірку готовності вузла до включення в балансування та пороги автомасштабування.

Оповіщення прив'язали до користувацьких метрик, а не до завантаження заліза, — черговий бачить відмову раніше за клієнта.

Чим керований експеримент відрізняється від аварійного навчання

Chaos engineering — це керований експеримент із заздалегідь сформульованою гіпотезою відмови, а не імітація повного падіння системи.

Практика, яку Netflix оформив як інженерний підхід, тримається на трьох обмеженнях: перевірене твердження, вузька область впливу й автоматичний стоп у разі виходу метрик за поріг.

Гіпотеза формулюється до запуску і має бути спростовною: «за відмови одного екземпляра сервісу час відповіді залишається в цільовому значенні, а клієнт не бачить помилок».

Твердження, яке не можна перевірити метрикою, — це вже не експеримент, а спостереження «що вийде»: ризик створено, висновку немає.

Обмежена область — друга ознака. Вплив задається часткою трафіку, числом екземплярів, однією зоною доступності та коротким вікном часу. Стоп-кран спрацьовує без участі людини: щойно затримка або частка помилок виходить за поріг, експеримент згортається.

Аварійне навчання вирішує інше завдання — воно тренує не систему, а людей. Імітується велика відмова, і перевіряється реакція чергової зміни: як швидко прийшов сигнал, яким ланцюжком пішла ескалація, чи вистачило черговому повноважень, чи збіглися інструкції з реальністю.

Зріла практика розводить ці режими: експеримент запускається часто і шукає слабке місце в архітектурі, навчання йде за планом і оцінює готовність команди. Змішування небезпечне — на навчанні гіпотезу ніхто не перевіряє, а в експерименті паніка чергових з'їдає весь його сенс.

Технічні сумніви перед запуском експериментів

Сумніви перед першим експериментом зазвичай одні й ті самі: чи не завалить він прод, чи вистачить метрик, щоб відрізнити очікувану відмову від аварії, і хто відповідає за наслідки. Розбираємо за пунктами — ці питання ми закриваємо до старту, а не після.

Чи може експеримент завалити прод?

Прод захищений межами впливу: стартуємо на тестовому контурі, потім беремо одну репліку сервісу за балансувальником і лише після стійкого результату — частку реального трафіку.

У кожного сценарію є стоп-умова: щойно метрики виходять за межу норми, вплив знімається автоматично, без очікування рішення чергового.

А якщо метрик не вистачає, щоб зрозуміти результат?

Тоді експеримент не починаємо. Спершу закриваємо спостережуваність: наскрізне трасування запиту залежностями, метрики насичення черг і пулів з'єднань, логи з єдиним ідентифікатором запиту.

Без цього відмова невідрізненна від звичайного сплеску навантаження — висновків не буде, буде тільки переляк.

Чи постраждають дані і хто відповідає за наслідки?

Перевіряємо поведінку під час відмов читання, затримок і недоступності залежностей — але не ініціюємо руйнування сховищ і не видаляємо томи; відновлення з копій відпрацьовуємо на окремому контурі, розгорнутому зі знімка, куди продові дані не потрапляють.

Відповідальність фіксуємо в регламенті до старту: інженер запускає погоджений сценарій, черговий тримає право зупинки, критерії прописані заздалегідь. Зупинка стає частиною процедури, а не особистим рішенням у момент аварії.

Обговоримо задачу і повернемося з оцінкою та планом

Розбір починаємо з ввідних, за якими видно реальну картину: схеми сервісів і зв'язків між ними, списку критичних ділянок, налаштувань балансування й повторних спроб, вікна, у яке допустимі перевірки.

Цього достатньо, щоб показати, де контур уже тримає відмову, а де падає від втрати одного вузла, і перетворити перевірки відмовостійкості (chaos engineering) на план робіт із зрозумілим порядком.

  • Що надіслати: схему сервісів і залежностей, поточні обмеження за навантаженням і часом очікування, історію останніх збоїв з описом, як їх усували.
  • Розбір задачі: відновлюємо карту відмов, позначаємо єдині точки відмови та місця, де немає межі повторним спробам запитів.
  • Склад команди: інженер з інфраструктури, спеціаліст зі спостережуваності й той, хто відповідатиме за контур після передачі.
  • План робіт: черговість перевірок від найменш ризикованих до найруйнівніших, з вікнами та умовами зупинки на кожному кроці.
  • Критерії приймання: список перевірок з очікуваною поведінкою — час відновлення, частка успішних запитів, коректність перемикання.
  • Передача експлуатації: інструкції із запуску перевірок, шаблони сценаріїв, регламент погодження та спільний розбір результатів.

Опишіть задачу у вільній формі — повернемося з оцінкою та планом.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142