Перевод статьи подготовлен специально для студентов курса.
«Практики и инструменты DevOps» .
Фабиан Рейнарц — разработчик программного обеспечения, фанат Go и решатель проблем.
Он также занимается сопровождением Prometheus и соучредителем инструментария Kubernetes SIG. В прошлом он был инженером-технологом в SoundCloud и руководил командой мониторинга в CoreOS. В настоящее время работает в Google. Бартек Плотка — Инженер инфраструктуры в Improbable. Его интересуют новые технологии и проблемы распределенных систем.
У него есть опыт низкоуровневого программирования в Intel, опыт работы в качестве автора в Mesos и опыт производства SRE мирового класса в Improbable. Посвящается улучшению мира микросервисов.
Три его любви: Golang, открытый исходный код и волейбол.
Глядя на наш флагманский продукт SpatialOS, вы можете догадаться, что Improbable требует высокодинамичной облачной инфраструктуры глобального масштаба с десятками кластеров Kubernetes. Мы были одними из первых, кто применил систему мониторинга Прометей .
Prometheus способен отслеживать миллионы показателей в режиме реального времени и оснащен мощным языком запросов, позволяющим извлекать необходимую информацию.
Простота и надежность «Прометея» — одно из его главных преимуществ.
Однако, преодолев определенный масштаб, мы столкнулись с рядом недостатков.
Для решения этих проблем мы разработали Танос — это проект с открытым исходным кодом, созданный Improbable для плавного преобразования существующих кластеров Prometheus в единую систему мониторинга с неограниченным хранилищем исторических данных.
Танос доступен на Github. Здесь .
Будьте в курсе последних новостей от Improbable.
Наши цели с Таносом
В определенном масштабе возникают проблемы, выходящие за рамки возможностей ванильного Прометея.Как надежно и экономично хранить петабайты исторических данных? Можно ли это сделать без ущерба для времени отклика? Можно ли получить доступ ко всем метрикам, расположенным на разных серверах Prometheus, с помощью одного запроса API? Есть ли способ объединить реплицированные данные, собранные с помощью Prometheus HA? Чтобы решить эти проблемы, мы создали Таноса.
В следующих разделах описывается, как мы подошли к этим вопросам, и объясняются наши цели.
Запрос данных из нескольких экземпляров Prometheus (глобальный запрос)
Prometheus предлагает функциональный подход к шардингу.Даже один сервер Prometheus обеспечивает достаточную масштабируемость, чтобы освободить пользователей от сложностей горизонтального сегментирования практически во всех случаях использования.
Хотя это отличная модель развертывания, часто бывает необходимо получить доступ к данным на разных серверах Prometheus через один API или пользовательский интерфейс — глобальное представление.
Конечно, на одной панели Grafana можно отображать несколько запросов, но каждый запрос может выполняться только на одном сервере Prometheus. С другой стороны, с помощью Thanos вы можете запрашивать и агрегировать данные с нескольких серверов Prometheus, поскольку все они доступны из одной конечной точки.
Раньше, чтобы получить глобальное представление в Improbable, мы организовали наши экземпляры Prometheus в многоуровневую структуру.
Это означало создание одного метасервера Prometheus, который собирал некоторые показатели с каждого конечного сервера.
Этот подход оказался проблематичным.
Это привело к усложнению конфигураций, добавлению дополнительной потенциальной точки отказа и применению сложных правил, гарантирующих, что федеративная конечная точка получает только те данные, которые ей необходимы.
Кроме того, такая федерация не позволяет получить истинное глобальное представление, поскольку не все данные доступны из одного запроса API. С этим тесно связано унифицированное представление данных, собранных на серверах Prometheus высокой доступности (HA).
Модель высокой доступности Prometheus независимо собирает данные дважды, что настолько просто, что не может быть проще.
Однако использование комбинированного и дедуплицированного представления обоих потоков было бы гораздо удобнее.
Конечно, существует потребность в высокодоступных серверах Prometheus. В Improbable мы очень серьезно относимся к поминутному мониторингу данных, но наличие одного экземпляра Prometheus на кластер — это единственная точка отказа.
Любая ошибка конфигурации или аппаратный сбой потенциально могут привести к потере важных данных.
Даже простое развертывание может вызвать незначительные сбои в сборе метрик, поскольку перезапуски могут значительно превышать интервал очистки.
Надежное хранение исторических данных
Дешевое, быстрое и долгосрочное хранение метрик — наша мечта (разделяемая большинством пользователей Prometheus).В Improbable нас заставили настроить срок хранения метрик на девять дней (для Prometheus 1.8).
Это накладывает очевидные ограничения на то, как далеко назад мы можем заглянуть.
В Прометее 2.0 в этом плане улучшились, так как количество таймсерий больше не влияет на общую производительность сервера (см.
Основной доклад KubeCon о «Прометее 2» ).
Однако Прометей хранит данные на локальном диске.
Хотя высокоэффективное сжатие данных может значительно сократить использование локальных твердотельных накопителей, в конечном итоге все еще существует ограничение на объем хранимых исторических данных.
Кроме того, в Improbable мы заботимся о надежности, простоте и стоимости.
Большие локальные диски сложнее эксплуатировать и выполнять резервное копирование.
Они стоят дороже и требуют больше инструментов резервного копирования, что приводит к ненужной сложности.
Понижение разрешения
Как только мы начали работать с историческими данными, мы поняли, что существуют фундаментальные трудности с big-O, которые делают запросы все медленнее и медленнее, когда мы работаем с данными за недели, месяцы и годы.Стандартным решением этой проблемы будет понижение частоты дискретизации (downsampling) – уменьшение частоты дискретизации сигнала.
С помощью понижающей выборки мы можем «уменьшить масштаб» до большего временного диапазона и поддерживать то же количество выборок, сохраняя при этом отзывчивость запросов.
Понижение выборки старых данных является неизбежным требованием любого решения для долговременного хранения и выходит за рамки стандартного Prometheus.
Дополнительные цели
Одной из первоначальных целей проекта Thanos была плавная интеграция с любыми существующими установками Prometheus. Второй целью была простота работы с минимальными входными барьерами.Любые зависимости должны легко удовлетворяться как для мелких, так и для крупных пользователей, что также означает низкую базовую стоимость.
Танос архитектура
Перечислив наши цели в предыдущем разделе, давайте проработаем их и посмотрим, как Танос решает эти проблемы.
Глобальный вид
Чтобы получить глобальное представление поверх существующих экземпляров Prometheus, нам нужно связать единую точку входа запроса со всеми серверами.Именно это и делает компонент Таноса.
Коляска .
Он развертывается рядом с каждым сервером Prometheus и действует как прокси, обслуживая локальные данные Prometheus через API-интерфейс gRPC Store, позволяя получать данные временных рядов по тегам и временным диапазонам.
С другой стороны, это масштабируемый компонент Querier без сохранения состояния, который делает немного больше, чем просто отвечает на запросы PromQL через стандартный HTTP API Prometheus. Querier, Sidecar и другие компоненты Thanos взаимодействуют через протокол сплетен .
Querier, получив запрос, подключается к соответствующему серверу Store API, то есть к нашим Sidecars, и получает данные временных рядов от соответствующих серверов Prometheus.
После этого он объединяет ответы и выполняет по ним запрос PromQL. Querier может объединять как разрозненные данные, так и дублирующиеся данные с серверов высокой доступности Prometheus.
Это решает основную часть нашей головоломки — объединение данных с изолированных серверов Prometheus в единое представление.
Фактически, Таноса можно использовать только для этой функции.
Никаких изменений в существующие серверы Prometheus вносить не нужно!
Неограниченный срок годности!
Однако рано или поздно нам захочется хранить данные сверх обычного времени хранения Prometheus. Мы выбрали объектное хранилище для хранения исторических данных.Он широко доступен в любом облаке, а также в локальных центрах обработки данных и очень экономичен.
Кроме того, практически любое объектное хранилище доступно через известный API S3. Прометей записывает данные из оперативной памяти на диск примерно каждые два часа.
Сохраненный блок данных содержит все данные за фиксированный период времени и является неизменяемым.
Это очень удобно, поскольку Thanos Sidecar может просто просмотреть каталог данных Prometheus и по мере появления новых блоков загружать их в сегменты объектного хранилища.
Загрузка в объектное хранилище сразу после записи на диск также позволяет сохранить простоту парсера (Prometheus и Thanos Sidecar).
Это упрощает поддержку, стоимость и проектирование системы.
Как видите, резервное копирование данных очень просто.
А как насчет запроса данных в объектном хранилище? Компонент Thanos Store действует как прокси для получения данных из объектного хранилища.
Как и Thanos Sidecar, он участвует в кластере сплетен и реализует API магазина.
Таким образом, существующий Querier может рассматривать его как Sidecar, как еще один источник данных временных рядов — никакой специальной настройки не требуется.
Блоки данных временных рядов состоят из нескольких больших файлов.
Загружать их по требованию было бы весьма неэффективно, а для локального кэширования потребовалось бы огромное количество памяти и дискового пространства.
Вместо этого Store Gateway знает, как обращаться с форматом хранения Prometheus. Благодаря умному планировщику запросов и кэшированию только необходимых индексных частей блоков можно свести сложные запросы к минимальному количеству HTTP-запросов к файлам объектного хранилища.
Таким способом можно сократить количество запросов на четыре-шесть порядков и добиться времени отклика, которое вообще сложно отличить от запросов к данным на локальном SSD.
Как показано на диаграмме выше, Thanos Querier значительно снижает стоимость запроса данных объектного хранилища за счет использования формата хранения Prometheus и размещения связанных данных рядом.
Используя этот подход, мы можем объединить множество отдельных запросов в минимальное количество массовых операций.
Сжатие и понижение разрешения
Как только новый блок данных временных рядов успешно загружен в объектное хранилище, мы рассматриваем его как «исторические» данные, которые немедленно доступны через Store Gateway. Однако через некоторое время блоки из одного источника (Прометей с Sidecar) накапливаются и перестают использовать весь потенциал индексации.Чтобы решить эту проблему, мы ввели еще один компонент под названием Compactor. Он просто применяет локальный механизм сжатия Prometheus к историческим данным в объектном хранилище и может запускаться как простое периодическое пакетное задание.
Благодаря эффективному сжатию запросы к хранилищу в течение длительного периода времени не создают проблем с размером данных.
Однако потенциальная стоимость распаковки миллиарда значений и прогона их через процессор запросов неизбежно приведет к резкому увеличению времени выполнения запроса.
С другой стороны, поскольку на экране имеются сотни точек данных на пиксель, становится невозможным даже визуализировать данные в полном разрешении.
Таким образом, понижение разрешения не только возможно, но и не приведет к заметной потере точности.
Для субдискретизации данных Compactor непрерывно агрегирует данные с разрешением пять минут и один час.
Для каждого необработанного фрагмента, закодированного с использованием сжатия TSDB XOR, сохраняются различные типы совокупных данных, такие как минимум, максимум или сумма для одного блока.
Это позволяет Querier автоматически выбирать агрегат, подходящий для данного запроса PromQL. Для использования данных пониженной точности пользователю не требуется никакой специальной настройки.
Querier автоматически переключается между различными разрешениями и необработанными данными, когда пользователь увеличивает и уменьшает масштаб.
При желании пользователь может управлять этим напрямую через параметр «шаг» в запросе.
Поскольку стоимость хранения одного ГБ невелика, по умолчанию Танос хранит необработанные данные, данные с пятиминутным и часовым разрешением.
Исходные данные удалять не нужно.
Правила записи
Даже в случае с Таносом правила записи являются важной частью стека мониторинга.Они уменьшают сложность, задержку и стоимость запросов.
Они также удобны пользователям для получения агрегированных данных по метрикам.
Thanos основан на ванильных экземплярах Prometheus, поэтому вполне приемлемо хранить правила записи и правила оповещений на существующем сервере Prometheus. Однако в некоторых случаях этого может быть недостаточно: Глобальное оповещение и правило (например, оповещение, когда служба не работает более чем на двух из трех кластеров).
Правило для данных за пределами локального хранилища.
Желание хранить все правила и оповещения в одном месте.
Для всех этих случаев Thanos включает отдельный компонент под названием Ruler, который вычисляет правила и оповещения с помощью запросов Thanos. Предоставляя известный StoreAPI, узел запросов может получить доступ к недавно вычисленным метрикам.
Позже они также сохраняются в объектном хранилище и становятся доступными через Store Gateway.
Сила Таноса
Танос достаточно гибок, чтобы его можно было настроить в соответствии с вашими потребностями.Это особенно полезно при переходе с обычного Prometheus. Давайте быстро подведем итог тому, что мы узнали о компонентах Таноса, на кратком примере.
Вот как можно перенести свой ванильный Прометей в мир «неограниченного хранилища метрик»:
Добавьте Thanos Sidecar на свои серверы Prometheus — например, контейнер Sidecar в модуле Kubernetes.
Разверните несколько реплик Thanos Querier, чтобы иметь возможность просматривать данные.
На этом этапе легко завязать сплетни между Scraper и Querier. Чтобы проверить взаимодействие компонентов, используйте метрикуthanos_cluster_members. Всего этих двух шагов достаточно, чтобы обеспечить глобальное представление и плавную дедупликацию данных из потенциальных реплик Prometheus HA! Просто подключите свои информационные панели к конечной точке HTTP Querier или используйте пользовательский интерфейс Thanos напрямую.
Однако если вам требуется резервное копирование и долгосрочное хранение метрик, вам потребуется выполнить еще три шага: Создайте корзину AWS S3 или GCS. Настройте Sidecar для копирования данных в эти сегменты.
Локальное хранилище данных теперь можно свести к минимуму.
Разверните Store Gateway и подключите его к существующему кластеру сплетен.
Теперь вы можете запросить резервные копии данных! Разверните Compactor, чтобы повысить эффективность запросов в течение длительных периодов времени с помощью уплотнения и понижения разрешения.
Если вы хотите узнать больше, не стесняйтесь взглянуть на наш примеры манифеста kubernetes И начиная ! Всего за пять шагов мы превратили Prometheus в надежную систему мониторинга с глобальным обзором, неограниченным временем хранения и потенциально высокой доступностью метрик.
Запрос на вытягивание: ты нам нужен!
Танос с самого начала был проектом с открытым исходным кодом.Полная интеграция с Prometheus и возможность использовать только часть Thanos делают его отличным выбором для легкого масштабирования вашей системы мониторинга.
Мы всегда приветствуем запросы на включение и проблемы GitHub. А пока не стесняйтесь обращаться к нам через Github Issues или Slack. Improbable-eng #thanos если у вас есть вопросы или отзывы, или вы хотите поделиться своим опытом использования! Если вам нравится то, что мы делаем в Improbable, не стесняйтесь обращаться к нам — у нас всегда есть вакансии ! Узнайте больше о курсе.
Теги: #Хранение данных #DevOps #прометей #танос #невероятно
-
Тестирование Игры
19 Oct, 24 -
Первые, Но Трудные Шаги Во Flex
19 Oct, 24 -
Qiwi Server Party: Пиво Devops Не Помеха
19 Oct, 24 -
18 Марта — Встреча Analyit #4
19 Oct, 24