Кеш-группы#
Каждый кеш в кластере использует его ресурсы: кеш разделен на партиции, состояние которых нужно отслеживать на каждом узле.
При включенном Native Persistence (подробнее о нем написано в подразделе «Персистентность DataGrid» раздела «Настройка Persistence») для каждой партиции на диске создается открытый файл, который DataGrid активно использует для чтения, записи и вычитки данных. Чем больше кешей и партиций:
Тем больше Java Heap занят информацией о распределении партиций (partition map). У каждого кеша есть собственные распределение и карта партиций.
Тем больше времени может потребоваться для присоединения нового узла к кластеру.
Тем больше времени может потребоваться для инициирования ребалансировки, если узел покинет кластер.
Тем больше файлов партиций остаются открытыми и тем хуже может стать производительность процесса копирования «грязных» страниц из оперативной памяти в файлы партиций на диске (процесс checkpointing). «Грязная» страница — страница, которая обновилась в оперативной памяти, но не записалась в соответствующий файл партиций (обновление было добавлено только в WAL). Подробнее о процессе checkpointing написано в подразделе «Персистентность DataGrid» раздела «Настройка Persistence».
Внимание
При развертывании кластера с несколькими сотнями кешей эти проблемы не будут заметны. Но если в кластере тысячи кешей, эти проблемы могут повлиять на его работу.
Чтобы снизить вероятность возникновения таких проблем при большом количестве кешей, используйте кеш-группы. У кешей в одной группе одинаковые внутренние структуры, например карты партиций. Кеш-группы ускоряют обработку событий топологии и снижают общее использование памяти. С точки зрения API нет разницы, является ли кеш частью группы или нет.
Чтобы объединить кеши в группы, установите свойство groupName в CacheConfiguration.
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="cacheConfiguration">
<list>
<!-- Партицированный кеш для данных `Person`. -->
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="Person"/>
<property name="backups" value="1"/>
<!-- Создание кеш-группы. -->
<property name="groupName" value="group1"/>
</bean>
<!-- Партицированный кеш для данных `Organization`. -->
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="Organization"/>
<property name="backups" value="1"/>
<!-- Создание кеш-группы. -->
<property name="groupName" value="group1"/>
</bean>
</list>
</property>
</bean>
// Определение конфигурации кластера.
IgniteConfiguration cfg = new IgniteConfiguration();
// Определение конфигурации кеша `Person`.
CacheConfiguration<Integer, Person> personCfg = new CacheConfiguration<Integer, Person>("Person");
personCfg.setBackups(1);
// Создание кеш-группы.
personCfg.setGroupName("group1");
// Определение конфигурации кеша `Organization`.
CacheConfiguration orgCfg = new CacheConfiguration("Organization");
orgCfg.setBackups(1);
// Создание кеш-группы.
orgCfg.setGroupName("group1");
cfg.setCacheConfiguration(personCfg, orgCfg);
// Запуск узла.
Ignition.start(cfg);
var cfg = new IgniteConfiguration
{
CacheConfiguration = new[]
{
new CacheConfiguration
{
Name = "Person",
Backups = 1,
GroupName = "group1"
},
new CacheConfiguration
{
Name = "Organization",
Backups = 1,
GroupName = "group1"
}
}
};
Ignition.Start(cfg);
В примере выше кеши Person и Organization принадлежат кеш-группе group1.
Как различаются пары «ключ-значение»?
Если кеш назначается в кеш-группу, его данные хранятся в общих для всех кешей группы структурах партиции. При добавлении в кеш каждый ключ получает уникальный идентификатор кеша, которому он принадлежит. Идентификатор автоматически формируется из названия кеша; это позволяет хранить данные разных кешей в одних и тех же партициях и структурах B+ дерева.
Главный аргумент для использования группировки: при создании группы из 1000 кешей понадобится в 1000 раз меньше внутренних структур для хранения данных, карт и открытых файлов партиций.
Нужно ли постоянно использовать кеш-группы?
У кеш-групп много преимуществ, но они также могут повлиять на производительность поиска индексов и операций чтения. Все данные и индексы перемешиваются в общих структурах данных (картах партиций и структурах B+ дерева), и операции запроса данных требуют больше времени.
Один из возможных сценариев — использовать кеш-группы для кластеров из десятков или сотен узлов и большим числом кешей, если в них обнаружено:
увеличение использования Java Heap внутренними структурами;
падение производительности операций
checkpointing;медленное присоединение узла к кластеру.