Ван Сяньюй
Старший инженер по эксплуатации и техническому обслуживанию в Bilibili. Ранее он работал в Baidu и Ele.me. Он присоединился к Bilibili в 2017 году и отвечал за проектирование и разработку лог-платформы Bilibili.
В мае 2017 года началось строительство системы журналов (Миллиарды) станции B. На основе эластичного стека она обеспечивает унифицированные услуги сбора, поиска и мониторинга журналов для всей станции. В настоящее время в кластере 20 машин, более 200 сервисов доступа и 10+ логов в день.
Я хотел бы воспользоваться этой возможностью, чтобы поделиться с вами некоторым опытом в построении, развитии и оптимизации системы журналов Станции B. В связи с отсутствием опыта, мы приветствуем всех желающих обсудить и обменяться идеями. Статья в основном разделена на три части:оригинальная система регистрации,Эволюция существующих систем,Взгляд на будущее.
оригинальная система регистрации
До Billions внутри станции B не было единой лог-платформы, и бизнесы в основном воевали друг с другом.Был как более перспективный метод на основе ELK, так и более простой и примитивный метод с использованием tail/grep на сервера.Уровни были неровными.вместе. После понимания ситуации с каждой линейкой продуктов существующие проблемы и требования в основном заключаются в следующем:
Планы разные. Поскольку каждый отдел реализует решение для журналов самостоятельно, и нет специального человека для его обслуживания, как правило, возникают высокие затраты на обслуживание, нестабильная система, потерянные журналы и недостаточная простота использования.
Единой спецификации для бизнес-журналов не существует. Существуют различные форматы бизнес-журналов, и наиболее прямая проблема заключается в том, что журналы нельзя сегментировать по единым правилам, что, несомненно, значительно увеличивает стоимость анализа и извлечения журналов.
Плохая поддержка PAAS. Компания продвигает контейнеризацию приложений в больших масштабах, но не существует хорошего решения для журналов, поддерживающего сбор журналов приложений в контейнерах.
Использование журнала низкое. Использование журналов обычно остается на уровне извлечения журналов, что ограничивается инструментами, которые не извлекают дополнительную информацию из журналов, такими как мониторинг журналов, статистический анализ и анализ цепочки вызовов.
Ввиду вышеперечисленных проблем, цели проектирования новой лог-системы предлагаются следующие:
-
Беспрепятственный доступ к бизнес-журналам: для подключения бизнес-журналов к системе журналов требуется только простая настройка; платформа журналов также должна выполнять только некоторые базовые настройки и не требует использования бизнес-информации, такой как содержимое журнала.
-
Поддержка разнообразия: Различные среды: физические машины (виртуальные машины), контейнеры; различные источники: системные журналы, бизнес-журналы, журналы промежуточного ПО...; различные форматы: однострочный/многострочный, обычный/json.
-
добыча бревен: Быстрая проверка, мониторинг журнала, статистический анализ.
-
доступность системы: данные в режиме реального времени, контролируемая скорость потерь (классификация услуг, полный мониторинг).
Эволюция миллиардов
Первоначальная конструкция системы
спецификация журнала
Чтобы решить проблему разнообразия форматов бизнес-журналов, спецификация формата журнала сформулирована единообразно, а в качестве формата вывода журнала используется JSON. Требование к формату:
-
Должны быть включены четыре категории метаинформации:
-
время: время создания журнала, формат ISO8601
-
уровень: уровень журнала, FATAL, ERROR, WARN, INFO, DEBUG
-
app_id: идентификатор приложения, используемый для указания источника журнала, соответствующий дереву услуг компании, глобально уникальный.
-
instance_id: идентификатор экземпляра, используемый для различения разных экземпляров одного и того же приложения, формат устанавливается бизнес-стороной.
Детали журнала равномерно сохраняются в поле журнала.
В дополнение к указанным выше полям деловые стороны также могут самостоятельно добавлять дополнительные поля.
Отображение json должно оставаться неизменным: ключ нельзя добавлять или изменять по желанию, а тип значения должен оставаться неизменным.
Например:
{"log": "hello billions, write more", "level": "INFO", "app_id": "testapp111", "instance_id": "instance1", "time": "2017-08-04T15:59:01.607483", "id": 0}
скопировать код
Техническое решение системы журналов
От генерации до потребления журналы в основном проходят следующие этапы: сбор -> передача -> сегментация -> извлечение.
Сбор логов
Сбор логов возможен двумя способами: неразмещенным и размещенным.
-
Для журналов бизнес-модулей журналы выводятся единообразно в соответствии со спецификацией журнала и нераспределенным образом. Для таких сценариев в сотрудничестве с отделом платформенных технологий мы разработали модуль лог-агента на базе go.
-
Агент журнала развертывается на физическом компьютере и предоставляет файл sock домена, а программа выводит журнал в sock домена через unixgram.
-
Для приложений, работающих на PAAS, при инициализации контейнера файл sock по умолчанию монтируется внутри контейнера, чтобы программы в контейнере могли выводить журналы.
-
Агент журнала разделен на две части: сборщик и отправитель. Сборщик используется для получения журналов, а отправитель используется для отправки журналов в транспортную систему. Они взаимодействуют напрямую через файловый кеш. Таким образом, в случае сбоя системы передачи логов опора на локальный кеш может обеспечить нормальный прием логов.
-
Мы предоставляем библиотеки журналов (sdk), соответствующие разным языкам, и программы могут быстро получить доступ к системе журналов.
-
Для журналов не бизнес-модулей (промежуточного ПО, системных модулей, уровня доступа) из-за плохой возможности настройки мы завершаем сбор журналов чтением сгенерированных файлов журналов.
-
Мы используем filebeat в эластичном стеке для сбора.Filebeat имеет преимущества удобного развертывания, простой настройки, низкого потребления ресурсов и поддержки сращивания многострочных логов.
-
На физической машине развертывается отдельный процесс filebeat, и каждому типу журнала соответствует отдельный файл конфигурации.
-
Каждый журнал будет отмечен тегом app_id, который аналогичен полю app_id в бизнес-журналах, чтобы его можно было отличить, когда журнал будет окончательно использован.
-
filebeat автоматически идентифицирует компьютер-источник журнала, который также имеет возможность различать разные экземпляры одного и того же приложения.
Сбор логов
У компании уже есть единая платформа передачи данных (lancer), преимущества lancer заключаются в следующем:
-
На основе flume+kafka для вторичной индивидуальной разработки, внутренней автоматической балансировки нагрузки и возможности горизонтального расширения.
-
На стороне приема данных реализован набор надежных протоколов передачи данных, совершенный мониторинг канала, безопасная и надежная передача данных.
-
Различные методы потребления (kafka, hdfs) могут быть подключены в соответствии с потребностями бизнеса.
-
Существует профессиональная команда для обслуживания 7 * 24.
Поэтому мы напрямую выбираем lancer в качестве нашей системы доставки бревен.
-
Модуль отправителя в агенте журналов отправляет журналы на основе настроенного протокола передачи данных lancer, и, наконец, журналы передаются в разные темы в кластере kafka (темы настраиваются в соответствии с трафиком журналов), а затем журналы потребляются из kafka. Все темы используют единый префикс.
-
Поскольку на вторичную кастомизированную разработку filebeat нет сил, то filebeat напрямую выводит логи в кластер kafka lancer'а.
сегментация журнала
Основная функция модуля сегментации логов — потреблять логи из kafka, обрабатывать логи (извлечение полей, преобразование формата) и, наконец, сохранять их в соответствующем индексе elasticsearch. Мы используем logstash в качестве схемы разделения логов.
в:
-
Для журналов, созданных в соответствии со спецификацией журнала, тема журнала kafka принимает единый префикс, поэтому мы используем метод Topics_Pattern для использования журнала.
-
Для параметра partition_assignment_strategy logstash должно быть задано значение "org.apache.kafka.clients.consumer.RoundRobinAssignor". Стратегия по умолчанию (разделение по диапазону) приведет к неравномерному распределению разделов. Если принята стратегия по умолчанию, когда потребитель (количество logstash * количество рабочих) Когда число больше, чем количество разделов темы, разделы всегда будут выделяться только фиксированной части потребителей.
-
Для журналов нестандартного формата отсутствует поддержка нескольких конфигураций из-за ограничений конвейера одного события logstash (ожидайте конвейера нескольких событий 6.0). Каждая конфигурация журнала отличается, поэтому для использования требуется отдельный процесс logstash.
поиск журнала
Масштаб кластера elasticsearch: главный узел*3, hot node*20, stale node*20, клиентский узел*2. Версия es — 5.4.3, конфигурация кластера следующая:
-
Машина данных (40 ядер, 256 ГБ памяти, 1T ssd, 6T*4 SATA) использует схему горячего и холодного разделения: развертывание горячего узла и устаревшего узла одновременно. Горячие узлы используют твердотельные накопители в качестве носителя для получения журналов в реальном времени. Устаревший узел использует диск sata в качестве носителя для хранения исторических журналов (только для чтения, но не для записи). Горячая->холодная миграция в фиксированное время в день.
-
Клиентская нода предоставляет внешние API для чтения и подключается к кибане и программам управления (таким как куратор, церебро и т. д.).
-
Для управления индексами (миграция, удаление) используется куратор, а журналы по умолчанию хранятся 7 дней.
-
Оптимизация конфигурации кластера es основана на предложениях многих сообществ и не будет подробно описана.
-
Используйте шаблон для управления отображением индекса.
-
Индекс создается за один день, чтобы предотвратить невозможность записи данных из-за централизованного создания.
-
es Monitoring: Изучил официальный монитор x-pack.Из-за отсутствия функций монитора x-pack (например, отсутствие мониторинга пула потоков) и невозможности выполнения алармов, я, наконец, решил разработать его самостоятельно. Внутренняя система мониторинга компании основана на Prometheus.Мы разработали es_exporter для сбора информации о состоянии es, а окончательный мониторинг и оповещение реализованы через Prometheus. Аварийный сигнал в основном включает в себя ключевые индикаторы, такие как информация о состоянии кластера es, количество отклоненных потоков, количество узлов и количество неназначенных осколков.
После вышеуказанных шагов окончательный журнал можно запросить на кибане. На первом этапе общая архитектура лог-системы следующая:
итерация системы
С увеличением количества доступных журналов постепенно возникали некоторые проблемы и новые требования. Billions был обновлен и итерирован в основном в следующих аспектах.
управление осколками
Сначала была принята стратегия управления по умолчанию es.Все индексы соответствуют 5*2 шардам (5 первичных и 5 реплик).Основные проблемы заключаются в следующем:
-
Каждый шард имеет дополнительные накладные расходы (память, дескрипторы файлов), а большинство индексов относительно небольшие, поэтому нет необходимости создавать 5 шардов.
-
Некоторые индексы содержат большой объем данных (более 500 ГБ/день), и объем данных, соответствующий одному сегменту, будет очень большим, что приведет к неоптимальной скорости извлечения, а операции ввода-вывода при записи на диск будут сосредоточены на нескольких машинах.
В ответ на вышеперечисленные проблемы был разработан модуль управления индексом (shard mng), по объему исторических данных индекса (вчерашних данных) было принято решение создать количество шардов, соответствующее индексу завтрашнего дня. стратегия — 30 ГБ/шард, а верхний предел количества шардов — 15. Благодаря приведенной выше оптимизации количество сегментов в кластере сокращается на 70%+, а использование дискового ввода-вывода также становится более эффективным.
выборка журнала
Некоторые предприятия имеют большой объем журналов (более 500 ГБ/день), большинство из которых представляют собой журналы доступа к бизнес-процессам. Для журналов "небольшой части большого объема данных достаточно для устранения неполадок и выявления тенденций", а также для НИОКР и O&M.Communicate, эта точка зрения также получила признание. Поэтому в агент журнала-источника сбора данных (модуль-сборщик) добавлена функция выборки журнала:
-
Выборка журнала использует app_id в качестве измерения. Журналы ниже уровня INFO выбираются случайным образом в соответствии с пропорцией, а все журналы выше WARN сохраняются.
-
Агент журнала подключается к центру конфигурации компании, а коэффициент выборки сохраняется в центре конфигурации, который может действовать динамически.
-
Есть дополнительная деталь: из-за необходимости получения поля app_id в логе, если парсинг json производить напрямую, потребление процессора будет очень высоким. Позже мы улучшили поиск по символам (bytes.Index), чтобы решить эту проблему.
Службы выборки с большим количеством журналов экономят много ресурсов es, не влияя на их использование. В настоящее время количество операций записи в журнал сокращается на 3+ трлн в день.
Аппаратное решение узкого места узла данных
20:00-24:00 вечера — пиковый период работы станции B, а также пиковый период трафика логов. С увеличением трафика часто поступает сигнал тревоги о задержке журнала (журнал не записывается в es вовремя).При наблюдении и мониторинге в основном обнаруживаются два явления:
-
На горячем узле было много отказов от массовых запросов, и в то же время logstash получил много 429 ответов. Пытался увеличить размер пула потоков и размер очереди, но проблема осталась.
-
Машина с горячим узлом долго ждет ввода-вывода, а использование SSD-диска составляет 100%.
Из-за описанного выше явления предполагается, что отказ от записи вызван недостаточным объемом операций ввода-вывода SSD. Были проведены последующие тесты производительности и сравнения твердотельных накопителей, и было обнаружено, что производительность записи твердотельных накопителей на этом типе машины была низкой. Чтобы уменьшить нагрузку ввода-вывода на SSD, мы перенесли некоторый трафик записи в реальном времени на устаревший узел (устаревший узел раньше не принимал трафик записи в реальном времени, и нагрузка на запись была очень небольшой), а проблема журнала задержка была временно решена. Идеальное решение: модель узла данных — 40-ядерный ЦП, 256 ГБ памяти, 1 Тб SSD+4*6T SATA, очевидно, что эта модель SSD является узким местом с точки зрения производительности и емкости.Чтобы улучшить коэффициент использования этой модели и устранить узкое место производительности SSD IO, мы, наконец, добавили 2 * к каждой машине.Твердотельный накопитель PCIe 1,2 Тб — раз и навсегда!
решение для повышения производительности logstash
После решения вышеупомянутого узкого места записи es через некоторое время проблема задержки журнала в периоды пиковой нагрузки снова появилась. На этот раз у es не было проблемы с отклонением массового запроса. Из исследования всей ссылки не возникает задержек при сборе и передаче журналов, и, наконец, основное внимание уделяется модулю сегментации журналов (logstash).
В сообществе признается низкая производительность logstash. Дальнейшие тесты производительности проводятся на logstash. 8000qps.Производительность действительно очень низкая.В пиковый период трафик 40W/s, поэтому для удовлетворения требований требуется не менее 50 экземпляров logstash.Очевидно, что такое потребление ресурсов недопустимо. Учитывая, что функция сегментации, соответствующая бизнес-логам, относительно проста, мы использовали go для разработки модуля сегментации журналов (индекс миллиардов).
Производительность самостоятельно разработанного модуля была значительно улучшена.При условии 2 ядра + 4G памяти предельная производительность увеличивается до 5 Вт + QPS, а память потребляет всего 150 МБ. Потребление онлайн-ресурсов от (2 ядра + 4G памяти)30 уменьшено до (2 ядра + 150 МБ памяти)15. Также были решены проблемы с производительностью.
мониторинг журнала
С доступом ко все большему количеству сервисов спрос на мониторинг журналов становится все сильнее и сильнее. Среди текущих решений сообщества elastalert от Yelp является наиболее зрелым, многофункциональным и простым для дальнейшей настройки. Поэтому мы решили реализовать мониторинг журналов на основе elastalert. В сочетании с собственными потребностями, просмотром документации и чтением кода, elastalert также имеет некоторые недостатки:
-
Правила хранятся в файлах, которые ненадежны и не подлежат распространению.
-
Конфигурация правила более сложная, неудобная и простая в использовании.
-
Программа единой точки, высокая доступность не может быть гарантирована.
-
Правила мониторинга выполняются последовательно, что неэффективно (если время выполнения всех правил больше интервала выполнения, регулярное выполнение одного правила не гарантируется).
Ввиду вышеуказанных недостатков и собственных потребностей мы провели вторичную разработку для elastalert:
Основные улучшения включают в себя:
-
Хранение всех правил в elasticsearch повышает надежность хранения правил и подготавливает к распределенной реализации elastalert.
-
Все типы правил мониторинга журналов инкапсулированы в шаблоны для упрощения настройки. Например, ограничьте использование строки запроса для фильтрации журналов, блокировки определенных элементов конфигурации и т. д.
-
Набор Restful API инкапсулирован для добавления, удаления, изменения и проверки правил мониторинга.
-
Объедините с существующей системой мониторинга компании (Bili Moni): настройте мониторинг журналов на основе Интернета и отправляйте сигналы тревоги через платформу сигналов тревоги.
-
Используйте глобальные блокировки для решения одноточечных проблем: два процесса горячие, а другой холодный.После сбоя горячего процесса автоматически вступает во владение холодный и выдается сигнал тревоги.
-
Скорректировано содержание будильника (корректировка формата, китаизация), описание стало понятнее.
Log Monitoring 1.0 в настоящее время используется и продолжает развиваться.
Архитектура последних Billions выглядит следующим образом:
Текущие проблемы и следующие шаги
В существующей системе журналов по-прежнему много недостатков, в основном в том числе:
-
Отсутствие контроля доступа: В настоящее время отсутствует контроль разрешений, в будущем необходимо реализовать такие функции, как унифицированная аутентификация, авторизация на основе индексов и аудит операций по аналогии с xpack.
-
Отсутствие полного мониторинга ссылок: Логи формируются и извлекаются через многоуровневые модули.В настоящее время каждый уровень мониторинга реализован независимо и не соединен последовательно, поэтому точно отслеживать накопление и потери невозможно.
-
Узкое место производительности мониторинга журналов: На данный момент лог-мониторинг выполняется на одной ноде (работает одна горячая нода) и правила выполняются последовательно, в дальнейшем требуется оптимизация под распределенную архитектуру + параллельное выполнение правил.
-
Конфигурация сегментации журнала сложна: Для журналов нестандартного формата реализована сегментация журналов на основе logstash.Каждому журналу для использования требуется отдельный экземпляр logstash.Конфигурация и онлайн-процесс сложны, а для поддержки в дальнейшем требуется система на базе платформы.
Вышеуказанные недостатки также являются областями, над улучшением которых мы сосредоточимся на следующем этапе. Кроме того, благодаря мощным функциям es по поиску и анализу агрегации, мы также занимаемся более глубоким изучением ценности журналов. Нам еще предстоит поработать во многих местах, и мы с нетерпением ждем более глубокого общения с нашими партнерами по сообществу!