On 2017-06-22, Tim Sattarov wrote:

> я, чтобы избежать тормозов logstash, на всех источниках логов, где мог,
> включил/настоял на JSON  вывод.
> теперь он только занимается складированием логов плюс небольшая логика
> по развёртыванию geoip и user-agent информации.

Есть подозрение что конечным пунктом у Вас Elasticsearch.

В общем я не в восторге от Logstash - требования по памяти нереальные и
реализован на JRuby. Для "низкоуровневых" сервисов типа сбора/роутинга/доставки
событий крайне печально выглядит.

В основном то пользуються что бы обогатить события геотегом и определить
тип девайсика на кофейной гуще. Если я ошибаюсь - поправьте!

Даже сама компания-производитель для обогащения данных в Elasticsearch в
момент инсерта придумала Ingest Nodes, почитайте:

https://www.elastic.co/blog/new-way-to-ingest-part-1

What are Ingest Nodes?

Ingest Nodes are a new type of Elasticsearch node you can use to perform
common data transformation and enrichments.

Легковесными сборшиками / мониторилками событий (серия *Beat от elastic.co)
они впихивают данные уже напрямую в Ingest Nodes, минуя logstash.

Ведь сама Elasticsearch - маштабируемая, работает в кластере с протоколами
резервированния / балансировки данных.

Я API не раскопал для доступа к этой ноде. Пока эксперементировал с REST/Json
PUSH запросом на порт 9200. По 9300 можно типа как то эфективней вбрасывать,
это порт общения между нодами в кластере, но протокол тоже не особо
документирован.

> По поводу потерь логов и буферизации - рекоммендуют использовать redis
> или что то подобное. Я пока не заморачивался, но придётся.
> Поток и размер логов стремительно растёт.
>
Я смотрю на https://redis.io/topics/introduction и не понимаю как применить на
практике...

Пока рассматривал такую идею логгера. Собирать события в очереди и по обьему /
времени отправлять пачки по сети в рамках самого процеса. Если сервис не
доступен или очередь переполнилась - писать на диск. Затем записанное
отправить в более удачное время.

Ключевым вижу (а Java позволяет) запустить отдельный поток отправляющий
данные, выбрать неблокирующую очередь для сбора событий и сериализовать
избыточные события в файлы. И все в рамках одного PID.

Пока не ясно как эфективно сериализовать в файл и как помечать записаное /
прочитаное, что бы файлы были в консистентном состонии, если само приложение
упадет.

Самым надежным местом записи есть файл. Всевозможные колекторы событий,
слушащие порт рано или позно перегружаються и не будут недоступны.

Потому доставкой события разумно повесить на само приложение, исключая
пропажу сообщений, если колектор логов слишком долго в даунтайме.

-- 
http://defun.work/

Ответить