Ребалансировка#
Введение#
Если в кластер добавился новый серверный узел или старый узел вышел из него, происходит PME (Partition Map Exchange) — процесс обмена информацией между узлами об актуальном состоянии партиций. В результате выполнения PME начинается ребалансировка — процесс перераспределения основных (primary) и резервных (backup) партиций по всем узлам в новой топологии кластера. DataGrid реализован так, чтобы минимальное количество данных подверглось ребалансировке при вводе или выводе узла из кластера.
Если серверный узел покидает кластер и в конфигурации кеша не настроено количество резервных (backup) партиций, данные этого узла будут утеряны. Если резервные копии настроены, при выходе узла одна из них становится основной (primary) партицией, и запускается процесс ребалансировки данных.
Процесс ребалансировки происходит при изменении количества серверных узлов в кластере. В in-memory-кластерах ребалансировка по умолчанию начинается, когда узел покидает кластер или присоединяется к нему (то есть когда меняется базовая топология). В persistence-кластерах по умолчанию базовую топологию можно изменить только вручную. Чтобы автоматически менять базовую топологию, подключите для нее автоматическую настройку.
DataGrid поддерживает два режима ребалансировки, которые настраиваются в конфигурации кластера:
Полная ребалансировка — режим, который перемещает партиции между узлами в кластере целиком, а не в виде дельты изменений, как при исторической ребалансировке.
Историческая ребаланcировка — режим, который поддерживается для кластеров с Native Persistence. Он нужен для случаев, когда узлы покидают кластер на короткое время и на диске хранится большой объем данных. С исторической ребалансировкой партиция получает только дельту изменений, которые произошли, пока ее узел был оффлайн. Подробнее об этом написано в разделе «Историческая ребалансировка».
Настройка режима ребалансировки#
В DataGrid можно настроить синхронную и асинхронную ребалансировку или отключить ее полностью. В синхронном режиме выполнение ребалансировки блокирует каждую операцию над кешами. В асинхронном режиме процесс ребалансировки выполняется асинхронно. Выполнение ребалансировки данных можно отключить для конкретного кеша.
Чтобы изменить режим ребалансировки данных, установите одно из значений в настройках кеша:
SYNC— синхронный режим. Каждый вызов кеша через публичный API блокируется до окончания ребалансировки данных.ASYNC— асинхронный режим (выбран по умолчанию). Распределенные кеши доступны во время ребалансировки и в фоновом режиме загружают нужные данные с других узлов кластера.NONE— режим без ребалансировки данных. Кеши явно заполняются или загружаются по требованию из постоянного хранилища, когда данные доступны.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
<property name="cacheConfiguration">
<list>
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="mycache"/>
<!-- Подключите режим синхронной ребалансировки данных. -->
<property name="rebalanceMode" value="SYNC"/>
</bean>
</list>
</property>
</bean>
</beans>
IgniteConfiguration cfg = new IgniteConfiguration();
CacheConfiguration cacheCfg = new CacheConfiguration("mycache");
cacheCfg.setRebalanceMode(CacheRebalanceMode.SYNC);
// Запустите узел.
Ignite ignite = Ignition.start(cfg);
IgniteConfiguration cfg = new IgniteConfiguration
{
CacheConfiguration = new[]
{
new CacheConfiguration
{
Name = "mycache",
RebalanceMode = CacheRebalanceMode.Sync
}
}
};
// Запустите узел.
var ignite = Ignition.Start(cfg);
Настройка пула потоков ребалансировки данных#
По умолчанию ребалансировка данных выполняется в одном потоке на каждом узле. Это значит, что в каждый момент времени используется только один поток для передачи batches из одного узла в другой или для обработки batches, которые поступают из удаленного узла.
Можно увеличить количество потоков, которые берутся из системного пула и используются для ребалансировки. Системный поток берется из пула каждый раз, когда:
один узел должен отправить batch данных на другой (удаленный) узел;
узлу нужно обработать batch данных, который поступил из другого (удаленного) узла.
После обработки batch данных поток останавливается.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
<property name="rebalanceThreadPoolSize" value="4"/>
</bean>
</beans>
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setRebalanceThreadPoolSize(4);
// Запустите узел.
Ignite ignite = Ignition.start(cfg);
Внимание
Пул системных потоков широко используется во всех операциях, которые связаны с SQL-движком, кешем (put, get и так далее) и другими модулями. Если увеличить размер пула потоков, которые используются для ребалансировки данных, его производительность может значительно повыситься, а пропускная способность — понизиться.
Настройка замедления сообщений о ребалансировке (throttling)#
При передаче данных с одного узла на другой весь объем делится на batches, каждый из которых отправляется отдельным сообщением. Размер batch и интервал времени, которое узел ждет между сообщениями, можно настроить.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
<!-- Установите размер batch. -->
<property name="rebalanceBatchSize" value="#{2 * 1024 * 1024}"/>
<!-- Установите количество batches, которые питающий узел создаст в начале процесса ребалансировки. -->
<property name="rebalanceBatchesPrefetchCount" value="3"/>
<!-- Установите интервал между сообщениями о ребалансировке. -->
<property name="rebalanceThrottle" value="100"/>
</bean>
</beans>
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setRebalanceBatchSize(2 * 1024 * 1024);
cfg.setRebalanceBatchesPrefetchCount(3);
cfg.setRebalanceThrottle(100);
// Запустите узел.
Ignite ignite = Ignition.start(cfg);
IgniteConfiguration cfg = new IgniteConfiguration
{
RebalanceBatchSize = 2 * 1024 * 1024,
RebalanceThrottle = new TimeSpan(0, 0, 0, 0, 100),
RebalanceBatchesPrefetchCount = 3
};
// Запустите узел.
var ignite = Ignition.Start(cfg);
Другие свойства#
В таблице ниже указаны свойства IgniteConfiguration, которые относятся к ребалансировке:
Внимание
rebalanceDelay и относящиеся к нему API не рекомендуются к использованию и будут удалены в ближайших релизах.
Свойство |
Описание |
Значение по умолчанию |
|---|---|---|
|
Размер пула потоков ребалансировки. Ограничение количества потоков, которые используются для ребалансировки |
|
|
Размер одного сообщения о ребалансировке, Кб. Перед отправкой алгоритм ребалансировки делит данные каждого узла на несколько batches |
|
|
Количество batches, которые питающий узел создаст в начале процесса ребалансировки |
|
|
Интервал между сообщениями о ребалансировке |
|
|
Последовательность, по которой должна выполняться ребаланcировка. Значение больше нуля можно установить только для кешей с режимом ребалансировки |
|
|
Тайм-аут для ожидания сообщений о ребалансировке между узлами (в секундах) |
|
|
Важно: свойство не рекомендуется к использованию и будет удалено в ближайших релизах. |
|
Мониторинг процесса ребалансировки#
Отслеживать процесс ребалансировки для конкретных кешей можно с помощью JMX.