HighLoad++ 2017
Зал «Пекин+Шанхай», 7 ноября, 17:00
Тезисы:
http://www.highload.ru/2017/abstracts/3036.html
Логи — важная часть системы, позволяющая понять, что она работает (либо не работает), как ожидается. В условиях микросервисной архитектуры работа с логами становится отдельной дисциплиной специальной олимпиады. Нужно решить сразу кучу вопросов:
- как писать логи из приложения;
- куда писать логи;
- как доставлять логи для хранения и обработки;
- как обрабатывать и хранить логи.
...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Lazada)
1. Карта граблей на
поле сбора и
доставки логов.
Lazada-way
Юрий Бушмелев
Lazada TechHub
2. Lazada? Что это?
• интернет-магазин №1 в 6 странах ЮВА (Вьетнам, Таиланд,
Малайзия, Индонезия, Сингапур и Филиппины), с 2016 года
— часть Alibaba Group
• 4 дата-центра
• более 80 микро-сервисов на GO + наследие на PHP
• более 6 миллионов сообщений в минуту по системе в целом
3. 6 миллионов сообщений, которые надо...
• отправить из приложения
• принять для доставки
• доставить для дальнейшего анализа и хранения
• анализировать
• хранить
10. Как мы писали лог из приложения
приложение пишет в stdout/
stderr,
которые перенаправлены
шеллом в файлы,
которые пишутся в каталог,
который проброшен внутрь
контейнера с хост-системы
... на сервере, который
настроил Джек!
сервер
Файл td-agentAPIAPIAPI
11. Как мы собирали и доставляли логи
на хосте был запущен td-
agent, который:
• читал файлы логов
• парсил их в JSON
• слал в Kafka-topic
Kafkatd-agent
JSON
12. Куда мы доставляли логи
• часть логов — в Logstash +
Kibana
• часть логов — в Graylog
• часть логов — в другой
Graylog
... и все они — в один кластер
ElasticSearch
Kafka
LogstashLogstashLogstash
GraylogGraylogGraylog
ES
14. Грабли!
1. Необходим доступ для записи в каталог
2. Нужно много места на диске
3. Невозможна нормальная ротация (только copytruncate)
4. Разные API писали логи в разных форматах
5. td-agent работал реже, чем не работал
15. 6. Проблемы с ElasticSearch
• устаревшая версия (1.7)
• не было выделенных мастеров
• разнородные логи с пересекающимися полями
• отсутствие статического маппинга полей
17. Стандарты!
• единый формат логов для всех API
• единый стандарт на способы записи, сбора и доставки логов
• единые библиотеки логгирования
• SLA на доставку логов
19. Rsyslog — хороший
• много модулей почти на все случаи жизни
• человекопонятный RainerScript
• imfile + mmnormalize + omkafka позволяют сэмулировать td-
agent
• mmnormalize стоит отдельного упоминания
• мощная система шаблонов
• RELP — гарантия доставки
• очереди в памяти и на диске с тонкими настройками
• многопоточность и параллелизация
20. Rsyslog — плохой
• не каждой версией можно пользоваться
• плохо документирован
• RainerScript скуден по возможностям
• omkafka до v8.28 может терять сообщения
• сообщения иногда застревают в RELP
• настройки очередей крайне неочевидны
• параллелится не всё и не всегда
• иногда приходится читать исходники
21. Как мы стали писать и собирать логи
приложение пишет в unix
datagram socket,
который находится в каталоге,
который проброшен в
контейнер с хост-системы,
на которой запущен rsyslog
... на сервере, который
настроил Puppet!
сервер
API
API
API
rsyslog
22. Как мы стали доставлять логи
rsyslog на хосте:
• вычитывает сообщение из
сокета
• парсит его в JSON
• кладёт его в локальный лог
(если надо)
• отправляет далее (в релей
или в Kafka)
Kafka
сервер
Файл
JSON
rsyslog
APIAPIAPI
rsyslog
25. Подводные грабли
• Graylog не успевает
• 50k msg/s только с live API
• 12k msg/s в Graylog
• случается, что запись в сокет блокируется
• нужно мониторить размеры очередей (и сделать алерты по
ним)
• амплификация в 10 раз — легко
• мы растём
26. Файловое хранилище
• сервер с максимально набитым рейдом в каждом ДЦ
• быстрый и простой способ
• получить все логи в одном месте
• использовать утилиты командной строки (tail|grep|awk|jq)
и скрипты над файловыми логами
• организовать долгосрочное хранилище логов
Это РЕАЛЬНО работает!!!
27. Вид сверху с файловым хранилищем
Kafka
LogstashLogstashLogstash
GraylogGraylogGraylog
ES
сервер
Файл
JSON
rsyslogAPIAPIAPI
rsyslog rsyslog
rsyslog
28. Что делать - II
• выкинули Logstash и Kibana
• переехали на собственный кластер Kafka
• перенесли логи со строгими форматами в новый кластер
Graylog
29. Новый Graylog
• всё в Docker
• 3 сервера Kafka
• 7 серверов Graylog (v2.3)
• 24 дата-инстанса ElasticSearch (v5.5) на 12 серверах (4xHDD
RAID0 на инстанс)
• Indexing Rate до 100k msg/s
• 140Tb данных в неделю
30. Опять грабли!
• грядущие распродажи 11/11 и 12/12
• количество логов уже перевалило за 6 миллионов
сообщений в минуту
• Graylog + ES не могли «прожевать» больше 100k msg/s
• выход из строя одной ноды Kafka фатален
• выход из строя одного инстанса ES фатален (Disk I/O)
31. Новый новый Graylog
• всё в Docker
• 5 серверов Kafka
• 7 серверов Graylog (v2.3)
• hot/warm-архитектура ElasticSearch (v5.5)
• 3 выделенных мастера
• 16 hot-инстансов на 4xSSD RAID0
• 32 warm-инстанса на 4xHDD RAID0
• ротация индексов по размеру
• Indexing Rate до 160k msg/s (9m msg/min)
32. Планы на будущее
• работа над High Availability
• метрики Graylog
• рейт-лимиты
• SLA с разработчиками
• документация
33. Итого
• «стандартизируй это»
• решения на базе syslog-ов - всё еще торт
• rsyslog работает хорово
• запись в сокет блокируется
• логи могут теряться
• файловые хранилища логов — быстро, просто, удобно
• Graylog + ElasticSearch — всё сложно
• чем меньше логов — тем лучше