English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

гість
1 / ?
назад до уроків

Ласкаво просимо

Ласкаво просимо

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

- /health — чи здатний я зараз обробляти реальні запити?

- /version — який код я виконую?

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

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

Наприкінці ви зможете:

- Проєктувати кінцевий пункт /health, який виявляє реальний збій шляху, а не лише життєздатність процесу

- Проєктувати кінцевий пункт /version, який дозволяє вам перевірити, чи виконано розгортання

- Застосовувати чотири «золоті сигнали» (затримка, трафік, помилки, насиченість) на рівні проксі

- Пов'язувати спостережувані метрики піків із рішеннями щодо потужності: коли масштабувати вгору, коли зменшувати навантаження, коли надсилати сповіщення

- Розглядати SLO та швидкість спалювання бюджету помилок як операційну дисципліну, що стоїть за питанням «наскільки це для нас важливо?»

Два види перевірки стану здоров'я

Живість (Liveness) проти Готовності (Readiness)

Живість (Liveness): чи взагалі процес працює? Використовується оркестраторами (Kubernetes, systemd), щоб визначити, чи слід перезапустити процес.

Готовність (Readiness): чи готовий процес обробляти реальний трафік прямо зараз? Використовується балансерами наванження, щоб визначити, чи надсилати запити.

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

Поверхневі проти Глибокі перевірки стану здоров'я

Поверхневі: повертають {"status": "ok"}, якщо HTTP-обробник працює. Дуже просто. Виявляють лише зупинку процесу.

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

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

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

Ендпоінти версії

/version повертає коміт git, час збірки та назву сервісу. Після розгортання ви виконуєте curl https://service.example.com/version та переконуєтесь, що повернутий коміт збігається з тим, який ви надіслали. Якщо він не збігається, розгортання мовчки зазнало невдачі.

Без /version застаріле розгортання може виглядати успішним і ховатися протягом годин.

Мінімальна структура відповіді: {"service": "my-api", "git_commit": "abc1234", "build_time": "2026-05-19T10:00:00Z"}.

Завантажувальний балансувальник команди налаштовано так, щоб виводити реплікатор з обертання після 3 послідовних невдалих перевірок стану. Зараз їхній `/health` миттєво повертає `{"status": "ok"}`. Команда здивована тим, що під час інциденту всі реплікатори все ще показували стан «здоровий», хоча жоден реплікатор не міг встановити з'єднання з базою даних. Розробіть кращу перевірку готовності до роботи, яка б виявила збій бази даних, та поясніть один конкретний ризик, який вводить ваш новий дизайн.

Затримка, Трафік, Помилки, Насиченість

Чотири показники покривають більшість операційних завдань

З книги Google SRE. Чотири сигнали, які ви вимірюєте на кожному рівні сервісу. Якщо ви правильно інструментуєте ці чотири показники, ви виявите більшість проблем у продакшені до того, як їх помітять користувачі.

Затримка: скільки часу займає обробка запиту? Звітують розподіли, а не лише середні значення. p99 (99-й перцентиль затримки) важливіший за середнє значення, оскільки саме хвостова затримка сприймається користувачами як «повільність». Сервіса із середньою затримкою 50 мс та p99 у 5 000 мс має реальну проблему, яку більшість користувачів навіть не помічає, але найпостраждаліші 1% відчувають це на власній шкурі.

Трафік: скільки запитів на секунду? Загальна кількість запитів, за ендпоінтами, за кодами статусу, за регіонами. Базовий рівень відомий; оповіщення про аномалії (раптове падіння = проблема з інгредом; раптовий стрибок = наплив або атака).

Помилки: частота невдалих запитів. Розрізняйте 4xx (помилки клієнта, не ваша вина) та 5xx (помилки сервера, ваша вина). Відстежуйте частку помилок як відсоток від трафіку, а не як абсолютні значення, щоб оповіщення працювали на різних рівнях навантаження.

Насиченість: наскільки система навантажена? Використання CPU, пам’ять, глибина пулу з’єднань, довжина черги. Це провідний індикатор. Насиченість зростає до того, як погіршуються затримки або зростає кількість помилок. Тір із 90% насичення — це одна погана хвилина до колапсу черги.

На рівні проксі-тіру зокрема

Кожен сигнал проявляється на крайовому шарі:

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

- Трафік на проксі: загальна кількість запитів/сек, розподіл за бекендами (гарячий бекенд вказує на перекіс балансуванника навантаження), розбивка за кодами статусу.

- Помилки на проксі: 4xx від клієнтів (ваші користувачі звертаються до некоректних ендпоінтів), 5xx від бекендів (ваші сервіси збиваються), внутрішні помилки проксі (502 = бекенд недоступний, 504 = тайм-аут бекенду).

- Насиченість на проксі: кількість TLS-сесій, глибина пулу з’єднань з upstream, CPU самого проксі (термінація TLS є CPU-інтенсивною).

Порада: різке зростання 502 за умови низької латентності бекенду означає, що бекенд розриває з’єднання до надсилання відповіді (скидання з’єднання, збій, OOM). Зростання 504 означає, що бекенд повільний, але все ще відповідає. Читайте код помилки; він вказує, де саме відбувається збій.

Чотири золоті сигнали на одній дашборді: латентність, трафік, помилки, насиченість

Читання сигналів

Ваша дашборд показує наступне за останні 10 хвилин:

- Трафік: приблизно стабільний на рівні 800 зап/с (без стрибка)

- Латентність: p50 стабільний на 40 мс, p99 зріс зі 200 мс до 2 500 мс за 5 хвилин і продовжує зростати

