Раздел 40 · Elasticsearch и ELK

Elasticsearch как хранилище логов: индексы по времени

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Каталог блюд «Гонца» живёт в одном индексе: блюда меняются, удаляются, добавляются, но их число почти не растёт. Логи устроены иначе: каждый день гигабайты новых записей, старые никогда не правятся, а через месяц их можно удалить. Хранить такой поток в одном индексе неудобно. Разберём, как Elasticsearch хранит данные, которые растут во времени.

Почему не один индекс

Представь журнал в бухгалтерии, куда записывают каждую операцию. Если вести одну толстую тетрадь годами, она станет неподъёмной, а выбросить записи старше года не получится, не переписав тетрадь. Поэтому журналы ведут по месяцам: новая тетрадь на каждый месяц, а старые тетради целиком уходят в архив или в шредер.

С логами то же самое:

  • удалять старое дёшево, если оно лежит отдельно. Удалить индекс целиком мгновенно. Удалить из огромного индекса записи старше 30 дней значит перебрать и пометить удалёнными миллионы документов;
  • шарды не должны расти бесконечно. Размер шарда 10-50 ГБ, а логи за год весят терабайты;
  • свежие и старые данные живут по-разному. Свежие ищут постоянно, их держат на быстрых дисках. Старые нужны раз в месяц, их можно перенести на дешёвые.

Раньше индексы называли по дате руками: logs-2026.06.30, logs-2026.07.01. Сейчас для этого есть data streams.

Data stream

Data stream это одно имя, например logs-nginx.access-default, за которым стоят скрытые индексы по времени. Их называют backing-индексами: .ds-logs-nginx.access-default-2026.07.01-000001, потом ...-000002. Запись всегда идёт в последний, поиск идёт по всем сразу.

У data stream три правила:

  • у каждого документа обязательно поле @timestamp;
  • документы только добавляются: PUT с _id и обычное обновление запрещены. Исправлять логи задним числом нельзя, и это правильно;
  • data stream создаётся по шаблону индекса с разделом "data_stream": {}. Подробно о шаблонах в уроке 16.

Имена устроены по схеме тип-набор-пространство: logs-nginx.access-default, logs-gonets.app-production, metrics-system.cpu-default. Это соглашение Elastic, и Kibana по нему понимает, что в индексе.

урок из курса

Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.