1. Обеспечить централизованный мониторинг за всеми событиями
Это первое, с чего желательно начинать настраивать инфраструктуру. Организовать централизованный мониторинг позволяют системы мониторинга, построенные на Open Source технологиях Grafana и Prometheus. С ними знакомы большинство системных и DevOps-инженеров, приложения позволяют создавать свои наработки в виде дашбордов, отсутствует вендерлок. На рынке существуют и другие решения — их выбор зависит от многих критериев, в том числе, от интересующих преимуществ программы, архитектуры инфраструктуры и пр.
Система мониторинга должна размещаться в другом сегменте сети относительно основной инфраструктуры, потому что при аварии может быть недоступен весь сегмент сети, включая мониторинг. В идеале надо настроить и внутренний, и внешний контуры мониторинга. Это позволит понимать, как функционирует система «внутри себя» и как со стороны пользователей, если они «внешние».
В мониторинге важно настроить превентивный алертинг, чтобы можно было видеть и во время контролировать состояние инфраструктуры (например, увидеть заранее, что кончается место на дисках с данными).
Для чувствительных проектов, где любое простаивание выходит очень дорого, важно организовать круглосуточную службу поддержки, сотрудники которой будут получать алерты и понимать, насколько они критичны. Сотрудники службы могут принимать соответствующие решения — эскалировать инженеров, архитекторов или нет, потому что алерт был ложным (а такое часто случается).
Пример. Мы часто встречаемся с такой ошибкой владельцев инфраструктуры, как неоплаченные домены. Когда ежегодная оплата серверного домена заканчивается, перестает работать вся инфраструктура. Мы настраиваем превентивные алерты за 2−4 недели до окончания подписки на домен. Чтобы предотвратить простои и даже аварии, таких «напоминаний» можно сделать десятки или сотни.
Желательно настроить и систему предиктивных алертов, которые срабатывают не по заданным критическим порогам, а рассчитаны на основании расчетов-формул, алгоритмов машинного обучения. Эти несложные действия позволяют «предсказывать» возможные проблемы, аварии.
Пример. Если мы видим, что на диск сейчас активно записываются данные, то при сохранении текущей интенсивности записи место на диске закончится через X-часов/дней/месяцев. Предиктивный алертинг обеспечивает и возможность узнать о предстоящей проблеме до того, как она реально появится, и принять соответствующие меры.
Правильное логирование (журналирование)
Сбор и обработка логов — крайне полезная практика. Как правило, современная инфраструктура состоит из десятков приложений. Особенно если инфраструктура мультисервисная со множеством контейнеров, каждый из которых пишет свои логи. Для эффективного журналирования (т.е. такого, которое поможет при аварии) важно не просто собирать логи от всех приложений, а привести их к одному формату. Можно использовать несколько программ для агрегирования всех логов, однако важно иметь единое хранилище логов с поиском событий и ошибок по всем приложениям (например, по ключевому слову, номеру порта).
При выборе системы обработки логов важно обратить внимание на то, чтобы она имела возможность осуществления статистических запросов. Это нужно для того, чтобы понимать, сколько тех или иных событий произошло за определенный период времени. Важно наглядно видеть кривую отказов: что в один месяц их произошло больше, в другой меньше (насколько больше или меньше). И делать из этого какие-то выводы. Это позволит видеть, когда, где и какие сбои происходят; позволит легче принимать решения о том, как их предотвращать.