На определенном этапе, с обретением опыта в поддержке различных систем и кластеров, у нашего системного архитектора сложилось мнение об имеющихся инструментах мониторинга. Оно представляет из себя набор плюсов и минусов, которые в обобщенном виде выглядят довольно интересно. Позже эти наборы превратились в техническое задание на разработку Сводной Системы Мониторинга, выполняющей не только задачи самого мониторинга, но других задач:
Но сначала коротко о тех особенностях, которые интересны больше всего.
Проблемы классического мониторинга: способы снятия метрик
График справа отображает самую обычную ситуацию - измерение нагрузки на CPU.
Синим графиком выведена утилизация процессора (в количестве 100% занятых ядер). На нем хорошо видно, что в начале каждой минуты у нас что-то запускается и потребляет на 2 ядра больше, чем в остальное время.
Зеленый график - это усредненный Load Average, на нем такие секундные пики, хоть и видны, но не так заметно, чтобы обратить на это внимание.
Красный график - это та величина, которую раз в минуту снимает, например, zabbix.
Что вы видите в итоге в zabbix и что вы в нем не видите? Видите вы среднюю нагрузку, величина которой снята раз в минуту в момент обращения. Не видите то, что раз в минуту нагрузка возрастает в полтора раза. Оно может быть и не критично, если на сервере ядер достаточно много, но, если на нем 6 ядер, то, вероятно, уже сейчас кроны работают медленнее, чем могли бы.
Давайте допустим, что ядер на сервере 6, и проблема уже имеет место быть, но вы ее не видите из-за того, что снимаете метрики по красному графику. Что это значит? Это значит что уже пошло время, когда проблема должна быть ликвидирована, но вы её не видите. Какой SLA на поддержку будет по факту, снимая информацию таким инструментом? Может быть, пожалуются клиенты и SLA будет 1-2 часа, а может быть, никто не пожалуется и проблема будет существовать месяцами, пока не усложнится какой-нибудь новой крон-задачей.
Имея некорректные замеры, невозможно не только предупредить аварию, но и среагировать на рост нагрузки в момент, когда она появилась.
Имея аггрегацию из нескольких способов замеров, всегда можно получить величины, которые будут репрезентативны и практически полезны.
Проблемы классического мониторинга: задействованные протоколы
Классически мониторинг осуществляется по протоколам ICMP, SNMP и ряду специальных протоколов, работающих поверх tcp (nrpe, протокол zabbixa и другие).
Проблема протоколов, естественно, в самих протоколах. Протоколы, работающие поверх tcp, имеют одну особенность: при малейшей проблеме в сети просто не установится соединение и мониторинг останется без информации. С одной стороны, вы сразу увидите проблему в сети, с другой стороны, Ваши метрики мониторят не сеть, а сервер, и данные должны быть получены в максимальном объеме. Отказ передавать данные по сети при неудачной установке соединения является некорректным с точки зрения логики мониторига. Зачем реагировать на сеть метрикой, с помощью который вы мониторите, работают ли сервисы внутри?
TCP-подход к мониторингу хорош гарантией доставки, но нехорош тем, что открыть соединение возможно не всегда. Например, в случае потери пакетов в районе 10% - соединения по факту не открываются. При потерях 50% выполнить "тройное рукопожатие tcp" с первого раза невозможно.
SNMP и другие протоколы, базирующиеся на UDP имеют меньше требований к сети - один пакет всегда имеет больше шансов "пролететь", чем "тройное рукопожатие tcp". UDP-пакеты можно дублировать средствами системы (iptables) и тем самым сделать избыточность в передаваемых данных. Так же их можно продублировать по разным каналам (т.к. UDP - это stateless протокол) и получить полезную информацию с бОльшей гарантией путем избыточности, чем по TCP.
Справа сравнительная таблица (просто пример) снятых метрик разными способами и сводный показатель в последней колонке:
Metric Name |
TCP-based |
UDP-based (redundantly) | Aggregated |
Cpu utilization | FAIL: Connection timed out | FAIL: Timed-out | NON INFORMATION |
Eth0 Errors | FAIL: Connection timed out | FAIL: +1143 (!) | FAIL: +1143 (!) |
Eth1 Errors | FAIL: Connection timed out | OK: 0 | OK: 0 |
nginx service state | OK: service is UP | FAIL: Timed-out | OK: service is UP |
Как видно, по TCP мы получаем ворох Connecton timed out, а некоторые UDP проскакивают и мы видим, что внутри реально происходит: летят ошибки на интерфейсе Eth0. Сводная информация позволяет нам понять сразу, что и как происходит на машине. Полезно ли это нам? Конечно полезно - мы можем начать работать с Eth0 на стороне коммутатора уже сейчас, даже если ssh к серверу открыть не получается.
Проблемы классического мониторинга: ложные срабатывания и несрабатывания
У ложных срабатываний причинами бывает не только сеть, но и весьма более неприятные вещи:
Решение проблем
Решение проблемы довольно простое - доверять одному источнику информации нельзя. Требуется настроить несколько разных систем мониторинга, работающих на основе разных протоколов и разных методов замера. Делать это должны разные люди. Результат работы систем требуется аггрегировать по определенным правилам. Очень упрощенно эти правила выглядят так:
Итог
Сейчас эта методика практически применяется в компании и показывает очень хорошие результаты: снижает нагрузку на дежурную службу, позволяет иметь информацию о происходящем "внутри" серверов при частично работающей сети, позволяет избежать человеческого фактора при настройке систем мониторинга.
Протокол WebSocket имеет свои преимущества и свои недостатки: детальный разбор
Не секрет, что хорошо настроенный сервер "падает" гораздо реже, чем доступ из него в Интернет
И снова о маленьких сетевых фокусах ради надежности работы web-сервисов
Быстро+Дешево+Качественно - так не бывает, в чем подвох?
В проекте морской навигации есть особенность, грамотная реализация которой и позволяет жить всей системе