- Помилки: частота 4xx стабільна на рівні 0,3% (нормальний фоновий рівень); частота 5xx зросла з 0,1% до 1,2% (переважно 504 Gateway Timeout)

- Насиченість: CPU бекенду зріс з 45% до 78% протягом тих самих 5 хвилин; CPU проксі стабільний на рівні 30%

Діагностуйте, що відбувається. Який найімовірніший режим збою, які одні-два додаткові виміри підтвердять або спростують вашу гіпотезу, і які дії ви вживете протягом наступних 5 хвилин, якщо тренд продовжиться?

Коли масштабувати, коли зменшувати навантаження, коли викликати людей

Рішення щодо потужності потребують тригерів

Спостереження за метриками — це просто. Розуміння того, коли діяти на їхній основі, — це дисципліна.

Масштабуйте вгору, коли: насичення перевищує стійкий поріг (наприклад, CPU бекенду >70% протягом 5 хвилин), або глибина черги зростає понад цільове значення, або p99 затримки перевищує SLO. Тригер має спрацювати до того, як система зламається, а не в момент збою.

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

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

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

SLO та спалення бюджету помилок

SLO (ціле значення рівня обслуговування) визначає прийнятну продуктивність: «рівень успішності >= 99,9% протягом 28-денного вікна». Додаток (0,1%) є бюджетом помилок.

Швидкість спалення (burn rate): наскільки швидко ви витрачаєте бюджет помилок. Якщо ви спалюєте 10% бюджету за 1 годину, швидкість у 240 разів вища за стійку (1 година становить 1/672 від 28-денного вікна; спалення 10% за цей вікно = 10% × 672 = 6720% прогнозу для всього вікна, тоді як дозволено лише 100%).

Алерти спалення за багатовіконною моделлю: сигнал надсилається, коли обидва вікна — коротке (5 хвилин зі швидкістю 14,4x) та довге (1 година зі швидкістю 6x) — спалюють бюджет швидше, ніж стійка швидкість. Це виявляє як раптові збої, так і повільне погіршення.

Чому це важливо для потужності: сервіс, що працює з SLO 99,9% і має запас 1%, може поглинати незначні спотворення. Сервіс на рівні 99,93% (лише-лише відповідає SLO) може порушити ціль у будь-який поганий день. Рішення щодо потужності мають орієнтуватися на комфортний запас SLO, а не на мінімум, що відповідає вимозі.

Рішення щодо потужності під спостереженням

Ваш сервіс має SLO 99,9% успішних запитів протягом 28 днів. Поточний стан за даними моніторингу за останню годину:

- Рівень успішності: 99,5% (тримається протягом 30 хвилин)

- CPU бекенду: в середньому 82% по всій флоті (ціль 70%)

- Затримка p99: 800 мс (ціль SLO: <500 мс)

- Трафік: 1 400 зап/с, зростання з базових 1 000 зап/с (на 40% вище норми; тенденція продовжує зростати)

- Автоскейлінг: налаштовано додавати репліки, коли CPU > 80% протягом 5 хв; поточний процес масштабування вгору додасть 3 репліки приблизно за 90 секунд

Прийміть три рішення: (1) чи це інцидент, який вимагає негайного оповіщення людини, (2) чи слід вжити якісь негайні дії, окрім очікування завершення автоскейлінгу, та (3) як би ваше рішення змінилося, якби тенденція трафіку була стабільною, а не зростала? Обґрунтуйте кожне рішення.

Розробіть план спостережності за запуском

Синтез

Тепер ви можете розробити /health, який виявляє реальні збої, /version, який дозволяє верифікувати розгортання, дашборди з чотирма «золотими» сигналами на рівні проксі та тригери пропускної здатності, пов'язані зі швидкістю спалювання SLO.

Застосуйте всі чотири.

Ваша команда запускає search.example.com (сервіс пошуку з уроку про режими збоїв). Команда хоче впровадити спостережність, яка виявляє проблеми до того, як їх помітять користувачі, з чіткою матрицею рішень «попередження чи ні». SLO: 99,9% успішних запитів, p99 затримки < 300 мс, за 28-денне вікно.

Розробіть план спостережності за запуском. Розгляньте: (1) що повертають `/health` та `/version` для кожного репліка бекенду та для кожного проксі, (2) які дашборди чотирьох «золотих сигналів» ви б вимагали на рівні проксі та на рівні бекенду, (3) за яких порогових значень автоскейлінг ініціює масштабування вгору, та (4) за яких порогових значень оператор отримує оповіщення (використовуйте спалення бюджету SLO, де це доречно).

Закриття курсу

Закриття курсу

Ви завершили всі п'ять уроків:

- Проксі та джерела: форма шару на межі, яку використовує майже кожна публічна веб-служба

- Безстанове горизонтальне масштабування: чому безстановий шар множиться дешево та як визначити його розмір

- Розділення вхідного та вихідного трафіку: чому один вузол стає двома та режим відмови, який це примушує

- Режими відмов та радіус ураження: однократні точки відмови, каскади, розбори інцидентів, безвинні дії

- Наблюдабельність та потужність (цей урок): що вимірювати, щоб проблеми з'являлися до того, як їх помітять користувачі

Головна ідея: розподілена система веб-масштабу — це не магія. Це невеликий набір патернів (зворотний проксі, безстанові репліки, розділення вхідного/вихідного трафіку, переборти та обвідні контури, чотири золоті сигнали), які продумано поєднуються. Щойно ви розпізнаєте ці патерни, ви бачите їх у кожній продуктивній архітектурі.

Супутні уроки: п'ять уроків про геометрію-* переосмислюють той самий матеріал як теорію графів та геометрію. Вони добре поєднуються в будь-якому порядку.

Молодці.