Программа курса

Модуль 05 / Урок 21 из 27

Хранилище: sizing, retention, rollover

Теория и практика

Хранилище трейсов — самый дорогой компонент системы трассировки. Учимся считать размер, выбирать срок жизни данных и не давать индексам расти вечно.

Расчёт ёмкости (ES-вариант)

Суточный объём (из урока 5.1) × репликация × overhead индексов (~1.5–2)

Пример: 26 ГБ/сутки × 1 реплика × 1.5 = ~40 ГБ/сутки на диске. Плюс шард-разбухание и merge-фазы. Практические ориентиры ES:

  • Размер шарда: 20–50 ГБ; трейсовые индексы — по дням (или часам при больших объёмах);
  • RAM: heap ≤ 50% памяти узла, остальное — файловый кеш;
  • Запись: bulk-батчи; следите за es_bulk_size/flush у Jaeger и за latency индексации;
  • Диски: SSD для горячего окна; архивные — на дешёвых носителях.

Retention: как удалять

ХранилищеМеханизм
Elasticsearch/OpenSearchиндексы по дням + jaeger-es-index-cleaner (или ILM/ISM): удалить индексы старше N дней
CassandraTTL на строках — данные истекают сами; compaction подчищает
ClickHouseTTL-политики на таблицах/партициях
Badgerобщий лимит размера/времени (value log)
# Очистка индексов старше 7 дней (утилита Jaeger)
docker run --rm jaegertracing/jaeger-es-index-cleaner:latest 7 \
  --url http://elasticsearch:9200

# По крону, раз в сутки. Мониторьте его успех — иначе диск закончится тихо.

Rollover: индексы по времени

Jaeger пишет в индексы с префиксом даты (jaeger-span-2024-06-01). Утилита jaeger-es-rollover умеет иное: один алиас, индексы ротируются по возрасту/размеру (например, каждые 24ч или 50 ГБ) — стабильное число шардов и предсказуемая очистка:

docker run --rm jaegertracing/jaeger-es-rollover:latest init \
  --url http://elasticsearch:9200
# далее по крону:
... rollover --unit hour --unit-count 24
... lookback --unit hour --unit-count 168   # удалить старше 7 суток
⚠️ Retention-механизм без мониторинга — самая частая авария трассировки: вчерашний сбой крона → через неделю кончился диск → упало и хранилище, и (если делят хост) остальное. Алерт на возраст новейшего индекса и свободное место — обязателен.

Архивные трейсы

Иногда отдельные трейсы нужно хранить дольше retention (инцидент, следствие). В Jaeger есть archive storage: сохранение трейса по кнопке в UI/API в отдельный индекс вне обычной ротации. Используйте точечно: это исключение, а не политика.

Оптимизация поиска

  • Низкокардинарные теги — индексируются; миллион уникальных значений тега — выключайте индексацию (mapping) или не пишите;
  • Ограничивайте окно поиска в UI (неделя — уже тяжёлый запрос);
  • Шард-размер и количество реплик — по SLA доступности; трейсы обычно терпят деградацию, но не простой;
  • Смотрите запросы-убийцы в slow log ES: обычно это wildcard по тегам.

Практика

  1. Посчитайте фактический размер индекса за сутки на стенде (делим размер всех jaeger-индексов на дни) и сравните с теоретическим расчётом.
  2. Настройте rollover (init → rollover по 24ч) и lookback на 3 дня; проверьте, что старые данные исчезают.
  3. Сломайте очистку (остановите крон-джобу) и постройте алерт «новейший индекс старше 2 суток» в Prometheus — потренируйте ловить эту аварию.
  4. Сравните скорость поиска по тегу с низкой и высокой карточностью — почувствуйте разницу.
Мини-квиз

1. Чем rollover лучше «индекс по календарному дню»? — Стабильные шард-размеры и очистка по возрасту/размеру независимо от объёма суток.

2. Почему у Cassandra TTL «сам работает», а у ES нужен cleaner? — ES не удаляет документы по возрасту: чистятся целые индексы внешней утилитой/ILM.

3. Куда класть трейс инцидента, который пережил retention? — В archive storage, точечно.