Quickwit. Когда Elasticsearch слишком дорогой

от автора

«Дорогой» – конечно в прежде всего в переносном значении, Elasticsearch сложно устанавливать, настраивать и обновлять. Это хорошо известно всем, кто работал ES про проде. SaaS версия Elastic позволяет сэкономить время, но это решение по понятным причинам не доступно для большинства компаний в России.

Я убежден, что «инфраструктура» – можно назвать это платформой или платформенными сервисами, должны быть максимально простыми и «дешевыми». Поэтому всегда нахожусь в поиске новых решений в этой сфере.

Quickwit – это поисковой движок нового поколения, альтернатива для Elasticsearch, Loki и Splunk. Одна из главных особенностей Quickwit, заключается в том, что индексы хранятся в объектном хранилище (s3, minio, другие s3-совместимые проекты). Такая архитектура позволяет сократить использование вычислительных ресурсов и хранилища в несколько раз.

Этот проект написан на Rust. Как и случае с Vector (Сборщик логов, альтернатива для Filebeat) это позволяет добиваться значительного прироста производительности и сократить расходы на on-prem и облачную инфраструктуру.

Не все возможности экосистемы Elastic реализованны в Quickwit. Нет красивого UI типа Kibana. Однако проект уже сейчас поддерживает интеграцию с Grafana, Jaeger, OpenTelemetry, Kafka.

Benchmark

Для того, чтобы, быстро, без заморочек проверить Quicktime, пишем программку на Go:

package main  import (     "os"     "log/slog" )  func main() { for { logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))     logger.Debug("Debug message")     logger.Info("Info message")     logger.Warn("Warning message")     logger.Error("Error message") } } 

Для структурированного логирования в json используется slog, которая теперь входит в стандартную библиотеку. Эта нехитрая программка генерирует 3,6 гигабайтов логов за 60 секунд – то есть примерно 5Т логов за 24 часа.

Программку упаковываем в Docker и вместе с сервисами Quickwit запускаем в docker-compose:

version: "3"  x-default-logging: &logging  driver: "json-file"  options:    max-size: "5m"    max-file: "2"    tag: "{{.Name}}|{{.ImageName}}|{{.ID}}"  services:   genlog1:     image: genlogs/genlog     command: ["./genlogs"]     logging: *logging   genlog2:     image: genlogs/genlog     command: ["./genlogs"]     logging: *logging    quickwit:     image: quickwit/quickwit:${QW_VERSION:-0.8.1}     volumes:       - ./qwdata:/quickwit/qwdata     ports:       - 7280:7280     environment:       - NO_COLOR=true       - QW_ENABLE_OPENTELEMETRY_OTLP_EXPORTER=true       - OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:7281     command: ["run"]     logging: *logging    otel-collector:     user: "0"     image: otel/opentelemetry-collector-contrib:${OTEL_VERSION:-0.87.0}     volumes:       - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml       - /var/lib/docker/containers:/var/lib/docker/containers:ro     command: ["--config=/etc/otel-collector-config.yaml"]     logging: *logging 

Физический сервер на котором проводилось тестирование:

Процессор: Intel Xeon E-2236 3.4 ГГц  Память: 32 ГБ DDR4 ECC  Диск:  2 × 480 ГБ SSD SATA 

Создаем запрос для подсчета количества записей со значениями INFO, DEBUG, WARN, и ERROR в минуту:

{   "query": "*",   "max_hits": 0,   "aggs": {     "count_per_minute": {       "histogram": {           "field": "timestamp_nanos",           "interval": 60000000       },       "aggs": {         "severity_text_count": {           "terms": {             "field": "severity_text"           }         }       }     }   } } 

Выполняем запрос с помощью curl:
curl -XPOST -H «Content-Type: application/json» http://IP_ADDRESS:7280/api/v1/otel-logs-v0_7/search —data @agg.json

Получаем ответ меньше чем за секунду. Индекс otel-logs-v0_7 содержит 140 миллионов документов, которые занимают около 92Г на диске в не сжатом виде:

{   "num_hits": 139495352,   "hits": [],   "elapsed_time_micros": 20343,   "errors": [],   "aggregations": {     "count_per_minute": {       "buckets": [         {           "doc_count": 27826,           "key": 1717560000000.0,           "key_as_string": "2024-06-05T04:00:00Z",           "severity_text_count": {             "buckets": [],             "doc_count_error_upper_bound": 0,             "sum_other_doc_count": 0           }         },         {           "doc_count": 139467526,           "key": 1717620000000.0,           "key_as_string": "2024-06-05T20:40:00Z",           "severity_text_count": {             "buckets": [],             "doc_count_error_upper_bound": 0,             "sum_other_doc_count": 0           }         }       ]     }   } } 

Для того, чтобы использовать UI Quickwit:

http://IP_ADDRESS:7280 

На официальном сайте проекта можно найти более репрезентативные сравнения. Однако даже для такого простого теста Elastic потребовал гораздо больше времени и вычислительных ресурсов.

Quickwit благодаря свой простоте можно рассматривать в качестве альтернативы Elastic при разработке SEIM и XDR решений. Такие проекты как FortiSEIM и Wazuh используют ES, хотя Quickwit может быть гораздо эффективнее хранения и поиска по большим объемам логов. Но это уже тема для другой статьи.


ссылка на оригинал статьи https://habr.com/ru/articles/819831/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *