Практики SRE: SLO, инциденты, отказоустойчивость / Итоговая лаба
Смена дежурного
Ситуация
Ты принимаешь смену дежурного. Сайт заказов shop.lab.test работает на двух машинах. Пользователи открывают его по
имени shop.lab.test — это плавающий адрес (VIP), его держит keepalived: основная машина — node1, резервная — node2.
На node1 — балансировщик nginx и Prometheus, который собирает метрики обеих машин. На node2 — два backend'а приложения
(службы lab-shop@8081 и lab-shop@8082), PostgreSQL с базой shop и отдельный том /var/log/shop для журналов
приложения.
Вечером прошлая смена вносила изменения на обе машины. Несколько минут назад пошли жалобы: заказов на сайте не видно.
Прошлый дежурный успел передать ещё две вещи: на node2 кончается место, а правило алерта, которое должно было об этом
предупредить, в Prometheus так и не появилось. Ранбук по сайту — /srv/runbooks/shop-down.md на node1.
node1 — твой терминал. Команды на node2 выполняй через SSH: ssh node2 'команда' или войди в оболочку — ssh node2,
назад — exit. sudo на обеих машинах работает без пароля. Браузера к машинам нет: сайт и Prometheus смотри из
терминала — curl, jq, promtool.
Задача
Сначала верни сайт пользователям, потом разбирайся с остальным.
- Сайт
http://shop.lab.test/по плавающему адресу отдаёт список заказов из базы — на каждый запрос. Адрес, как и задумано, держит node1, keepalived работает на обеих машинах. - К базе
shopподключается только приложение (рольshop). Это требование ввели вчера, и оно остаётся: рольreportк базеshopне пускают. - Том
/var/log/shopна node2 занят меньше чем на 80 %, а журнал приложения растёт так же, как до вечерних изменений. - Правило
LogVolumeAlmostFullиз/etc/prometheus/rules/загружено в Prometheus. - В
~/postmortem.mdна node1 — разбор сбоя, три раздела: -## Хронология— не меньше трёх событий, по строке на событие:ЧЧ:ММ:СС что произошло(время машины, UTC, как в журналах). Среди них — момент, когда сайт перестал отдавать заказы; -## Причина— что именно сломалось: каждая неисправность, которую ты нашёл; -## Действия— что сделать, чтобы это не повторилось, хотя бы один пункт.
«Проверить» само делает 20 запросов к сайту по плавающему адресу и по 20 — к каждому backend'у на node2 (смотрит, на сколько вырос журнал приложения). Проверка занимает около 10 секунд.
Ограничения
- Всё должно пережить перезагрузку обеих машин: службы включены, настройки лежат в файлах, а работающие службы перечитали эти файлы после правки.
- Плавающий адрес не переноси на node2 и keepalived не выключай: резервная машина нужна на случай настоящей аварии.
/var/log/shopостаётся отдельным томом из/etc/fstab.
Интернета в лабе нет — только сеть между node1 и node2, всё нужное установлено. Время в журналах машин — UTC.
Цели лабы
0 из 5-
Сайт http://shop.lab.test/ по плавающему адресу отдаёт заказы из базы на каждый из 20 запросов; адрес держит node1, keepalived работает на обеих машинах — ещё не проверялась
-
Приложение подключается к базе shop, а роль report получает отказ — база только у приложения; pg_hba.conf без ошибок и перечитан PostgreSQL — ещё не проверялась
-
Том /var/log/shop на node2 занят меньше чем на 80 %, журнал приложения растёт как до изменений, backend'ы работают с настройками из /etc/default/shop — ещё не проверялась
-
Правило LogVolumeAlmostFull загружено в Prometheus из файла, последняя перечитка конфигурации прошла — ещё не проверялась
-
В ~/postmortem.md на node1 — «Хронология» со временем начала сбоя по журналам, «Причина» с каждой найденной поломкой и «Действия» — ещё не проверялась