Apache Ignite — это высокопроизводительная распределенная база данных с открытым исходным кодом, предназначенная для хранения и распределенной обработки больших объемов данных в кластере узлов. В СберТехе есть команда, которая занимается ее развитием. Мы создали Platform V DataGrid — продукт, основанный на Apache Ignite, с enterprise‑функциональностью.
Я был релиз-менеджером Apache Ignite 2.16.0, вышедшей 25 декабря 2023 года, спустя полгода от предыдущего релиза. Хочу ознакомить с основными разработками этой версии:
дампы кешей;
online CDC;
улучшения SQL-движка на основе Apache Calcite;
оптимизация работы сервисов через тонкий клиент.
Дампы кешей
В Ignite есть снимки (снапшоты) персистентных кешей, которые активно используют пользователи. В этом релизе появился ещё один способ сделать резервную копию пользовательских данных — дамп кеша. Это консистентная копия, записываемая на диск. Представляет собой содержимое кеша в виде последовательно записываемых entry (key, value). В дамп также включена метаинформация о кешах и типах данных.
Основные отличия от снимков:
Поддерживают резидентные (in‑memory) кеши.
Занимают меньше места. Дампы содержат только entry, данные «как есть». Снимки же копируют файлы партиций, в которых помимо данных ещё размещаются внутренние структуры и индексы.
Могут использоваться для офлайн‑обработки данных.
Для создания дампа нужно обратиться к интерфейсу IgniteSnapshot, например:
ignite.snapshot().createDump("dump-name", Arrays.asList("cacheGrp1", "cacheGrp2")).get();
Для чтения дампов Ignite предоставляет утилиту Dump Reader. Пример использования:
// Consumer should be implemented to receive all data stored in cache dump. DumpConsumer cnsmr = new DumpConsumerImpl(..);
DumpReaderConfiguration cfg = new DumpReaderConfiguration(new File("path-to-dump"), cnsmr);
new DumpReader(cfg, log).run();
В DataGrid дополнительно реализованы:
восстановление кешей из дампа,
проверка целостности данных,
поддержка консольной утилиты, JMX, REST.
Online CDC
Начиная с версии 2.12 появилась поддержка CDC. Эта функциональность позволяет получать изменения по данным кеша. Способов его применения много: подсчёт статистики, аудит, стриминг изменений и даже межкластерная репликация. Реализация была основана на обработке WAL-архивов через отдельное приложение, в отдельном процессе. Подробнее можно ознакомиться в статье на Хабре.
Между изменением данных в кеше и его обработкой слушателем CDC существует задержка. Она зависит от конфигурируемых настроек: таймаута принудительного архивирования WAL-сегмента и частоты сканирования директории для обнаружения процессом CDC этого архива. Общая задержка обычно составляла секунды, а то и десятки секунд. Часть пользователей захотели получать события значительно быстрее.
Работа с диском ограничивала эту задержку. Мы пошли дальше и реализовали отправку событий напрямую с узлов кластера. Событие попадает в циклический буфер в памяти, откуда его получает слушатель CDC. Это позволило сократить общую задержку до суб-секундных значений. На случай, когда слушатель не успевает обрабатывать события из памяти, CDC автоматически переключается в дисковый режим, чтобы не потерять данные.
Ignite предоставляет интерфейс CdcManager для сбора событий. В DataGrid мы сделали реализацию с буфером, которая позволяет использовать с новым режимом те же слушатели, что и в дисковом режиме. А также настроить межкластерную репликацию с задержкой менее секунды.
Улучшения SQL-движка на основе Apache Calcite
Новый SQL-движок на основе Apache Calcite теперь полностью покрыт существующими метриками и SQL-событиями. С этого релиза его поддерживает утилита сбора статистики производительности. Кроме того, в отчёт этой утилиты теперь выводится план запроса и некоторые его свойства. Это позволяет выявлять узкие места на больших нагрузках.
Добавлена поддержка новых хинтов, чтобы помочь оптимизатору сделать более рациональные оптимизации или составить более быстрый план запроса:
FORCE_INDEX / NO_INDEX — управляет сканированием индексов.
ENFORCE_JOIN_ORDER — управляет порядком join в запросе.
Новый движок становится более стабильным — в этом релизе более десятка исправлений по производительности и багам.
Оптимизация работы сервисов через тонкий клиент
Напомню, что Ignite — это ещё и платформа для микросервисов. Я нашёл две хорошие статьи про это: раз и два.
В этом релизе обновления затрагивают тонкий клиент. Ранее при обращении к сервису запрос отправлялся на случайный узел. Но сервис мог быть не развернут на этом узле. В таком случае запрос перенаправлялся далее, на нужный узел. Это создавало дополнительную сетевую нагрузку и увеличивало задержку. Теперь тонкий клиент знает топологию сервиса и отправляет запросы на нужный узел. Стоит учесть, что топология запрашивается асинхронно, поэтому первые запросы всё ещё могут перенаправляться.
Service Awareness автоматически будет включен при соблюдении двух условий:
включено свойство Partition Awareness в конфигурации тонкого клиента (оно включено по умолчанию);
версия узлов кластера и тонкого клиента 2.16.0 или выше.
Другие улучшения
Релиз содержит исправления для поддержки JDK 14–21 версий.
Реализован Cluster Management API — внутренняя функциональность для объединения управляющих команд. Теперь все существующие команды автоматически синхронизированы между интерфейсами вызова — CLI, JMX. В DataGrid доступен вызов через REST. В планах сделать автоматическую генерацию документации и поддержку
man
для консольной утилиты.Операции с атомарными кешами внутри транзакции теперь окончательно запрещены. Транзакции не дают гарантий на атомарные кеши, такая пользовательская логика могла вводить в заблуждение и приводить к сложно диагностируемым проблемам.
Комьюнити разработчиков решило удалить экспериментальную реализацию MVCC. Режим кеша
TRANSACTIONAL_SNAPSHOT
удалён.Разные типы кешей (atomic, transactional) в пределах одной кеш‑группы теперь недоступны. Для совместимости пока доступно системное свойство для отключения проверки.
Модули ignite‑ml и Cassandra переехали в репозиторий Ignite extensions. Теперь у них свой релизный цикл.
Заключение
В этой статье я рассмотрел только часть изменений, а их больше сотни: оптимизации производительности, повышение надежности и добавление новой функциональности. С полным списком улучшений можно ознакомиться в release notes. Apache Ignite развивается благодаря активному сообществу, к которому можно присоединиться. Для обратной связи можно использовать user‑list.