Шаг 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'ы будут падать и дальше. Сделай так, чтобы покупатели этого не замечали:
- Пока один backend лежит, каждый запрос к сайту получает
200не дольше чем за 5 секунд. - Лежащий backend nginx исключает: из 20 запросов подряд на него уходит не больше трёх.
- Когда 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) — ещё не выполнена
Машина запускается
Подсказки
0 из 3Цели лабы
0 из 4-
Пока backend 8082 лежит, 20 запросов подряд к сайту на node1 получают 200, каждый — не дольше 5 с — ещё не выполнена
-
Лежащий backend исключается — из этих 20 запросов на него уходит не больше трёх — ещё не выполнена
-
Когда backend 8082 снова доступен, не позже чем через 20 с он опять получает запросы — ещё не выполнена
-
nginx не перезапускали — правки в его файлах применены перечиткой (reload) — ещё не выполнена
Цели проверяются на машине после каждой команды.