Linux Labs

Практики SRE: SLO, инциденты, отказоустойчивость / Ступень 7 из 8

Балансировщик и проверка здоровья

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 8 из 10 · лаба · 30 минсредняя

Каждый второй запрос висит

Сайт магазина отвечает через раз — каждый второй запрос висит, пока клиент не сдастся. Один из двух backend'ов упал, и падать они будут и дальше. Сделай балансировщик на node1 устойчивым к этому.

Ситуация

Магазин работает на двух машинах. На node2 приложение запущено в двух экземплярах — backend'ы lab-backend@8081 и lab-backend@8082 слушают порты 8081 и 8082. На node1 nginx принимает запросы покупателей на порту 80 и раздаёт их между backend'ами: сайт lb, файл /etc/nginx/sites-available/lb.

С утра покупатели жалуются: страница то открывается сразу, то висит, пока браузер не сдастся. Мобильное приложение магазина ждёт ответа не дольше 5 секунд.

node1 — твой терминал. Команды на node2 выполняй через SSH: ssh node2 'команда' или войди в оболочку — ssh node2, назад — exit. sudo на обеих машинах работает без пароля. Какой backend ответил, nginx пишет в заголовок X-Upstream и в поле upstream= журнала /var/log/nginx/lb-access.log. Запрос «как у мобильного приложения»:

curl -so /dev/null -m 5 \
  -w '%{http_code} %{time_total}s %header{x-upstream}\n' localhost/

Задача

Backend 8082 упал: до его порта не доходят даже попытки соединения — так снаружи выглядит машина, которая выключилась. Его поднимут, но backend'ы будут падать и дальше. Сделай так, чтобы покупатели этого не замечали:

  1. Пока один backend лежит, каждый запрос к сайту получает 200 не дольше чем за 5 секунд.
  2. Лежащий backend nginx исключает: из 20 запросов подряд на него уходит не больше трёх.
  3. Когда backend снова доступен, не позже чем через 20 секунд он опять получает запросы.

Падение на стенде изображает команда lab-outage на node2: ssh node2 sudo lab-outage off «поднимает» backend 8082, on — снова «роняет», status — лежит ли он и сколько попыток соединения до него не дошло. «Проверить» само «роняет» 8082 и шлёт 20 запросов подряд, потом «поднимает» его и ждёт, когда на него снова пойдут запросы. В конце 8082 возвращается в то состояние, в каком был до проверки. Проверка занимает до минуты.

Ограничения

  • nginx обслуживает покупателей: не останавливай и не перезапускай его. Правку проверь sudo nginx -t и примени перечиткой — sudo systemctl reload nginx.
  • Оба backend'а остаются в работе: ни один не убирай из балансировки и не делай запасным.
  • Приложение на node2 не меняй.

Интернета в лабе нет — только сеть между node1 и node2, всё нужное установлено. Смотри на результат так же, как проверка: серия запросов — for i in $(seq 10); do curl …; done с командой выше, а что nginx делал с каждым запросом — tail /var/log/nginx/lb-access.log и sudo tail /var/log/nginx/error.log.

Лаба · самостоятельно

Команды в этой лабе не даны: набирай их в терминале сам. Цели проверяются на машине после каждой команды.

Цели

0 из 4
  • Пока backend 8082 лежит, 20 запросов подряд к сайту на node1 получают 200, каждый — не дольше 5 с — ещё не выполнена
  • Лежащий backend исключается — из этих 20 запросов на него уходит не больше трёх — ещё не выполнена
  • Когда backend 8082 снова доступен, не позже чем через 20 с он опять получает запросы — ещё не выполнена
  • nginx не перезапускали — правки в его файлах применены перечиткой (reload) — ещё не выполнена
Ctrl+Enter
Запустит машину node1 · Ubuntu 24.04

Машина запускается

Подсказки

0 из 3

Цели лабы

0 из 4
  • Пока backend 8082 лежит, 20 запросов подряд к сайту на node1 получают 200, каждый — не дольше 5 с — ещё не выполнена
  • Лежащий backend исключается — из этих 20 запросов на него уходит не больше трёх — ещё не выполнена
  • Когда backend 8082 снова доступен, не позже чем через 20 с он опять получает запросы — ещё не выполнена
  • nginx не перезапускали — правки в его файлах применены перечиткой (reload) — ещё не выполнена
node1 Ubuntu 24.04

Цели лабы

0 из 4
  • Пока backend 8082 лежит, 20 запросов подряд к сайту на node1 получают 200, каждый — не дольше 5 с — ещё не выполнена
  • Лежащий backend исключается — из этих 20 запросов на него уходит не больше трёх — ещё не выполнена
  • Когда backend 8082 снова доступен, не позже чем через 20 с он опять получает запросы — ещё не выполнена
  • nginx не перезапускали — правки в его файлах применены перечиткой (reload) — ещё не выполнена
Загрузка…