Как мы держим собственный общий сервер под Pulse
Агент и мониторинг, которые мы ставим клиентам, работают и на нашем собственном общем сервере, а новые версии агента приходят на него первыми. На этом сервере восемь проектов, в том числе этот сайт и сам Pulse. Рассказываем, что настроено, что нашли и исправили и что ещё впереди.
5 мин чтения
- Задача
- Восемь проектов на одном сервере: общий диск и общий nginx на входе. Ошибка одного проекта бьёт по всем.
- Что сделали
- Мониторы и агент Pulse, канарейка обновлений агента, почасовые и ночные копии с копией вне сервера, тревоги в Telegram.
- Что получилось
- Агент сам обновился с v1.0.2 до v1.0.7. Почасовая копия базы Pulse — 52 КБ вместо 1,2 МБ. Клиент Business на пределе тарифа — около 4 ГБ вместо 31 ГБ.
- Что дальше
- Внешний сторож вне сервера, вторая локация проверок, отдельный диск под базу Pulse по мере роста.
Что на сервере
На общем сервере ServerDesk работают восемь проектов. Среди них — serverdesk.ru и Pulse на app.serverdesk.ru: приложение, база PostgreSQL и планировщик проверок. Проекты живут в своих контейнерах, а на входе у всех общий nginx.
У такого устройства два следствия. Pulse наблюдает за сервером, на котором сам и работает, — значит, нужен ещё и взгляд снаружи. И любая ошибка одного проекта — переполненный диск, сломанная конфигурация nginx — бьёт по всем восьми.
Мониторы и агент
Организация ServerDesk в Pulse — на тарифе Business, как у клиента. На 9 октября в ней 12 мониторов; после выкладки исправлений аудита безопасности все двенадцать были в состоянии «работает».
С 8 октября на сервере работает агент Pulse: раз в минуту он присылает загрузку процессора, память, диски и службы. Тревога по диску стоит на 80 и 90 %. Раз в час Pulse строит прогноз для каждого диска, а норма нагрузки по дню недели и часу складывается за две-три недели работы агента. Как это устроено, мы подробно разобрали в статье «Агент на сервере».
Точки проверки тоже опробованы вживую: агент из другой сети прислал на прод результат проверки serverdesk.ru.
Канарейка обновлений
Наш сервер — канарейка: новая версия агента приходит на него сразу, остальным — только после того, как руководитель выпустит её для всех. С 8 октября агент на сервере сам обновился с v1.0.2 до v1.0.7, а с v1.0.4 служба обновления завершается чисто.
Зачем нужна канарейка, хорошо видно на версии 1.0.6. Проверка govulncheck нашла 34 уязвимости стандартной библиотеки на путях агента: он собирался на Go 1.23, а эта версия больше не поддерживается. Агент пересобрали на Go 1.27, уязвимостей стало ноль, и наш сервер получил новую версию первым — сам, по каналу «канарейка».
Есть и тонкость, которую лучше видеть на своём сервере: бинарник подменяет уже установленная версия агента. Исправление в самом механизме обновления начинает работать только со следующего обновления — и на канарейке это видно раньше, чем на серверах клиентов.
Копии и место на диске
Копии базы Pulse делаются каждый час и каждую ночь и уходят в том числе во внешнее хранилище. Почасовая копия нужна, чтобы при аварии терять не больше часа: инцидентов, настроек, обращений, чата.
Девятого октября мы посчитали, сколько места займёт клиент Pulse, выбравший тариф до предела. Размер строк замерили на проде: проверка — около 250 байт в базе с индексами, замер агента — 1,8 КБ, часовая сводка — 190 байт. Нашлось неприятное: на диске лежали 52 копии одной и той же базы, и копии весили впятеро больше самой базы. Клиент Business на пределе тарифа занял бы 31 ГБ.
Решения приняли в тот же день:
- сырые проверки хранятся 7 дней вместо 30 — отчёты, SLA и графики длиннее суток считаются по часовым сводкам, а их Pulse хранит 400 дней;
- замеры агента — 3 дня вместо 14: графики сервера показывают сутки, наблюдения считаются по часовым сводкам;
- собственных ночных копий Pulse — 3 вместо 14: рядом лежат ночные копии всего сервера;
- почасовые копии — без сырых проверок и замеров агента; схема и сводки в них остаются.
Политику конфиденциальности Pulse обновили в тот же день: срок хранения истории стал короче, и это в пользу клиента.
Результат проверили на проде: почасовой дамп Pulse уменьшился с 1,2 МБ до 52 КБ, в нём все 59 таблиц, копия ушла во внешнее хранилище. Сырых проверок в базе стало вдвое меньше — 23 тысячи строк вместо 46 тысяч, самой старой неделя. Клиент Business на пределе тарифа теперь займёт около 4 ГБ, Pro — 0,65 ГБ, Free — 0,05 ГБ.
Цена решения: при аварии теряются только сырые проверки, сделанные после последней ночной копии, — не больше суток. Инциденты, настройки, обращения и сводки есть в почасовой копии.
Ошибка одного проекта бьёт по всем
На общем сервере особенно ценны находки, которые касаются соседей. Аудит безопасности 9 октября нашёл две такие ошибки — в подключении доменов клиентов к общему nginx и в резервном хранении заявок с этого сайта. Обе исправлены, и теперь сбой одного проекта не задевает остальные: каждое изменение общей конфигурации проверяется отдельно, а всё, что пишется на общий диск, ограничено по объёму.
И одна находка нагрузочного теста — до первого крупного клиента. На отдельном стенде собрали организацию Business на пределе тарифа: 200 мониторов, 25 серверов с агентом и месяц истории — 8,6 млн проверок. Панель такой организации выбирала из базы все её проверки и обрезала их в памяти: страница не открылась за две минуты, процесс Pulse упал по памяти. На общем сервере это остановило бы Pulse для всех клиентов. Теперь последние проверки берутся одним запросом по индексу, и на тех же данных панель отвечает за 0,2 секунды.
Тревоги — в Telegram
Оповещения Pulse приходят в Telegram, с графиком времени ответа под тревогой. Тревоги клиентов на обслуживании дублируются в чат дежурной смены с пометкой «[Клиент]» и кнопками «Подтвердить» и «Взять в работу». Туда же приходят заявки с этого сайта. Как устроены дежурства — в статье «Дежурство без хаоса».
Даже репетиция запуска шла через настоящий чат смены. Весь путь первого клиента прошли на проде тестовым аккаунтом, а сообщения в чат приходили с пометкой «РЕПЕТИЦИЯ», чтобы на них не реагировали как на настоящие. После проверки тестовые аккаунты, организации и серверы удалили; записи в журнале доступа остаются, так задумано.
Что впереди
- Внешний сторож — проверка, которая живёт вне сервера и сообщит, если сервер недоступен целиком: мониторинг на самом сервере этого сделать не может.
- Вторая локация проверок на другом сервере — чтобы статус-страница показывала, из скольких локаций сервис недоступен.
- Отдельный диск или сервер под базу Pulse — когда клиентов Business станет больше. Тревога по диску на 80 и 90 % предупредит заранее.