«Дорогой» – конечно в прежде всего в переносном значении, 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/
Добавить комментарий