Руководство по системному администрированию#

Термины и определения#

Термин/Аббревиатура

Определение

JDBC

Java Database Connectivity, платформенно независимый промышленный стандарт взаимодействия Java-приложений с различными СУБД

JDK

Java Development Kit, комплект разработчика приложений на языке Java

JMX

Java Management Extensions, управленческие расширения Java

JVM

Java Virtual Machine, виртуальная машина Java

LFS

Local File System, локальная файловая система

PDS

Persistent Data Store, постоянное хранилище данных

SPI

Service Programming Interface, программный интерфейс сервиса

LFS

Local File System, локальная файловая система

WAL

Write-Ahead Logging, журнал предзаписи

КУ

Клиентский узел

ОС

Операционная система

СУ

Серверный узел

УЗ

Учетная запись

УЦ

Удостоверяющий центр

WAL (Write-Ahead Logging) — журнал предзаписи.

Сценарии администрирования#

Резервное копирование и восстановление в Platform V DataGrid#

Существующие ограничения#

С существующими ограничениями можно ознакомиться в подразделе «Ограничения» раздела «Безопасность данных» документа «Руководство по безопасному использованию».

Создание полной резервной копии (снепшота)#

Благодаря использованию Persistence, Platform V DataGrid позволяет создавать резервные копии (снепшоты). Резервная копия Ignite включает в себя согласованную копию всех данных кластера, сохраненных на диске.

Структура резервной копии схожа со структурой директории постоянного хранилища с некоторыми исключениями. На рисунке ниже приведен пример такой структуры:

Structure

  • снепшот находится в директории work\snapshots и называется backup23012020, где work – рабочая директория Ignite;

  • снепшот создается для кластера с тремя узлами. При этом, все узлы запускаются на одной машине. В данном примере узлы называются node1, node2 и node3, однако на практике названия узлов эквивалентны согласованным ID узлов;

  • снепшот содержит в себе копию кеша my-sample-cache;

  • в файлах part-N.bin и cache_data.dat директории db содержится копия записей данных. Процессы упреждающей журнализации и создания контрольных точек не включены в снепшот, поскольку это не требуется для корректной работы имеющейся процедуры восстановления;

  • директории binary_meta и marshaller хранят информацию, относящуюся к метаданным и marshaller.

Внимание

Создаваемый снепшот должен иметь уникальное имя. В случае попытки создания снепшота с именем, которое уже использовалось ранее, Ignite выдаст следующую ошибку:

Cluster-wide snapshot operation failed:
class org.apache.ignite.IgniteException: Create snapshot request has been rejected. Snapshot with given name already exists on local node.
Конфигурация директории хранения резервной копии (снепшота)#

По умолчанию, сегмент снепшота сохраняется в рабочей директории соответствующего узла Platform V DataGrid и использует то же пространство, в котором хранятся данные, индексы, WAL-журнал и другие файлы Persistence.

Примечание

Поскольку снепшот может потреблять столько же пространства на диске, сколько занимают файлы Ignite Persistence, и снижать производительность приложения за счет использования I/O жесткого диска совместно с рутинными задачами Ignite Persistence, рекомендуется хранить снепшот и файлы Persistence на разных дисках.

Чтобы избежать неравномерного распределения нагрузки между Persistence и механизмом резервного копирования (создания снепшотов), необходимо либо изменить директорию для файлов Persistence, либо сконфигурировать директорию хранения резервной копии (снепшота), как показано ниже:

XML

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
   <!--
      Sets a path to the root directory where snapshot files will be persisted.
      By default, the `snapshots` directory is placed under the `IGNITE_HOME/db`.
   -->
   <property name="snapshotPath" value="/snapshots"/>
   <property name="cacheConfiguration">
       <bean class="org.apache.ignite.configuration.CacheConfiguration">
           <property name="name" value="snapshot-cache"/>
       </bean>
   </property>

</bean>

Java

IgniteConfiguration cfg = new IgniteConfiguration();

File exSnpDir = U.resolveWorkDirectory(U.defaultWorkDirectory(), "ex_snapshots", true);

cfg.setSnapshotPath(exSnpDir.getAbsolutePath());
Создание резервной копии (снепшота)#

Для создания резервных копий в поставку Platform V DataGrid входят следующие интерфейсы:

  • утилита control.sh;

  • JMX;

  • Java API.

При создании снепшота, в директории $IGNITE_HOME/work/db/.../snp создаются файлы партиций с грязными страницами. Каждый такой файл партиции будет иметь расширение .delta.

Пример

part-467.bin.delta

После успешного завершения операции по созданию снепшота данные файлы будут автоматически применены к созданному снепшоту и удалены.

Отображение начала и окончания процесса создания снепшота в логах Platform V DataGrid#

В момент запуска операции создания снепшота в журналах Platform V DataGrid появляется следующая запись:

[IgniteSnapshotManager] Cluster-wide snapshot operation started [snpName=MySnapshot, grps=[1794698200]]

где:

  • snpName – имя снепшота;

  • grps – список кеш-групп в снепшоте.

Когда операция создания снепшота завершается, в логах появляется следующая запись:

[IgniteSnapshotManager] Cluster-wide snapshot operation finished successfully: SnapshotOperationRequest [rqId=1a24fa7d-4e50-4714-ae68-959892c6d5a3, srcNodeId=b7b71afb-32c5-4730-b0dc-5090920cf4f0, snpName=MySnapshot, grpIds=ArrayList [1794698200], bltNodes=HashSet [b7b71afb-32c5-4730-b0dc-5090920cf4f0], err=null]
Использование утилиты control.sh#

Утилита администрирования control.sh поддерживает следующие команды для управления резервными копиями (снепшотами):

#Create a cluster snapshot:
control.(sh|bat) --snapshot create snapshot_name

#Cancel a running snapshot:
control.(sh|bat) --snapshot cancel snapshot_name

#Kill a running snapshot:
control.(sh|bat) --kill SNAPSHOT snapshot_name

Примечание:

Команды --snapshot cancel и --kill SNAPSHOT ничем не отличаются и используют один и тот же API.

Использование интерфейса JMX#

Для проведения операций, связанных с созданием резервных копий через интерфейс JMX, используйте SnapshotMXBean:

Метод

Описание

createSnapshot(String snpName)

Создать снепшот

cancelSnapshot(String snpName)

Отменить создание снепшота на узле-инициаторе этой операции

Использование Java API#

Создать снепшот также можно и из кода, используя Java API:

CacheConfiguration<Long, String> ccfg = new CacheConfiguration<Long, String>("snapshot-cache");

try (IgniteCache<Long, String> cache = ignite.getOrCreateCache(ccfg)) {
    cache.put(1, "Maxim");

    // Start snapshot operation.
    ignite.snapshot().createSnapshot("snapshot_02092020").get();
}
finally {
    ignite.destroyCache(ccfg);
}

Восстановление из резервной копии (снепшота)#

Восстановление из снепшота происходит на остановленном кластере и состоит из копирования на каждом узле кластера данных из директории снепшота в рабочую директорию. Текущие данные при этом удаляются или копируются в резервную директорию.

На схеме ниже продемонстрирован алгоритм работы процесса восстановления из снепшота:

SnapshotRecovery

Примечание

Скрипт запуска восстановления и набор скриптов (playbook), позволяющий управлять процедурой восстановления, находятся на каждом узле и поставляются с релизом.

Ручное восстановление из снепшота#

Для ручного восстановления из снепшота выполните следующие действия:

  1. Остановите работу кластера, который нужно восстановить.

  2. Удалите все данные из директории контрольной точки $IGNITE_HOME/work/cp (данные Persistence и прочие данные).

  3. На каждом узле выполните следующие действия:

    • удалите все файлы, относящиеся к {nodeId} из директории $IGNITE_HOME/work/db/binary_meta.

    • удалите все файлы, относящиеся к {node_id} из директории $IGNITE_HOME/work/db/marshaller.

    • удалите все файлы и субдиректории, принадлежащие к узлу с {nodeId} в директории $IGNITE_HOME/work/db. Очистите директорию db/{nodeId} отдельно, если она отсутствует в директории work.

    • скопируйте файлы, относящиеся к узлу с {node_id}, из снепшота в директорию $IGNITE_HOME/work/. Если директория db/{node_id} не находится в директории work, скопируйте файлы с данными туда.

  4. Перезапустите кластер.

Восстановление кластера из снепшота кластера с другой топологией#

При возникновении ситуации неожиданного выхода кластера из строя (например, при сбоях) может потребоваться его восстановление. Однако топологии кластеров могут отличаться, равно как и топологии снепшотов этих кластеров. Таблица ниже описывает ситуации, когда нужно создать снепшот кластера с количеством узлов N и восстановить кластер с количеством узлов M:

Условие

Описание

N == M

Рекомендованный случай. Создание и использование снепшота на кластерах с похожей топологией

N < M

Запуск первых N узлов кластера с M узлов и применение снепшота. Далее необходимо добавить остальные узлы кластера с M узлов в топологию и дождаться окончания ребалансировки данных и обновления индексов

N > M

Не поддерживается

Восстановление кластера Ignite из резервной копии с использованием скрипта восстановления snapshot_restore.sh#

Для запуска процесса восстановления кластера из резервной копии используйте скрипт snapshot_restore.sh. Он использует следующие переменные:

  • storagePath – путь к каталогу с данными на хосте;

  • snapshotName – имя снепшота;

  • snapshotPath – путь к каталогу, в котором хранится снепшот.

Ниже приведен пример запуска скрипта восстановления:

    $ snapshot_restore.sh --workPath="/ignite/server/work" --storagePath="/ignite/server/data"--snapshotName="snapshot_simple_1" --snapshotPath="/ignite/server/work/snapshots"

Перед запуском скрипта необходимо задать переменные с путем к каталогу, в котором хранится снепшот, а также с путем к LFS.

Примечание

Вы также можете передавать переменные скрипту при запуске с помощью следующих аргументов:

  • snapname – имя снепшота;

  • snapfullpath – путь к каталогу, в котором хранится снепшот;

  • IGNITE_DATA;

  • IGNITE_WORK;

  • IGNITE_HOME.

Playbook для управления процессом восстановления#

Playbook — это набор скриптов для управления восстановлением из резервной копии. В playbook также содержатся метаданные, необходимые для его исполнения.

Для запуска playbook предварительно заполните файл hosts, в котором заданы хосты кластера.

hosts
[srv_hosts]
1.1.1.1
2.2.2.2
3.3.3.3
....
n.n.n.n

Для запуска передайте следующие переменные:

Имя переменной

Описание

ignite_se_instance_home:

$IGNITE_HOME сервера

ignite_se_data_dir:

(опция) Если LFS вынесен из db

ignite_se_work_dir:

$IGNITE_WORK сервера

ignite_se_snapshot_name:

Имя снепшота для восстановления

ignite_se_snapshot_dir:

(опция) По умолчанию определяется как $IGNITE_WORK/snapshots

ignite_se_backup_lfs: "true"

(опция) если требуется сохранять LFS перед восстановлением из снепшота

ignite_se_backup_dir:

(опция) По умолчанию пишется в $IGNITE_HOME/backup

Переменные передаются как extravars:

$ ansible-playbook playbooks/restore_snapshots.yml -i ./hosts -e "run_on=srv_hosts ignite_se_instance_home='/ignite/server/' ignite_se_data_dir='/ignite/server/data' ignite_se_work_dir='/ignite/server/work' ignite_se_snapshot_dir='/ignite/server/work/snapshots' ignite_se_snapshot_name='snapshot_simple_1'"

Постоянное хранилище данных (Persistent Data Store)#

Подробную информацию о постоянном хранилище данных можно найти в документе «Детальная архитектура». В настоящем документе приводится описание включения и конфигурации хранилища.

Включение постоянного хранилища данных#

Native Persistence конфигурируется отдельно для каждого региона данных.

Чтобы включить постоянное хранилище данных, установите значение true для свойства persistenceEnabled в файле конфигурации региона данных.

Примечание

Регионы данных могут одновременно храниться и в ОЗУ (in-memory data regions), и в постоянном хранилище (data regions with persistence).

Пример ниже показывает, как можно включить постоянное хранилище для стандартного региона данных.

XML

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="dataStorageConfiguration">
        <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
            <property name="defaultDataRegionConfiguration">
                <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                    <property name="persistenceEnabled" value="true"/>
                </bean>
            </property>
        </bean>
    </property>
</bean>

Java

IgniteConfiguration cfg = new IgniteConfiguration();
 
//data storage configuration
DataStorageConfiguration storageCfg = new DataStorageConfiguration();
 
storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);
 
 
cfg.setDataStorageConfiguration(storageCfg);
 
Ignite ignite = Ignition.start(cfg);

C#/.NET

var cfg = new IgniteConfiguration
{
    DataStorageConfiguration = new DataStorageConfiguration
    {
        DefaultDataRegionConfiguration = new DataRegionConfiguration
        {
            Name = "Default_Region",
            PersistenceEnabled = true
        }
    }
};
 
Ignition.Start(cfg);
Конфигурация директории постоянного хранилища данных#

При включенном Persistence узел сохраняет данные пользователей, индексы и WAL-файлы в директории {IGNITE_WORK_DIR}/db. Данная директория считается директорией хранилища. Ее можно изменить, установив свойство storagePath объекта DataStorageConfiguration, как показано ниже.

Каждый узел обслуживает следующие субдиректории хранилища, в котором будут храниться кешированные данные, WAL-файлы, а также файлы архива WAL:

Субдиректория

Описание

{WORK_DIR}/db/{nodeId}

Данная директория содержит кешированные данные и индексы

{WORK_DIR}/db/wal/{nodeId}

Данная директория содержит WAL-файлы

{WORK_DIR}/db/wal/archive/{nodeId}

Данная директория содержит файлы архива WAL

nodeId здесь — это либо согласованный ID узла (consistent node ID), если он определен конфигурацией узла, либо автоматически сгенерированный ID узла. Он используется для обеспечения уникальности директорий для узла.

Примечание

Если несколько узлов используют одну директорию, то в ней создаются субдиректории для каждого из узлов.

Если рабочая директория содержит файлы постоянного хранения для нескольких узлов (т. е. существует несколько субдиректорий {nodeId} с разными ID узлов), то узел выбирает первую неиспользуемую субдиректорию.

Внимание

Чтобы убедиться в том, что узел всегда использует определенную субдиректорию и, следовательно, определенные партиции данных даже после его перезагрузки, установите в конфигурации узла уникальное для кластера значение метода IgniteConfiguration.setConsistentId.

Директорию можно изменить следующим образом:

XML

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="dataStorageConfiguration">
        <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
            <property name="defaultDataRegionConfiguration">
                <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                    <property name="persistenceEnabled" value="true"/>
                </bean>
            </property>
            <property name="storagePath" value="/opt/storage"/>
        </bean>
    </property>
</bean>

Java

IgniteConfiguration cfg = new IgniteConfiguration();

//data storage configuration
DataStorageConfiguration storageCfg = new DataStorageConfiguration();

storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);

storageCfg.setStoragePath("/opt/storage");

cfg.setDataStorageConfiguration(storageCfg);

Ignite ignite = Ignition.start(cfg);

C#/.NET

var cfg = new IgniteConfiguration
{
    DataStorageConfiguration = new DataStorageConfiguration
    {
        StoragePath = "/ssd/storage",

        DefaultDataRegionConfiguration = new DataRegionConfiguration
        {
            Name = "Default_Region",
            PersistenceEnabled = true
        }
    }
};

Ignition.Start(cfg);
Конфигурация#

В таблице ниже перечислены некоторые свойства класса DataStorageConfiguration.

Свойство

Описание

Значение по умолчанию

maxWalArchiveSize

Максимальный размер архива WAL-журнала в файловой системе в байтах

Размер буфера контрольных точек (checkpointing buffer) * 4

persistenceEnabled

Для включения Native Persistence установите значение true

false

storagePath

Путь, по которому хранятся данные

${IGNITE_HOME}/work/db/node{IDX}-{UUID}

walArchivePath

Путь к архиву WAL-журнала

${IGNITE_HOME}/work/db/wal/archive/

walCompactionEnabled

Для включения сжатия архива WAL-журнала установите значение true

false

walCompactionLevel

Уровень сжатия архива WAL-журнала. 1 — самое быстрое сжатие, 9 — лучшее сжатие

1

walMode

Режим работы WAL-журнала

LOG_ONLY

walPath

Путь к директории, в которой хранятся активные сегменты WAL-журнала

${IGNITE_HOME}/work/db/wal/

walSegmentSize

Размер файла сегмента WAL-журнала в байтах

64MB

WAL-журнал#

Подробнее о WAL-журнале вы можете прочитать в документе «Детальная архитектура». В этом документе приведены только примеры конфигурации.

Изменение размера сегмента WAL-журнала#

Для изменения размера сегмента WAL-журнала выполните следующий код:

XML

<bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">

    <property name="dataStorageConfiguration">
        <bean class="org.apache.ignite.configuration.DataStorageConfiguration">

            <!-- set the size of wal segments to 128MB -->
            <property name="walSegmentSize" value="#{128 * 1024 * 1024}"/>

            <property name="defaultDataRegionConfiguration">
                <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                    <property name="persistenceEnabled" value="true"/>
                </bean>
            </property>

        </bean>
    </property>
</bean>

Java

IgniteConfiguration cfg = new IgniteConfiguration();
DataStorageConfiguration storageCfg = new DataStorageConfiguration();
storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);

storageCfg.setWalSegmentSize(128 * 1024 * 1024);

cfg.setDataStorageConfiguration(storageCfg);

 Ignite ignite = Ignition.start(cfg);
Отключение WAL-журнала#

Java

IgniteConfiguration cfg = new IgniteConfiguration();
DataStorageConfiguration storageCfg = new DataStorageConfiguration();
storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);

cfg.setDataStorageConfiguration(storageCfg);

 Ignite ignite = Ignition.start(cfg);

ignite.cluster().state(ClusterState.ACTIVE);

String cacheName = "myCache";

ignite.getOrCreateCache(cacheName);

ignite.cluster().disableWal(cacheName);

//load data
ignite.cluster().enableWal(cacheName);

C#/.NET

var cacheName = "myCache";
var ignite = Ignition.Start();
ignite.GetCluster().DisableWal(cacheName);
    //load data

ignite.GetCluster().EnableWal(cacheName);

SQL

ALTER TABLE Person NOLOGGING

//...

ALTER TABLE Person LOGGING
Сжатие записей WAL-журнала#

Java

IgniteConfiguration cfg = new IgniteConfiguration();

DataStorageConfiguration dsCfg = new DataStorageConfiguration();
dsCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);

//WAL page compression parameters
dsCfg.setWalPageCompression(DiskPageCompression.LZ4);
dsCfg.setWalPageCompressionLevel(8);

cfg.setDataStorageConfiguration(dsCfg);
Ignite ignite = Ignition.start(cfg);
Отключение архива WAL-журнала#

Для отключения архивирования укажите одно и то же значение как для walPath, так и для walArchivePath. В этом случае Platform V DataGrid не копирует сегменты в архив. Вместо этого он создает новые сегменты в папке WAL-журнала, а старые сегменты удаляются по мере роста самого WAL-журнала. Этот рост зависит от настроек размера архива WAL-журнала.

Безопасность и аудит#

Плагин безопасности для Platform V DataGrid#

Сокращения#
  • КУ — клиентский узел кластера Platform V DataGrid;

  • СУ — серверный узел кластера Platform V DataGrid;

  • ТК — тонкий клиент Platform V DataGrid;

  • УЗ — учетная запись;

  • ИБ — информационная безопасность.

Подготовка сертификатов пользователей#

Описание сертификатов пользователей содержится в разделе «Управление ключами и сертификатами» документа «Руководство по безопасному использованию». Этапы создания сертификата перечислены ниже.

Генерация сертификата#

При генерации сертификата укажите уникальный пароль, удовлетворяющий требованиям ИБ к его составу.

keytool -genkey \
  -alias <Alias> \
  -keystore <FileName>-keystore.jks \
  -keyalg RSA \
  -keysize 2048 \
  -dname "CN=<CN>, OU=00CA, O=Savings Bank of the Russian Federation, C=RU"

где:

  • Alias — псевдоним сертификата в jks-файле;

  • FileName — имя файла сертификата;

  • CN — Значение Common Name.

Пример:

keytool -genkey \
  -alias ntsecuritySgg_server \
  -keystore ntsecuritySgg_server-keystore.jks \
  -keyalg RSA \
  -keysize 2048 \
  -dname "CN=00CA0000Sgg_server@snnode.nt.security.sbrf.ru, OU=00CA, O=Savings Bank of the Russian Federation, C=RU"
Создание запроса на подпись сертификата#
keytool -keystore <FileName>-keystore.jks \
  -alias <Alias> \
  -certreq \
  -file <FileName>-certreq.csr \
  -ext ExtendedkeyUsage=serverAuth,clientAuth

Пример:

keytool -keystore ntsecuritySgg_server-keystore.jks \
  -alias ntsecuritySgg_server \
  -certreq \
  -file ntsecuritySgg_server-certreq.csr \
  -ext ExtendedkeyUsage=serverAuth,clientAuth

Дальнейшие действия совпадают с вышеописанными пунктами.

Создание запроса на подпись сертификата#

Администратор создает запрос на подпись сертификата и прикладывает к нему файл с расширением .csr.

Импорт сертификатов УЦ#

Импортируйте сертификаты УЦ в JKS-хранилище. Этими сертификатами подписаны сертификаты на шаге создания запроса на подпись сретификата (см. раздел "Создание запроса на подпись сертификата). Этот шаг является необходимым для последующего импорта подписанного сертификата, поскольку при импорте keytool проверяет корректность всей цепочки сертификации.

Пример:

keytool -keystore <FileName>-keystore.jks \
  -alias "Test Root CA 2" \
  -import \
  -file "Test Root CA 2.cer"
keytool -keystore <FileName>-keystore.jks \
  -alias "Company Test Issuing CA 2" \
  -import \
  -file "Company Test Issuing CA 2.cer"

Примечание

Сертификаты УЦ обычно приложены к запросу на подпись сертификата.

Импорт подписанного сертификата#

Импортируйте подписанный сертификат в JKS-хранилище:

keytool -keystore <FileName>-keystore.jks \
  -alias <Alias> \
  -import \
  -file <FileName>-certreq.csr_cert.cer
Удаление сертификатов УЦ#

Удалите из jks-хранилища сертификаты УЦ, добавленные при импорте подписанных сертификатов (см. раздел "Импорт подписанного сертификата"). Это необходимо, поскольку текущая реализация менеджера ключей в Platform V DataGrid и плагине использует первый встретившийся сертификат, поэтому он должен быть один.

keytool -keystore <FileName>-keystore.jks \
  -alias "Test Root CA 2" \
  -delete
keytool -keystore <FileName>-keystore.jks \
  -alias "Company Test Issuing CA 2" \
  –delete
Генерация truststore, содержащего сертификаты УЦ#
keytool -keystore truststore.jks \
  -alias "Test Root CA 2" \
  -import \
  -file "Test Root CA 2.cer"
keytool -keystore truststore.jks \
  -alias "Company Test Issuing CA 2" \
  -import \
  -file "Company Test Issuing CA 2.cer"
Проверка корректности созданных сертификатов#
keytool -v --list --keystore <FileName>-keystore.jks | awk '/Owner:|Issuer:|Your keystore contains|Certificate chain length/'

Пример вывода:

Your keystore contains 1 entry
Certificate chain length: 3
Owner: CN=00CA0000Sgg_server@snnode.nt.security.sbrf.ru, OU=00CA, O=Company, C=RU
Issuer: CN=Company Test Issuing CA 2, DC=ca, DC=sbrf, DC=ru
Owner: CN=Company Test Issuing CA 2, DC=ca, DC=sbrf, DC=ru
Issuer: CN=Test Root CA 2
Owner: CN=Test Root CA 2
Issuer: CN=Test Root CA 2

Вывод должен содержать следующую информацию:

  • Your keystore contains 1 entry;

  • Certificate chain length: 3;

  • Issuer: — УЦ компании.

Подготовка сертификатов для утилиты управления пользователями#

Для работы утилиты сгенерируйте сертификат узла, на котором будет запускаться утилита. Данный сертификат имеет следующие особенности:

  • в нем должно быть указано соответствующее DNS-имя данного узла (браузер проверяет FQDN);

  • в CN указывается имя сервера.

В примерах ниже используется сервер grid785.

Генерация сертификата#
keytool -genkey \
  -alias grid785 \
  -keystore grid785-keystore.jks \
  -keyalg RSA \
  -keysize 2048 \
  -dname "CN=grid785.delta.sbrf.ru, OU=00CA, O=Savings Bank of the Russian Federation, C=RU"
Создание запроса на подпись сертификата#
keytool -keystore \
  grid785-keystore.jks \
  -alias grid785 \
  -certreq \
  -file grid785-certreq.csr \
  -ext SAN="dns:grid785.delta.sbrf.ru,dns:grid785" \
  -ext ExtendedkeyUsage=serverAuth

Дальнейшие этапы совпадают с вышеописанными пунктами.

Утилита управления использует аутентификацию клиентов, поэтому создайте копию keystore в формате PKCS12 и импортируйте ее в браузер:

keytool -importkeystore \
  -srckeystore petrov-keystore.jks \
  -destkeystore petrov-keystore.p12 \
  -srcstoretype JKS \
  -deststoretype PKCS12

Импорт копии keystore в браузер выполняется стандартными средствами ОС. Например, для Windows — через контекстное меню файла *.p12.

Конфигурирование серверного узла#
Включение Persistence#

Внимание

Текущая реализация не поддерживает кластеры, хранящие данные только в памяти. В следующих версиях это ограничение может быть снято.

Убедитесь, что режим persistence включен:

<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" primary="true">
    ...
    <property name="dataStorageConfiguration" ref="dataStorage"/>
    ...
</bean>
...
<bean id="dataStorage" class="org.apache.ignite.configuration.DataStorageConfiguration">
    <property name="defaultDataRegionConfiguration">
        <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
            <property name="persistenceEnabled" value="true"/>
        </bean>
    </property>
</bean>
Конфигурирование плагина безопасности#
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" primary="true">
    ...
    <property name="pluginProviders">
        <list>
            <ref bean="securityPlugin"/>
        </list>
    </property>
    ...
</bean>
...
<bean id="creds" class="org.apache.ignite.plugin.security.SecurityCredentials">
    <!-- При наличии интеграции с Конфигуратором использовать value="${SecurityPluginConfiguration.nodeLogin}" -->
    <constructor-arg value="serverNode"/>
    <!-- При наличии интеграции с Конфигуратором использовать value="${SecurityPluginConfiguration.nodePassword}" -->
    <constructor-arg value="default-password"/>
</bean>

<bean id="credentialsProvider" class="org.apache.ignite.plugin.security.SecurityCredentialsBasicProvider">
    <constructor-arg ref="creds"/>
</bean>

<bean id="dataProvider" class="com.sbt.security.ignite.core.storage.metastorage.MetaStorageSecurityDataProvider">
    <constructor-arg>
        <bean class="com.sbt.security.ignite.core.storage.metastorage.DefaultSecurityDataSupplierImpl">
            <constructor-arg ref="credentialsProvider"/>
            <constructor-arg>
                <bean class="com.sbt.security.ignite.core.storage.metastorage.JsonSecurityDataSupplierImpl"/>
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>

    <bean id="evtRecorder" class="com.sbt.security.ignite.core.events.EventRecorderImpl" />

<util:list id="components" value-type="SecurityLifecycleAware">
        <ref bean="evtRecorder"/>
        . . .
</util:list>

<bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">
    <property name="securityDataProvider" ref="dataProvider"/>

    <property name="authenticator">
        <bean class="com.sbt.security.ignite.core.authenticator.TwoFactorSecurityAuthenticatorImpl">
            <constructor-arg ref="dataProvider"/>
        </bean>
    </property>

    <property name="authorizer">
        <bean class="com.sbt.security.ignite.core.authorizer.SecurityAuthorizerImpl">
            <constructor-arg ref="dataProvider"/>
        </bean>
    </property>

    <property name="securityCredentialsProvider" ref="credentialsProvider"/>

    <property name="selfKeyStorePath" value="/path/to/serverNode-key-and-certificate.jks"/>

    <!-- При наличии интеграции с Конфигуратором необходимо использовать value="${SecurityPluginConfiguration.selfKeyStorePwd}" -->
    <property name="selfKeyStorePassword" value="123456"/>

    <property name="components" ref="components"/>
</bean>

<bean id="securityPlugin" class="com.sbt.security.ignite.core.SecurityPluginProvider">
    <constructor-arg ref="securityPluginConfiguration"/>
</bean>
Настройка TLS#

Для протоколов, по которым узлы Platform V DataGrid обмениваются данными между собой (discovery, communication), используется TLS без шифрования. Соответствующие наборы шифров (в названиях присутствует фрагмент WITH_NULL) по умолчанию отключены в JVM. Чтобы избежать плохо диагностируемых ошибок при TLS handshake, включите эти шифры явно: уберите значение NULL из параметра jdk.tls.disabledAlgorithms файла lib/security/java.security в JRE. Переход на TLS с шифрованием возможен, но повлечет существенное падение производительности, что в большинстве случаев неприемлемо.

<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" primary="true">
    ...
    <property name="sslContextFactory" ref="nullSslContextFactory"/>
    <property name="connectorConfiguration" ref="connectorConfiguration"/>
    <property name="clientConnectorConfiguration" ref="clientConnectorConfiguration"/>
    ...
</bean>
...
<!-- Настройка подключений GridClient -->
<bean id="connectorConfiguration" class="org.apache.ignite.configuration.ConnectorConfiguration">
    <property name="idleTimeout" value="180000"/>
    <property name="sslEnabled" value="true"/>
    <property name="sslClientAuth" value="true"/>
    <property name="sslFactory" ref="sslContextFactory"/>
</bean>

<!-- Настройка подключений IgniteClient и JDBC -->
<bean id="clientConnectorConfiguration" class="org.apache.ignite.configuration.ClientConnectorConfiguration">
    <property name="useIgniteSslContextFactory" value="false"/>
    <property name="sslEnabled" value="true"/>
    <property name="sslClientAuth" value="true"/>
    <property name="sslContextFactory" ref="sslContextFactory"/>
</bean>

<!-- TLS без шифрования -->
<bean id="nullSslContextFactory" class="org.apache.ignite.ssl.SslContextFactory">
    <property name="keyStoreFilePath" value="/path/to/serverNode-key-and-certificate.jks"/>
    <!-- При наличии интеграции с Конфигуратором использовать value="${SslContextFactory.keyStorePassword}" -->
    <property name="keyStorePassword" value="123456"/>
    <property name="trustStoreFilePath" value="/path/to/Sberbank-CA-truststore.jks"/>
    <!-- При наличии интеграции с Конфигуратором использовать value="${SslContextFactory.trustStorePassword}" -->
    <property name="trustStorePassword" value="123456"/>
    <property name="cipherSuites"
              value="TLS_RSA_WITH_NULL_SHA256, TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLS_ECDH_RSA_WITH_NULL_SHA"/>
</bean>

<!-- TLS с шифрованием -->
<bean id="sslContextFactory" class="org.apache.ignite.ssl.SslContextFactory">
    <property name="keyStoreFilePath" value="/path/to/serverNode-key-and-certificate.jks"/>
    <!-- При наличии интеграции с Конфигуратором использовать value="${SslContextFactory.keyStorePassword}" -->
    <property name="keyStorePassword" value="123456"/>
    <property name="trustStoreFilePath" value="/path/to/Sberbank-CA-truststore.jks"/>
    <!-- При наличии интеграции с Конфигуратором использовать value="${SslContextFactory.trustStorePassword}" -->
    <property name="trustStorePassword" value="123456"/>
    <property name="trustManagers" ref="trustManager"/>
</bean>

<!-- Расширенный trust manager -->
<bean id="trustManager" class="com.sbt.security.ignite.core.ssl.ExtendedX509TrustManagerImpl">
    <constructor-arg index="0" ref="evtRecorder"/>
    <constructor-arg index="1" value="/path/to/Sberbank-CA-truststore.jks"/>
    <!-- При наличии интеграции с Конфигуратором использовать value="${SslContextFactory.trustStorePassword}" -->
    <constructor-arg index="2" value="123456"/>
    <constructor-arg index="3" value="JKS"/>
    <constructor-arg index="4" value="PKIX"/>
</bean>
Настройка отправки событий ИБ в систему аудита#

При использовании конфигуратора для системы аудита проверьте актуальность версий библиотек Технологического Ядра. В classpath не должны попадать одинаковые библиотеки разных версий.

С событиями ИБ, отправляемыми в систему аудита, вы можете ознакомиться в соответствующей таблице в разделе «Аудит» документа «Руководство по безопасному использованию».

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util" 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 id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" primary="true">
        ...
        <property name="includeEventTypes" ref="eventTypes"/>
        <property name="localEventListeners" ref="eventListeners"/>
        ...
        <property name="pluginProviders">
            <list>
                ...
                <ref bean="restProcessorPluginProvider"/>
            </list>
        </property>
        ...
        <property name="eventStorageSpi" ref="eventStorageSpi"/>
    </bean>
    ...
    <util:list id="eventTypes" value-type="java.lang.Integer">
        <util:constant static-field="org.apache.ignite.events.EventType.EVT_NODE_JOINED"/>
        <util:constant static-field="org.apache.ignite.events.EventType.EVT_NODE_LEFT"/>
        <util:constant static-field="org.apache.ignite.events.EventType.EVT_NODE_FAILED"/>
        <util:constant static-field="org.apache.ignite.events.EventType.EVT_NODE_VALIDATION_FAILED"/>
        <util:constant static-field="org.apache.ignite.events.EventType.EVT_CACHE_STARTED"/>
        <util:constant static-field="org.apache.ignite.events.EventType.EVT_CACHE_STOPPED"/>
        <util:constant static-field="org.apache.ignite.events.EventType.EVT_CACHE_QUERY_EXECUTED"/>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_AUTHORIZATION_SUCCEEDED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_AUTHORIZATION_FAILED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_AUTHENTICATION_SUCCEEDED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_AUTHENTICATION_FAILED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_CERTIFICATE_EXPIRED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_SECURITY_SUBJECT_CREATED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_SECURITY_SUBJECT_REMOVED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_SECURITY_SUBJECT_OPERATION_UNSUPPORTED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_USER_ROLES_GRANTED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_USER_ROLES_REVOKED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_USER_PASSWORD_UPDATED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_CACHE_PERMISSIONS_GRANTED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_CACHE_PERMISSIONS_REVOKED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_TASK_PERMISSIONS_GRANTED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_TASK_PERMISSIONS_REVOKED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_SERVICE_PERMISSIONS_GRANTED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_SERVICE_PERMISSIONS_REVOKED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_SYSTEM_PERMISSIONS_GRANTED.eventCode()}</value>
        <value>#{T(com.sbt.security.ignite.core.events.SecurityEventType).EVT_SYSTEM_PERMISSIONS_REVOKED.eventCode()}</value>
        <util:constant static-field="com.sbt.security.ignite.integration.audit.EventType.EVT_REST_REQ_SUCCEEDED"/>
        <util:constant static-field="com.sbt.security.ignite.integration.audit.EventType.EVT_REST_REQ_FAILED"/>
        <util:constant static-field="com.sbt.security.ignite.integration.audit.EventType.EVT_REST_REQ_AUTHENTICATION_FAILED"/>
        <util:constant static-field="com.sbt.security.ignite.integration.audit.EventType.EVT_REST_REQ_AUTHORIZATION_FAILED"/>
        <util:constant static-field="com.sbt.security.ignite.integration.audit.EventType.EVT_REST_REQ_ILLEGAL_ARGUMENT"/>
        <util:constant static-field="com.sbt.security.ignite.integration.audit.EventType.EVT_UNEXPECTED_REST_REQ_EXECUTION_STATUS"/>
    </util:list>

    <bean id="auditEventListener" class="com.sbt.security.ignite.integration.audit.AuditEventListenerImpl" >
        <constructor-arg ref="dataProvider"/>
        <!-- Ссылка на существующую в контексте Spring реализацию com.sbt.audit2.AuditClientFactory. -->
        <constructor-arg ref="auditClientFactory"/>
    </bean>

    <util:map id="eventListeners"
              map-class="java.util.HashMap"
              key-type="org.apache.ignite.lang.IgnitePredicate"
              value-type="java.lang.Integer[]">
        <entry key-ref="auditEventListener" value-ref="eventTypes"/>
    </util:map>

    <!-- Ниже - настройка обработки событий от GridClient-подключений. -->

    <util:list id="cmdEventIgnoreList" value-type="java.lang.String">
        <!--Имена команд org.apache.ignite.internal.processors.rest.GridRestCommand,
            запись в аудит для которых вестись не будет -->
        <value>NOOP</value>
    </util:list>

    <bean id="restProcessorConfiguration" class="com.sbt.security.ignite.integration.audit.rest.RestProcessorPluginConfiguration">
        <property name="commandEventIgnoreList" ref="cmdEventIgnoreList"/>
    </bean>

    <bean id="restProcessorPluginProvider" class="com.sbt.security.ignite.integration.audit.rest.RestProcessorPluginProvider">
        <property name="configuration" ref="restProcessorConfiguration"/>
    </bean>

    <bean id="eventsFilter" class="com.sbt.security.ignite.core.events.IgnoreEventsFilter">
        <constructor-arg>
            <list>
                <util:constant static-field="org.apache.ignite.events.EventType.EVT_CACHE_QUERY_EXECUTED"/>
                <util:constant static-field="org.apache.ignite.events.EventType.EVT_QUERY_EXECUTION"/>
            </list>
        </constructor-arg>
    </bean>

    <bean id="eventStorageSpi" class="org.apache.ignite.spi.eventstorage.memory.MemoryEventStorageSpi">
        <property name="filter" ref="eventsFilter"/>
    </bean>
    ...
</beans>
Отключение возможности подключений IgniteClient и JDBC#

Требуется только если кластер не должен принимать подключения IgniteClient или JDBC.
Оба вида клиентских подключений используют одно и то же свойство IgniteConfigurationclientConnectorConfiguration или его устаревший аналог sqlConnectorConfiguration. Для отключения возможности подключений установите оба параметра в null:

<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" primary="true">
    ...
    <property name="clientConnectorConfiguration">
        <null/>
    </property>
    <property name="sqlConnectorConfiguration">
        <null/>
    </property>
    ...
</bean>
Системные свойства JVM#

На СУ обязательно установите следующие системные свойства:

Свойство

Описание

**-DIGNITE_CLUSTER_TYPE=nt**

Тип кластера. Должен быть одинаковым на всех узлах. Этот же тип кластера должен использоваться в CN сертификатов

**-DIGNITE_CLUSTER_NAME=security**

Имя кластера. Должно быть одинаковым на всех узлах. Это же имя кластера должно использоваться в CN сертификатов

**-DIGNITE_MBEANS_DISABLED=true**

Отключает регистрацию Ignite JMX management beans, если их использование не планируется

Помимо соблюдения структуры CN плагин выполняет следующие проверки имени и типа кластера:

  • При попытке входа клиентского или серверного узла Platform V DataGrid в кластер значение cluster_name в его сертификате должно быть равным значению системного свойства IGNITE_CLUSTER_NAME аутентифицирующего узла (следовательно, это свойство обязательно должно быть установлено для успешного запуска плагина).

  • При любой аутентификации значение cluster_type из сертификата аутентифицируемого узла должно быть равным системному свойству IGNITE_CLUSTER_TYPE аутентифицирующего узла. Для сертификатов администраторов эксплуатации (тип ключа — 'A') эту проверку можно отключить отдельным системным свойством: -DSKIP_A_CERT_CLUSTER_TYPE_CHECK=false, чтобы упростить проведение работ на тестовых стендах.

Конфигурирование клиентского узла#
Конфигурирование плагина безопасности#
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" primary="true">    ...    <property name="pluginProviders">        <list>            <ref bean="securityPlugin"/>        </list>    </property>    ...</bean>...<bean id="creds" class="org.apache.ignite.plugin.security.SecurityCredentials">    <!-- При наличии интеграции с Конфигуратором необходимо использовать value="${SecurityPluginConfiguration.nodeLogin}" -->    <constructor-arg value="clientNode"/>    <!-- При наличии интеграции с Конфигуратором необходимо использовать value="${SecurityPluginConfiguration.nodePassword}" -->    <constructor-arg value="default-password"/></bean>
<bean id="credentialsProvider" class="org.apache.ignite.plugin.security.SecurityCredentialsBasicProvider">    <constructor-arg ref="creds"/></bean>
<bean id="dataProvider" class="com.sbt.security.ignite.core.storage.metastorage.MetaStorageSecurityDataProvider"/>
<bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">    <property name="securityDataProvider" ref="dataProvider"/>
    <property name="authenticator">        <bean class="com.sbt.security.ignite.core.authenticator.TwoFactorSecurityAuthenticatorImpl">            <constructor-arg ref="dataProvider"/>        </bean>    </property>
    <property name="authorizer">        <bean class="com.sbt.security.ignite.core.authorizer.SecurityAuthorizerImpl">            <constructor-arg ref="dataProvider"/>        </bean>    </property>
    <property name="securityCredentialsProvider" ref="credentialsProvider"/>
    <property name="selfKeyStorePath" value="/path/to/clientNode-key-and-certificate.jks"/>
    <!-- При наличии интеграции с Конфигуратором необходимо использовать value="${SecurityPluginConfiguration.selfKeyStorePwd}" -->    <property name="selfKeyStorePassword" value="123456"/>

</bean>
<bean id="evtRecorder" class="com.sbt.security.ignite.core.events.EventRecorderImpl" />
<bean id="securityPlugin" class="com.sbt.security.ignite.core.SecurityPluginProvider">    <constructor-arg ref="securityPluginConfiguration"/>    <constructor-arg ref="evtRecorder"/></bean>
Настройка TLS#

В отличие от СУ, на КУ коннекторы для клиентских подключений не используются. Сведения из пункта о включении/отключении шифрования актуальны и для КУ.

<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" primary="true">
    ...
    <property name="sslContextFactory" ref="nullSslContextFactory"/>
    ...
</bean>
...
<!-- TLS без шифрования -->
<bean id="nullSslContextFactory" class="org.apache.ignite.ssl.SslContextFactory">
    <property name="keyStoreFilePath" value="/path/to/clientNode-key-and-certificate.jks"/>
    <!-- При наличии интеграции с Конфигуратором использовать value="${SslContextFactory.keyStorePassword}" -->
    <property name="keyStorePassword" value="123456"/>
    <property name="trustStoreFilePath" value="/path/to/Sberbank-CA-truststore.jks"/>
    <!-- При наличии интеграции с Конфигуратором использовать value="${SslContextFactory.trustStorePassword}" -->
    <property name="trustStorePassword" value="123456"/>
    <property name="cipherSuites"
              value="TLS_RSA_WITH_NULL_SHA256, TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLS_ECDH_RSA_WITH_NULL_SHA"/>
</bean>
Конфигурирование безопасных клиентских подключений#

В плагине безопасности реализована поддержка следующих типов клиентских подключений:

  • Тонкий клиент, реализация для Java IgniteClient client = Ignition.startClient(configuration);.

  • Platform V DataGrid JDBC-driver.

  • GridClient. Он используется для выполнения задач map-reduce, и не имеет прямого доступа к данным кешей.

Для успешного подключения на серверных узлах кластера должны быть настроены коннекторы:

  • ClientConnectorConfiguration — для тонких клиентов и JDBC;

  • ConnectorConfiguration — для GridClient. Подробности настройки содержатся в п. 4.3.

Конфигурирование IgniteClient#

Логин и пароль устанавливаются в ClientConfiguration:

ClientConfiguration cfg = new ClientConfiguration()
    .setUserName("myLogin")
    .setUserPassword("myPassword")
...
Конфигурирование GridClient#

Логин и пароль устанавливаются в GridClientConfiguration:

GridClientConfiguration cfg = new GridClientConfiguration()
    .setSecurityCredentialsProvider(() -> new SecurityCredentials("myLogin", "myPassword"))
...
Конфигурирование JDBC#

Пример создания подключения:

 // Register JDBC driver.
Class.forName("org.apache.ignite.IgniteJdbcDriver");

Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1/?"
    + "sslMode=require"
    + "&user=" + login
    + "&password=" + pwd
    + "&sslClientCertificateKeyStoreUrl=" + keyStorePath
    + "&sslClientCertificateKeyStorePassword=" + keyStorePassword
    + "&sslClientCertificateKeyStoreType=" + "JKS"
    + "&sslTrustCertificateKeyStoreUrl=" + trustStorePath
    + "&sslTrustCertificateKeyStorePassword=" + trustStorePassword
    + "&sslTrustCertificateKeyStoreType=" + "JKS");
Конфигурирование JMX#

Плагин позволяет создать защищенный JMX-сервер. Для подключающегося пользователя компонентами плагина выполняется аутентификация с использованием логина, пароля и клиентского сертификата и авторизация разрешения org.apache.ignite.plugin.security.SecurityPermission.ADMIN_OPS (проверка, является ли он администратором эксплуатации). Если используется защищенный сервер, то следует запретить возможность незащищенного подключения:

  • если для запуска узла используется control.sh, то укажите параметр -nojmx;

  • если узел запускается из Java-кода, то не устанавливайте свойство com.sun.management.jmxremote.

Защита JMX-подключений реализована с использованием JAAS Login Modules, поэтому создайте файл конфигурации, содержащий описание модуля, и задействуйте этот файл с помощью системного свойства java.security.auth.login.config.

Файл конфигурации JAAS Login Modules#

Пример файла (my.login.modules.config):

JmxModule {
   com.sbt.security.ignite.core.jmx.JmxLoginModule required igniteInstanceName="serverNode";
};

где:

  • JmxModule — имя модуля;

  • igniteInstanceName — имя узла Platform V DataGrid. Оно должно соответствовать параметру IgniteConfiguration.igniteInstanceName.

Если в приложении создается несколько узлов, то для каждого узла, предполагающего возможность защищенного JMX-подключения, в файл конфигурации добавьте описание отдельного модуля с уникальным именем.

Файл из примера выше указывается при запуске JVM с помощью -Djava.security.auth.login.config=my.login.modules.config. Более подробную информацию о структуре файла вы можете найти в документации Oracle.

Дополнения в конфигурации серверного узла#

Для настройки защищенного JMX-сервера в конфигурации плагина используются следующие свойства:

...
<bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">
    ...
    <property name="selfKeyStorePath" value="/path/to/serverNode-key-and-certificate.jks"/>
    <property name="selfKeyStorePassword" value="123456"/>
    <property name="jmxPort" value="3000"/>
    <property name="jmxTrustStorePath" value="/path/to/Sberbank-CA-truststore.jks"/>
    <property name="jmxTrustStorePassword" value="123456"/>

    <!-- Имя модуля из файла конфигурации JAAS Login Modules.  -->
    <property name="jmxLoginModuleName" value="JmxModule"/>
    ...
</bean>
...

Если свойство jmxPort не указано, то сервер не будет создан.

Подключение к JMX-коннектору при помощи внешнего Java-клиента#

Пример создания и использования javax.management.remote.JMXConnector:

import java.util.HashMap;
import java.util.Map;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
...

System.setProperty("javax.net.ssl.keyStore", "/path/to/admin/keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
System.setProperty("javax.net.ssl.trustStore", "/path/to/Sberbank-CA-truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");

String jmxHost = "localhost";
int jmxPort = 3000;

JMXServiceURL url = new JMXServiceURL(String.format("service:jmx:rmi:///jndi/rmi://%s:%d/jmxrmi", jmxHost, jmxPort));

Map<String, Object> jmxEnv = new HashMap<>();

jmxEnv.put(JMXConnector.CREDENTIALS, new String[] { "admin", "passw0rd" });

try (JMXConnector jmxc = JMXConnectorFactory.connect(url, jmxEnv)) {
    jmxc.getMBeanServerConnection().invoke(...);
    ...
}
Подключение к JMX-коннектору с помощью JConsole#

Для запуска jconsole выполните:

jconsole \
-J-Djavax.net.ssl.keyStore=/path/to/admin/keystore.jks \
-J-Djavax.net.ssl.keyStorePassword=123456 \
-J-Djavax.net.ssl.trustStore=/path/to/Sberbank-CA-truststore.jks \
-J-Djavax.net.ssl.trustStorePassword=123456

Затем заполните поля Remote Process (="host:port"), Username, Password и подключитесь.

Поддержка InMemory кластера, обновление файла с пользователями и ролями#

Для настройки выполните следующие шаги:

  1. Создайте bean dataFileProviderSupplier в JsonSecurityDataSupplierImpl, указав в конструкторе путь до файла.

  2. Создайте bean metaStorageListener в SecurityDataListener, указав в конструкторе dataFileProviderSupplier.

  3. Добавьте bean metaStorageListener в SecurityPluginConfiguration.

Пример:

<bean id="dataFileProviderSupplier" class="com.sbt.security.ignite.core.storage.metastorage.JsonSecurityDataSupplierImpl">
        <constructor-arg value="path/to/security-data.json"/>
</bean>

<bean id="metaStorageListener" class="com.sbt.security.ignite.core.storage.metastorage.SecurityDataListener">
        <constructor-arg ref="dataFileProviderSupplier"/>
</bean>

<util:list id="components" value-type="SecurityLifecycleAware">
        <ref bean="evtRecorder"/>
        <ref bean="metaStorageListener"/>
        . . .
</util:list>


 <bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">
        <property name="components" ref="components"/>

        . . .
</bean>

Примечание

Обновление файла будет происходить при каждой записи в MetaStorage.

Утилита для генерации Salt и Salted-хеша пароля#

Пример запуска:

# java -jar security-core.jar --hash

PBKDF2 hash calculator
Password:
Once again:
Salt: A2DA8C5E73C7D90853E41514A5EA99BF119F91698A49FDDD97B68E844C146699
Salted hash: AECA32F27FD4AC0147547CC7632025504151462B5615AD7DE71895843E48F43630D8D19A002DC8B6088751D5881F4861B39230AED3429A1967DB09726DC447E3
Использование консольной утилиты управления пользователями#

Утилита управления используется как скрипт на технологическом сервере:

ise-user-control.sh connection_parameters command command_parameters

где:

  • connection_parameters — параметры для создания GridClient-подключения, такие как: имя пользователя, путь к хранилищу сертификатов, наборы шифрования;

  • command — команда администрирования;

  • command_parameters — параметры команды администрирования;

  • ise-user-control.sh --help — для получения справки об используемых командах. §

Проверка используемых сертификатов#

Проверка сертификатов выполняется путем подключения к JVM по JMX по адресу:

org.apache.<process_id>.<consistent_id>.Security.com.sbt.security.ignite.core.expiration.CertificateMBeanImpl.Attributes

Список атрибутов:

  • DistinguishedName — имя сертификата.

  • Fingerprint — отпечаток пальца.

  • ExpirationDate — дата окончания действия.

  • ExpirationTimestamp — дата окончания срока действия в формате UNIX timestamp.

Примечание:

  • Сертификат выпускается и подписывается по запросу на обслуживание для соответствующего доменного имени технологического сервера (оно различно для ПСИ- и ПРОМ-контуров). Пользователи консоли управления будут подключаться из браузера, используя это имя.

  • Если порт 443 занят, то следует выбрать другой свободный порт и далее в браузере обращаться по нему.

В браузере пользовательский интерфейс утилиты управления доступен по адресу:

https://<IP-адрес технологического узла>:443/

При первом запуске кластера с плагином безопасности создается учетная запись администратора безопасности root с паролем changeit. Для успешного входа в утилиту управления потребуется сертификат категории «администратор безопасности», созданный по правилам, описанным в п. 2. Сертификат должен присутствовать в каталоге, заданном в --certificates.dir.path. Далее будет использоваться следующий стандартный алгоритм действий:

  1. Администратор доступа устанавливает себе стойкий пароль (см. «Руководство по безопасности»).

  2. Используя интерфейс утилиты управления, администратор доступа создает необходимые роли и учетные записи, в том числе УЗ администраторов эксплуатации.

  3. Каждый администратор эксплуатации, используя интерфейс утилиты управления, должен сменить свой пароль (до этого никакие его действия не будут авторизованы).

Кроме root первоначально создается УЗ серверного узла, а ее логин и пароль берутся из сконфигурированного на СУ security credentials provider.

Быстрое развертывание в тестовых средах#

Для быстрого запуска Platform V DataGrid с настроенным SSL и плагином безопасности существуют:

  • config/serverExampleConfig.xml — конфигурации серверного узла;

  • config/clientExampleConfig.xml — конфигурации клиентского узла;

  • config/default-security-data.json — файл с начальными пользователями;

  • config/certs/ — сертификаты для SSL.

Установка переменной IGNITE_HOME#

$ export IGNITE_HOME=/path/to/Platform-V-Data-Grid-<version>

Редактирование JVM-опции для тестовых сертификатов#

Добавляем JVM_OPTS="$JVM_OPTS -DREQUIRE_AUDIT=false -DIGNITE_CLUSTER_TYPE=prom -DIGNITE_CLUSTER_NAME=mycluster" в $IGNITE_HOME/bin/ignite.sh

Запуск серверного узла#

$ $IGNITE_HOME/bin/ignite.sh $IGNITE_HOME/config/serverExampleConfig.xml

Запуск клиентского узла#

$ $IGNITE_HOME/bin/ignite.sh $IGNITE_HOME/config/clientExampleConfig.xml

Активация кластера#

$ $IGNITE_HOME/bin/control.sh --activate --host localhost --user operationAdmin --password default-password  --keystore $IGNITE_HOME/config/certs/operationAdmin.jks --keystore-password 123456 --truststore $IGNITE_HOME/config/certs/truststore.jks --truststore-password 123456

Запуск утилиты управления пользователями#

$ java -jar $IGNITE_HOME/libs/security-plugins/ui-\<version\>.jar --server.port=8990 --ssl.disabled=true --certificates.dir.path=$IGNITE_HOME/config/certs

Подключение к кластеру через браузер#
  • В браузере перейдите по адресу http://localhost:8990/.

  • Затем заполните поля в окне авторизации:

Поле

Значение

Хост

127.0.0.1

Порт

11211

Логин

root

Пароль

changeit

Протокол

TLS

Алгоритм

SunX509

Шифр

Оставьте поле пустым

Key store

root.jks

Trust store

truststore.jks

Пароль к обоим хранилищам

123456

Начальные пароли и пользователи#

Логин

Пароль

Права

serverNode

default-password

Серверный узел

clientNode

default-password

Клиентский узел

root

changeit

Администратор пользователей

operationAdmin

default-password

Администратор эксплуатации

validUser

default-password

Администратор эксплуатации с ограниченными правами до изменения собственного пароля

Аудит#

Аудит описывается в документе «Руководство по безопасному использованию». В настоящем руководстве приводится лишь конфигурация REST-интерфейса.

Описание REST API для внешнего аудита#
REST-интерфейс аудита#
  • Слушатель событий com.sbt.security.ignite.integration.audit.rest.AuditEventListenerImpl при запуске узла регистрирует метамодель событий, отправляя ее на веб-страницу AUDIT_URL/metamodel.

  • События, которые необходимо записывать в аудит, отправляются на веб-страницу AUDIT_URL/event.

  • Содержимое запросов описывается в файле audit-client-openapi.yml.

Конфигурация для интеграции с подсистемой аудита#
Добавление в конфигурацию Ignite beans обработчика аудита событий и списка событий, необходимых для отправки в аудит#
<!-- Следующий bean содержит описание метамодели данных, которые отправляются в подсистему аудита. -->
<bean id="auditMetamodelProvider" class="com.sbt.security.ignite.integrationaudit.rest.AuditMetamodelProvider">
    <!-- Наименование системы, которая записывает метамодели в аудит. -->
    <constructor-arg>MODULE_ID</constructor-arg>
</bean>

<!-- Следующий bean отвечает за отправку данных в подсистему аудита. -->
<bean id="auditSender" class="com.sbt.security.ignite.integration.audit.restAuditSender">
    <!-- URL, на который отправляются данные. -->
    <constructor-arg>AUDIT_URL</constructor-arg>
</bean>

<bean id="auditEventListener" class="com.sbt.security.ignite.integration.auditrest.AuditEventListenerImpl">
    <constructor-arg ref="auditMetamodelProvider"/>
    <constructor-arg ref="auditSender"/>
</bean>

<util:list id="eventTypes" value-type="java.lang.Integer">
    <!-- Коды событий, необходимые для отправки в аудит (см. пункт 3.4). -->
    <value>2010</value>
    <value>2011</value>
</util:list>

<util:map id="eventListeners"
          map-class="java.util.HashMap"
          key-type="org.apache.ignite.lang.IgnitePredicate"
          value-type="java.lang.Integer[]">
    <entry key-ref="auditEventListener" value-ref="eventTypes"/>
</util:map>
Добавление свойства org.apache.ignite.configuration.IgniteConfiguration в bean класса#
<property name="localEventListeners" ref="eventListeners"/>
Регистрация в подсистеме аудита событий, связанных с выполнением REST-запросов#
Добавление соответствующих beans в конфигурацию Platform V DataGrid#
<util:list id="cmdEventIgnoreList" value-type="java.lang.String">
<!-- Имена REST-команд, по которым запись в аудит вестись не будет. -->
<value>NOOP</value>
</util:list>

<bean id="restProcessorConfiguration" class="com.sbt.security.ignite.integration.audit.rest.RestProcessorPluginConfiguration">
<property name="commandEventIgnoreList" ref="cmdEventIgnoreList"/>
</bean>

<bean id="restProcessorPluginProvider" class="com.sbt.security.ignite.integration.audit.rest.RestProcessorPluginProvider">
<property name="configuration" ref="restProcessorConfiguration"/>
</bean>
Добавление свойства org.apache.ignite.configuration.IgniteConfiguration в bean класса#
<property name="pluginProviders">
<list>
<ref bean="restProcessorPluginProvider"/>
</list>
</property>

Механизм Change Data Capture (CDC) и межкластерная репликация#

Введение#

Change Data Capture (CDC) — это сценарий обработки данных, использующийся для асинхронного получения данных, измененных на локальном узле. При этом, получение записей происходит таким образом, чтобы затем с ними можно было совершать какие-либо действия.

CDC используется в следующих сценариях:

  • потоковая передача изменений в Хранилище;

  • обновление поисковых индексов;

  • аудит логов;

  • асинхронное взаимодействие со внешней системой (модерирование, запуск бизнес-процессов и прочее).

Именно на механизме CDC основывается процесс межкластерной репликации в Platform V Data Grid. CDC здесь обрабатывает сегменты WAL-журнала, а затем доставляет локальные изменения до потребителей. Информация о межкластерной репликации в Platform V Data Grid находится в разделе "Межкластерная репликация и CDC в Platform V Data Grid" ниже.

CDC запускается на всех серверных узлах кластера Platform V Data Grid в отдельной JVM, что исключает прямое влияние на основной функционал грида.

CDC в своей работе использует подход fail-fast. Это означает, что в случае неисправности CDC просто прекращает работу без автоматического восстановления.

Алгоритм работы механизма CDC#

Схема работы механизма:

cdc-design

  1. При включенном механизме CDC серверный узел Platform V Data Grid создает в специальной директории db/cdc/{consistent_id} (значение по умолчанию) жесткую ссылку на каждый сегмент архива WAL-журнала.

  2. Затем, приложение ignite-cdc.sh запускается на отдельной JVM и обрабатывает сегменты WAL-журнала, которые были перенесены в архив совсем недавно.

  3. После обработки сегмента приложением, он удаляется. Само дисковое пространство освобождается при удалении обеих ссылок (в архиве WAL-журнала и в директории CDC).

Конфигурация#

Параметры конфигурации#
Параметры конфигурации узла Platform V Data Grid#

Имя

Описание

Значение по умолчанию

DataStorageConfiguration#cdcEnabled

Свойство включает CDC на серверном узле

false

DataStorageConfiguration#cdcWalPath

Путь к директории CDC

"db/wal/cdc"

DataStorageConfiguration#walForceArchiveTimeout

Таймаут для принудительной отправки сегмента WAL-журнала в архив (даже если обработка сегмента не завершена).

Внимание: Необходимо обязательно установить таймаут, иначе репликация будет происходить только при архивировании WAL-сегмента по его заполненности, что непредсказуемо по длительности. Расхождения между кластерами в таком случае могут достигать нескольких минут или десятков минут (зависит от нагрузки). Если нагрузка низкая, ротация может происходить еще реже

-1 (disabled)

Параметры конфигурации приложения CDC#

Имя

Описание

Значение по умолчанию

lockTimeout

Таймаут для ожидания блокировки. При запуске CDC устанавливает блокировку на директорию во избежание параллельной обработки этой директории параллельно работающим приложением ignite-cdc.sh

1000 мс

checkFrequency

Время между последовательными проверками, в течение которого приложение находится в спящем режиме, если новые файлы отсутствуют

1000 мс

keepBinary

Свойство, определяющее, должны ли ключ и значение измененных записей быть предоставлены в бинарном формате

true

consumer

Реализация org.apache.ignite.cdc.CdcConsumer, потребляющая изменения в записях

null

metricExporterSpi

Ряд интерфейсов, предназначенных для экспорта метрик CDC. Для получения более подробной информации, перейдите в раздел "Метрики" данного раздела

null

Описание CDC API#

org.apache.ignite.cdc.CdcEvent

Имя

Описание

key()

Ключ измененной записи

value()

Значение измененной записи. Метод вернет null, если в событии отражается удаление

cacheId()

ID кеша, на котором происходит изменение. Значение метода равно значению параметра CACHE_ID из SYS.CACHES

partition()

Партиция измененной записи. Возвращает номер партиции. Platform V Data Grid разбивает набор данных на более мелкие части для их распределения по кластеру. Реализации ChangeDataCaptureConsumer могут использовать метод partition() для разделения обработки изменений таким же образом, как и для кеша

primary()

Свойство, определяющее, на каком узле происходит операция — на основном или резервном. Возвращает true, если событие запустилось на основном узле для партиции, содержащей данную запись

version()

Comparable-версия измененной записи. Platform V Data Grid версионирует все записи, что дает возможность сортировки изменений в одной и той же записи

org.apache.ignite.cdc.CdcConsumer

org.apache.ignite.cdc.CdcConsumer — это потребитель событий-изменений. Потребитель может быть реализован пользователем самостоятельно. Кроме того, в дистрибутиве поставляется две реализации CDC: Platform V Data Grid to Platform V Data Grid, Platform V Data Grid to Platform V Corax to Platform V Data Grid.

Имя

Описание

void start(MetricRegistry)

Вызывается один раз при запуске приложения CDC. Реестр MetricRegistry должен использоваться для экспорта специфичных для потребителя метрик

boolean onEvents(Iterator<CdcEvent> events)

Основной метод обработки изменений. Когда данный метод возвращает true, состояние сохраняется на диске. Состояние указывает на событие, следующее за последним событием чтения. В случае отказа, потребление продолжится с последнего сохраненного состояния

void stop()

Вызывается один раз при остановке приложения CDC

CacheEntryVersion

Имя

Описание

version()

Версия записи

int cacheId()

ID кеша

CacheEntryVersion extends Comparable<CacheEntryVersion>, Serializable

Порядок события записи. Два параллельных обновления одной и той же записи могут быть расположены в порядке, основанном на сравнении CacheEntryVersion. Большее значение означает, что событие происходит позже

long order()

Порядок обновления. Значение — суммирующий счетчик. Область действия счетчика — узел. Возвращает порядок версии

int nodeOrder()

Возвращает порядок (номер) узла, в котором была назначена данная версия

byte clusterId()

ID кластера — это значение, которое определяет наличие обновлений в случае, если пользователь хочет собрать и рассортировать обновления от нескольких кластером Platform V Data Grid. clusterId ID для узла можно настроить с помощью GridCacheVersionManager#dataCenterId(byte)

int topologyVersion()

Возвращает версию топологии плюс число секунд со времени запуска первого узла в кластере

CacheEntryVersion otherClusterVersion()

Если источником обновления является "локальный" кластер, то возвращается null. Если обновление приходит от другого кластера с помощью IgniteInternalCache#putAllConflict(Map), то это — версия записи для другого кластера. Возвращает версию репликации

Межкластерная репликация и CDC в Platform V Data Grid#

Механизм межкластерной репликации основан на механизме CDC, описанном выше.

Механизм репликации асинхронный.

В зависимости от архитектуры сети и требований безопасности доступны две схемы межкластерной репликации:

  1. Репликация Platform V Data Grid to Platform V Data Grid.

  2. Рекликация Platform V Data Grid to Kafka to Platform V Data Grid.

Для разрешения возможных конфликтов изменения данных при использовании Active-Active режима репликации необходимо настраивать модуль ConflictResolver для обеих схем межкластерной репликации. Подробное описание этого модуля содержится в следующем разделе.

Описание и настройка модуля conflictResolver#

В случае одновременного изменения данных на обоих кластерах (режим Active-Active), для корректного применения событий репликации необходимо настраивать модуль ConflictResolver. Этот модуль может быть разработан пользователем самостоятельно и подключен к Platform V Data Grid в виде плагина. В состав дистрибутива Platform V Data Grid включен плагин с CacheVersionConflictResolver, который позволяет разрешать конфликты на основании идентификатора кластера (clusterId), версии записи и на основании специального поля, по которому производится сравнение в случае применения конфликтующих событий репликации с разных кластеров. Данное поле должно задаваться бизнес-логикой пользователя и изменяться прикладным кодом в объектах, вставляемых в кеши, которые реплицируются посредством CDC.

Механизм работы модуля#

Алгоритм применения изменений основывается на трех принципах:

  1. При отсутствии пересечений данные отправляются на запись.

  2. При наличии конфликта в зависимости от настройки принимается решение о его разрешении в порядке убывания приоритета:

    1. Если изменение локальное, т.е. clusterId соответствует текущему кластеру, то оно приоритетнее любого удалённого.

    2. Если изменение удалённое, то предпочтение отдаётся изменению с большей версией (CacheEntryVersion).

    3. На основании сравнения по пользовательскому полю (conflictResolveField). Поле должно быть добавлено в пользовательские объекты, хранимые в реплицируемых кешах, его значение должно обновляться посредством пользовательского кода. Так как решение принимается на основании значения поля (применятся изменение с большим значением поля), поле должно реализовывать интерфейс Сomparable.

  3. При невозможности разрешить конфликт изменение отбрасывается, что приводит к потере консистентности между кластерами.

Примечание

Для обеспечения максимальной производительности и во избежание ситуации, описанной в пункте 3, рекомендуется избегать пересечений по ключам при проектировании, а при наличии пересечений обоснованно выбирать поля для сравнения изменений.

Пример настройки плагина CacheVersionConflictResolver#
<property name="pluginProviders">
            <list>
                <bean class="org.apache.ignite.cdc.conflictresolve.CacheVersionConflictResolverPluginProvider">
                    <property name="clusterId" value="1"/>
                    <property name="caches">
                        <set>
                            <value>terminator</value>
                        </set>
                    </property>

                    <property name="conflictResolveField" value="modificationDate"/>
                </bean>
            </list>
        </property>
Репликация Platform V Data Grid to Platform V Data Grid#

Данная схема репликации требует возможности организации прямого соединения между двумя кластерами Platform V Data Grid.

Примечание

На текущий момент данная схема позволяет обеспечить репликацию только между двумя кластерами. Для соединения более двух кластером можно воспользоваться схемой Platform V Data Grid to Platform V Corax to Plstform V Data grid.

IgnitetoIgnite

Основным элементом схемы является приложение IgniteToIgniteCDCStreamer. Это приложение захватывает и передает изменения записей из WAL-журнала на сторонний узел. Приложение содержит клиентский узел Platform V Data Grid, подключающийся к узлу в кластере назначения (на схеме — Ignite#2).

Пример и описание конфигурации#

Примечание

Данная конфигурация предназначена для локального развертывания (на localhost). Настройки указаны для примера.

Конфигурация кластера-источника:

Имя файла: ignite-1984.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       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 id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="igniteInstanceName" value="ignite-1984-server" />
        <property name="consistentId" value="ignite-1984-server" />
        <property name="peerClassLoadingEnabled" value="true" />
        <property name="localHost" value="127.0.0.1" />

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="localPort" value="47500" />
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses"
                                  value="127.0.0.1:47500..47510" />
                    </bean>
                </property>
                <property name="joinTimeout" value="10000" />
            </bean>
        </property>

        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="persistenceEnabled" value="true" />
                    </bean>
                </property>
                <property name="cdcEnabled" value="true" />
<!--Свойство cdcEnabled выше включает функционал CDC.-->
                <property name="walForceArchiveTimeout" value="5000"/>
<!--При данном значении свойства walForceArchiveTimeout выше каждый сегмент WAL-журнала будет доступен для обработки через 5 секунд после перенесения его в архив-->
            </bean>
        </property>
<!--Ниже необходимо указать конфигурацию модуля conflictResolver-->
		<property name="pluginProviders">
			<bean class="org.apache.ignite.cdc.conflictresolve.CacheVersionConflictResolverPluginProvider">
				<property name="clusterId" value="1" />
<!--clusterId (выше) должен быть разным для каждого кластера-->
<!--Ниже необходимо сконфигурировать кeши, для которых будет срабатывать conflictResolver-->
				<property name="caches">
					<util:list>
						<bean class="java.lang.String">
							<constructor-arg type="String" value="terminator" />

                            <property name="conflictResolveField" value="modificationDate"/>
						</bean>
					</util:list>
				</property>
			</bean>
		</property>

        <property name="cacheConfiguration">
            <list>
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="atomicityMode" value="ATOMIC"/>
                    <property name="name" value="terminator"/>
                </bean>
            </list>
        </property>
    </bean>

<!--Ниже указывается конфигурация механизма CDC. Утилита ignite-cdc.sh должна запускаться на всех серверных узлах кластера Platform V Data Grid, поэтому конфигурация CDC хранится в том же файле, в котором хранится конфигурация серверного узла.-->
	<bean id="cdc.cfg" class="org.apache.ignite.cdc.CdcConfiguration">
<!--Конфигурация здесь отличается от конфигурации по умолчанию только свойством consumer (потребитель). Здесь оно имеет класс `IgniteToIgniteCdcStreamer`-->
		<property name="consumer" ref="cdc.streamer" />
	</bean>
<!--Внутри класса передается конфигурация клиентского узла, который будет подключаться к кластеру-получателю данных.-->
    <bean id="cdc.streamer" class="org.apache.ignite.cdc.IgniteToIgniteCdcStreamer">
        <constructor-arg index="0">
<!--0 здесь означает параметр destIgniteCfg — конфигурацию узла-получателя-->
            <bean class="org.apache.ignite.configuration.IgniteConfiguration">
                <property name="igniteInstanceName" value="ignite-2029-cdc-client" />
                <property name="clientMode" value="true" />
                <property name="peerClassLoadingEnabled" value="true" />
                <property name="localHost" value="127.0.0.1" />

                <property name="discoverySpi">
                    <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                        <property name="localPort" value="47600" />
                        <property name="ipFinder">
                            <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                            <!--В свойстве ниже указываются адреса кластера-получателя-->
                                <property name="addresses"
                                          value="127.0.0.1:47600..47610" />                               
                            </bean>
                        </property>
                        <property name="joinTimeout" value="10000" />
                    </bean>
                </property>
            </bean>
        </constructor-arg>
<!--1 ниже обозначает свойство onlyPrimary — оно отвечает за то, какие партиции будут реплицироваться: либо только primary-партиции, либо все, чтобы в случае выхода primary-партиции из строя изменения поступили от backup-партиций-->
        <constructor-arg index="1" value="false" />
<!--2 ниже означает параметр caches — список реплицируемых кешей.-->
        <constructor-arg index="2">
            <util:list>
                <bean class="java.lang.String">
                    <constructor-arg type="String" value="terminator" />
                </bean>
            </util:list>
        </constructor-arg>
<!--3 ниже обозначает параметр maxBatchSize — максимальный размер пакета изменений, которые необходимо применить-->
        <constructor-arg index="3" value="256" />
    </bean>
</beans>

Конфигурация кластера-получателя:

Примечание

Представленная ниже конфигурация актуальна для режима репликации Active-Active. При использовании режима Active-Passive на кластере-получателе org.apache.ignite.cdc.CdcConfiguration не настраивается. Также при Active-Passive на обоих кластерах не потребуется настройка conflictResolver. Для получения более подробной информации о режимах репликации, перейдите к разделу "Режимы репликации" ниже.

Имя файла: ignite-2029.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       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 id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="igniteInstanceName" value="ignite-2029" />
        <property name="consistentId" value="ignite-2029" />
        <property name="peerClassLoadingEnabled" value="true" />
        <property name="localHost" value="127.0.0.1" />

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="localPort" value="47600" />
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses"
                                  value="127.0.0.1:47600..47610" />
                    </bean>
                </property>
                <property name="joinTimeout" value="10000" />
            </bean>
        </property>

        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="persistenceEnabled" value="true" />
                    </bean>
                </property>
                <property name="cdcEnabled" value="true" />
                <property name="walForceArchiveTimeout" value="5000"/>
            </bean>
        </property>

		<property name="pluginProviders">
			<bean class="org.apache.ignite.cdc.conflictresolve.CacheVersionConflictResolverPluginProvider">
				<property name="clusterId" value="2" />
				<property name="caches">
					<util:list>
						<bean class="java.lang.String">
							<constructor-arg type="String" value="terminator" />
                            
                            <property name="conflictResolveField" value="modificationDate"/>
						</bean>
					</util:list>
				</property>
			</bean>
		</property>

        <property name="cacheConfiguration">
            <list>
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="atomicityMode" value="ATOMIC"/>
                    <property name="name" value="terminator"/>
                </bean>
            </list>
        </property>
    </bean>

	<bean id="cdc.cfg" class="org.apache.ignite.cdc.CdcConfiguration">
		<property name="consumer" ref="cdc.streamer" />
	</bean>

    <bean id="cdc.streamer" class="org.apache.ignite.cdc.IgniteToIgniteCdcStreamer">
        <constructor-arg index="0">
            <bean class="org.apache.ignite.configuration.IgniteConfiguration">
                <property name="igniteInstanceName" value="ignite-1984-cdc-client" />
                <property name="clientMode" value="true" />
                <property name="peerClassLoadingEnabled" value="true" />
                <property name="localHost" value="127.0.0.1" />

                <property name="discoverySpi">
                    <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                        <property name="localPort" value="47500" />
                        <property name="ipFinder">
                            <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                                <property name="addresses"
                                          value="127.0.0.1:47500..47510" />
                            </bean>
                        </property>
                        <property name="joinTimeout" value="10000" />
                    </bean>
                </property>
            </bean>
        </constructor-arg>
        <constructor-arg index="1" value="false" />
        <constructor-arg index="2">
            <util:list>
                <bean class="java.lang.String">
                    <constructor-arg type="String" value="terminator" />
                </bean>
            </util:list>
        </constructor-arg>
        <constructor-arg index="3" value="256" />
    </bean>
</beans>

После конфигурирования кластеров необходимо запустить утилиту ignite-cdc.sh на каждом серверном узле. Для запуска выполните следующие действия:

  1. Выполните команду ignite-cdc.sh ignite-1984.xml.

  2. Выполните команду ignite-cdc.sh ignite-2029.xml.

Репликация Platform V Data Grid to Platform V Corax to Platform V Data Grid#

Вторая схема предполагает использование Platform V Corax для передачи изменений в другой кластер. Подойдут конфигурации стратегии доставки at least once и exactly once. Идемпотентность потребителя гарантируется модулем conflictResolver, гарантирующим что повторно отправленное изменение не будет применено дважды. Кроме того, в отличие от схемы Platform V Data Grid to Platform V Data Grid, данная схема позволяет производить репликацию данных между несколькими ЦОД (3 и более).

Ignite2Kafka

Модуль IgniteToKafkaCDCStreamer записывает захваченные изменения в топик Kafka. На принимающей стороне на кластере должен быть сконфигурирован CDC и включен модуль conflictResolver (для режима репликации Active-Active, в режиме Active-Passive conflictResolver не настраивается). Модуль KafkaToIgniteCDCStreamer на удалённом сервере выполняет функцию чтения изменений из топика и их применения.

Пример и описание конфигурации#

Примечание

В настоящем примере описывается конфигурация для локального развертывания (на localhost) и передачи данных между двумя ЦОД. Настройки указаны для примера.

Перед началом работы необходимо запустить Corax и Zookeeper. Затем создать топики:

bin/kafka-topics.sh --create --partitions 16 --replication-factor 1 --topic dc1_to_dc2 --bootstrap-server localhost:9092
bin/kafka-topics.sh --create --partitions 16 --replication-factor 1 --topic dc2_to_dc1 --bootstrap-server localhost:9092

Конфигурация кластера-источника для ЦОД-1:

Имя файла: ignite-dc1-kafka.xml

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util
        https://www.springframework.org/schema/util/spring-util.xsd">

    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="igniteInstanceName" value="ignite-2029-server"/>
        <property name="consistentId" value="ignite-2029-server"/>
        <property name="peerClassLoadingEnabled" value="true"/>

        <property name="metricExporterSpi">
          <list>
            <bean class="org.apache.ignite.spi.metric.jmx.JmxMetricExporterSpi"/>
          </list>
        </property>

        <property name="cacheConfiguration">
          <list>
            <bean class="org.apache.ignite.configuration.CacheConfiguration">
              <property name="name" value="terminator"/>
            </bean>
          </list>
        </property>

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="localPort" value="47800"/>
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses" value="127.0.0.1:47800"/>
                    </bean>
                </property>
                <property name="joinTimeout" value="10000"/>
            </bean>
        </property>

        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="persistenceEnabled" value="true"/>
                    </bean>
                </property>
<!--Свойство cdcEnabled (ниже) включает функционал CDC.-->
                <property name="cdcEnabled" value="true"/>
                <property name="walForceArchiveTimeout" value="5000"/>
<!--При данном значении свойства walForceArchiveTimeout (выше) каждый сегмент WAL-журнала будет доступен для обработки через 5 секунд после перенесения его в архив-->
            </bean>
        </property>

        <property name="clientConnectorConfiguration" ref="clientConnectorConfiguration"/>
        <property name="communicationSpi" ref="communicationSpi"/>
        <property name="connectorConfiguration" ref="connectorConfiguration"/>
<!--Ниже необходимо указать конфигурацию модуля conflictResolver-->
        <property name="pluginProviders">
            <list>
                <bean class="org.apache.ignite.cdc.conflictresolve.CacheVersionConflictResolverPluginProvider">
                    <property name="clusterId" value="1"/>
<!--clusterId (выше) должен быть разным для каждого кластера-->
                    <property name="caches">
<!--Ниже необходимо сконфигурировать кеши, для которых будет срабатывать conflictResolver-->
                        <set>
                            <value>terminator</value>
                        </set>
                    </property>

                    <property name="conflictResolveField" value="modificationDate"/>
                </bean>
            </list>
        </property>
    </bean>
<!--Ниже указывается конфигурация сервера.-->
    <bean id="clientConnectorConfiguration" class="org.apache.ignite.configuration.ClientConnectorConfiguration">
        <property name="port" value="11000"/>
    </bean>
<!--Ниже указывается конфигурация сервера.-->
    <bean id="connectorConfiguration" class="org.apache.ignite.configuration.ConnectorConfiguration">
        <property name="port" value="11300"/>
    </bean>
<!--Ниже указывается конфигурация сервера.-->
    <bean id="communicationSpi" class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
        <property name="localPort" value="48800"/>
    </bean>

    <util:properties id="kafkaProperties" location="file:/config/path/kafka.properties"/>

    <bean id="cdc.cfg" class="org.apache.ignite.cdc.CdcConfiguration">
        <property name="consumer">
<!--Ниже указывается конфигурация механизма CDC. Утилита ignite-cdc.sh должна запускаться на всех серверных узлах кластера Platform V Data Grid, поэтому конфигурация CDC хранится в том же файле, в котором хранится конфигурация серверного узла.-->
            <bean class="org.apache.ignite.cdc.kafka.IgniteToKafkaCdcStreamer">
                <constructor-arg name="topic" value="dc1_to_dc2"/>
                <constructor-arg name="kafkaParts" value="16"/>
                <constructor-arg name="caches">
                    <list>
                        <value>terminator</value>
                    </list>
                </constructor-arg>
                <constructor-arg name="maxBatchSize" value="256"/>
                <constructor-arg name="onlyPrimary" value="false"/>
                <constructor-arg name="kafkaProps" ref="kafkaProperties"/>
            </bean>
        </property>

        <property name="metricExporterSpi">
            <list>
                <bean class="org.apache.ignite.spi.metric.jmx.JmxMetricExporterSpi"/>
            </list>
        </property>
    </bean>
</beans>

Конфигурация кластера-источника для ЦОД-2:

Имя файла: ignite-dc2-kafka.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">

    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="igniteInstanceName" value="ignite-1984-server"/>
        <property name="consistentId" value="ignite-1984-server"/>
        <property name="peerClassLoadingEnabled" value="true"/>

        <property name="metricExporterSpi">
          <list>
              <bean class="org.apache.ignite.spi.metric.jmx.JmxMetricExporterSpi"/>
          </list>
        </property>

        <property name="cacheConfiguration">
          <list>
            <bean class="org.apache.ignite.configuration.CacheConfiguration">
              <property name="name" value="terminator"/>
            </bean>
          </list>
        </property>

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="localPort" value="47850"/>
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses" value="127.0.0.1:47850"/>
                    </bean>
                </property>
                <property name="joinTimeout" value="10000"/>
            </bean>
        </property>

        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="persistenceEnabled" value="true"/>
                    </bean>
                </property>
<!--Свойство cdcEnabled включает функционал CDC.-->
                <property name="cdcEnabled" value="true"/>
                <property name="walForceArchiveTimeout" value="5000"/>
<!--При данном значении свойства walForceArchiveTimeout каждый сегмент WAL-журнала будет доступен для обработки через 5 секунд после перенесения его в архив-->
            </bean>
        </property>
<!--Ниже необходимо указать конфигурацию модуля conflictResolver-->
        <property name="pluginProviders">
            <list>
                <bean class="org.apache.ignite.cdc.conflictresolve.CacheVersionConflictResolverPluginProvider">
<!--clusterId должен быть разным для каждого кластера-->
                    <property name="clusterId" value="2"/>
                    <property name="caches">
<!--Здесь необходимо сконфигурировать кеши, для которых будет срабатывать conflictResolver-->
                        <set>
                            <value>terminator</value>
                        </set>
                    </property>

                    <property name="conflictResolveField" value="modificationDate"/>
                </bean>
            </list>
        </property>

        <property name="clientConnectorConfiguration" ref="clientConnectorConfiguration"/>
        <property name="communicationSpi" ref="communicationSpi"/>
        <property name="connectorConfiguration" ref="connectorConfiguration"/>
    </bean>

    <bean id="clientConnectorConfiguration" class="org.apache.ignite.configuration.ClientConnectorConfiguration">
        <property name="port" value="11050"/>
    </bean>

    <bean id="connectorConfiguration" class="org.apache.ignite.configuration.ConnectorConfiguration">
        <property name="port" value="11350"/>
    </bean>

    <bean id="communicationSpi" class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
        <property name="localPort" value="48850"/>
    </bean>

    <util:properties id="kafkaProperties" location="file:/config/path/kafka.properties"/>

    <bean id="cdc.cfg" class="org.apache.ignite.cdc.CdcConfiguration">
        <property name="consumer">
            <bean class="org.apache.ignite.cdc.kafka.IgniteToKafkaCdcStreamer">
                <constructor-arg name="topic" value="dc2_to_dc1"/>
                <constructor-arg name="kafkaParts" value="16"/>
                <constructor-arg name="caches">
                    <list>
                        <value>terminator</value>
                    </list>
                </constructor-arg>
                <constructor-arg name="maxBatchSize" value="256"/>
                <constructor-arg name="onlyPrimary" value="false"/>
                <constructor-arg name="kafkaProps" ref="kafkaProperties"/>
            </bean>
        </property>

        <property name="metricExporterSpi">
            <list>
                <bean class="org.apache.ignite.spi.metric.jmx.JmxMetricExporterSpi"/>
            </list>
        </property>
    </bean>
</beans>

Конфигурация Platform V Corax:

Примечание

Настройки ниже являются содержимым файла kafka.properties. В данном примере его содержимое одинаково для обоих ЦОД.

bootstrap.servers=127.0.0.1:9092
request.timeout.ms=10000

Конфигурация клиента Platform V Corax to Platform V Data Grid на ЦОД-1, вычитывающего изменения от ЦОД-2:

Примечание

Представленная ниже конфигурация актуальна для режима репликации Active-Active. При использовании режима Active-Passive на кластере-получателе org.apache.ignite.cdc.CdcConfiguration и conflictResolver не настраивается. Для получения более подробной информации о режимах репликации, перейдите к разделу "Режимы репликации" ниже.

Имя файла: kafka2ignite_dc1.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns="http://www.springframework.org/schema/beans"
       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 id="streamer.cfg" class="org.apache.ignite.cdc.kafka.KafkaToIgniteCdcStreamerConfiguration">
        <property name="topic" value="dc2_to_dc1"/>
        <property name="kafkaPartsFrom" value="0"/>
        <property name="kafkaPartsTo" value="16"/>
        <property name="threadCount" value="4"/>
        <property name="caches">
            <list>
                <value>terminator</value>
            </list>
        </property>
    </bean>

    <util:properties id="kafkaProperties" location="file:/config/path/kafka2ignite_dc1.properties"/>

    <bean id="ignIgniteConfiguration" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="metricExporterSpi">
            <list>
                <bean class="org.apache.ignite.spi.metric.jmx.JmxMetricExporterSpi"/>
            </list>
        </property>

        <property name="discoverySpi" ref="ignTcpDiscoverySpi"/>
        <property name="clientMode" value="true"/>
        <property name="consistentId" value="kafka-to-ignite_dc2"/>
        <property name="peerClassLoadingEnabled" value="true"/>
    </bean>

    <!--TcpDiscoverySpi-->
    <bean id="ignTcpDiscoverySpi" class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
        <property name="localPort" value="47801"/>
        <property name="ipFinder">
            <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                <property name="addresses">
                    <list>
                        <value>127.0.0.1:47800..47809</value>
                    </list>
                </property>
            </bean>
        </property>
    </bean>
</beans>

Конфигурация KafkaConsumer для ЦОД-1:

Файл kafka2ignite_dc1.properties

bootstrap.servers=127.0.0.1:9092
request.timeout.ms=10000
group.id=kafka-to-ignite-dc1
auto.offset.reset=earliest
enable.auto.commit=false

Конфигурация клиента Platform V Corax to Platform V Data Grid на ЦОД-2, вычитывающего изменения от ЦОД-1:

Имя файла: kafka2ignite_dc2.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns="http://www.springframework.org/schema/beans"
       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 id="streamer.cfg" class="org.apache.ignite.cdc.kafka.KafkaToIgniteCdcStreamerConfiguration">
        <property name="topic" value="dc1_to_dc2"/>
        <property name="kafkaPartsFrom" value="0"/>
        <property name="kafkaPartsTo" value="16"/>
        <property name="threadCount" value="4"/>
        <property name="caches">
            <list>
                <value>terminator</value>
            </list>
        </property>
    </bean>

    <util:properties id="kafkaProperties" location="file:/config/path/kafka2ignite_dc2.properties"/>

    <bean id="ignIgniteConfiguration" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="metricExporterSpi">
            <list>
                <bean class="org.apache.ignite.spi.metric.jmx.JmxMetricExporterSpi"/>
            </list>
        </property>

        <property name="discoverySpi" ref="ignTcpDiscoverySpi"/>
        <property name="clientMode" value="true"/>
        <property name="consistentId" value="kafka-to-ignite_dc2"/>
        <property name="peerClassLoadingEnabled" value="true"/>
    </bean>

    <!--TcpDiscoverySpi-->
    <bean id="ignTcpDiscoverySpi" class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
        <property name="localPort" value="47851"/>
        <property name="ipFinder">
            <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                <property name="addresses">
                    <list>
                        <value>127.0.0.1:47850..47859</value>
                    </list>
                </property>
            </bean>
        </property>
    </bean>
</beans>

Конфигурация KafkaConsumer для ЦОД-2:

Файл kafka2ignite_dc2.properties

bootstrap.servers=127.0.0.1:9092
request.timeout.ms=10000
group.id=kafka-to-ignite-dc2
auto.offset.reset=earliest
enable.auto.commit=false

После конфигурирования кластеров необходимо запустить утилиту ignite-cdc.sh на каждом серверном узле, а на принимающем узле необходимо запустить утилиту kafka-to-ignite.sh. В ignite-cdc.sh необходимо передавать путь до XML-конфигурации серверных узлов, а в kafka-to-ignite.sh — путь до XML-конфигурации Platform V Corax to Platform V Data Grid:

  1. Запуск Platform V Data Grid to Platform V Corax:

    ignite-cdc.sh ignite-dc1-kafka.xml
    
    ignite-cdc.sh ignite-dc2-kafka.xml
    
  2. Запуск Platform V Corax to Platform V Data Grid:

    kafka-to-ignite.sh kafka2ignite_dc1.xml
    
    kafka-to-ignite.sh kafka2ignite_dc2.xml
    
Режимы репликации#

Существует два режима репликации:

  • Active-Active: в данном режиме прикладные приложения записывают данные в оба кластера. Возвращаясь к примеру, это означает, что можно реплицировать данные как из кластера ignite-1984 в кластер ignite-2029, так и наоборот;

  • Active-Passive: в данном режиме прикладные приложения записывают данные только в один кластер. Второй кластер в данном режиме неактивен и используется только в случае возникновения проблем или запросов на чтение (например, для составления отчетов).

Данные режимы работают для обеих представленных схем репликации.

Возможные проблемы в работе репликации и методы их устранения#

  1. Чтобы CdcStreamer не завершил работу с ошибкой, до запуска репликации необходимо:

    1. Активировать кластер-получатель.

    2. Создать реплицируемый кеш на кластере-получателе.

    3. Загрузить на кластер-получатель все необходимые binary-meta (вставка в кеш, IgniteBinary#registerClass), т.к. автоматическая репликация binary-meta на текущий момент не реализована. В процессе работы все обновления binary-meta также необходимо делать на обоих кластерах.

  2. Во избежание возникновения сбоев на серверных узлах cdcWalPath и walArchivePath должны быть расположены в одном разделе файловой системы. В противном случае, серверный узел завершит работу с ошибкой.

  3. Во избежание зацикливания сообщений при репликации в режиме Active-Active необходимо убедиться, что:

    1. Для всех реплицируемых кешей настроен conflictResolver.

    2. В conflictResolver указаны разные clusterId для разных кластеров.

    3. Если conflictResolveField не указано в conflictResolver, то для уже имеющихся локально записей приходящие с удаленного кластера изменения будут вызывать конфликт и разрешаться не будут.

Утилиты#

Утилита для работы с кешами Cache Configurations Migration Tool#

Введение#

В дистрибутив Platform V Data Grid входит консольная утилита, предназначенная для миграции конфигураций кешей на кластер Platform V Data Grid — Cache Configurations Migration Tool. Данная утилита сравнивает текущую конфигурацию кешей кластера с новой, создает недостающие кеши, индекса и поля.

Утилита Cache Configurations Migration Tool поддерживает Spring XML-конфигурацию кешей. Также, утилита поддерживает следующие действия:

  • создание новых кешей;

  • создание новых таблиц;

  • создание полей в таблицах;

  • удаление полей в таблицах;

  • создание новых индексов.

Схема работы Cache Configurations Migration Tool#

Work Scheme

При запуске скрипта migrate-cache-configurations.sh выполняются следующие действия:

  1. Скрипт запускает Java-приложение, которое производит запуск клиентского узла Platform V Data Grid;

  2. Клиентский узел запрашивает необходимые метаданные из кластера при помощи подзадачи (job).

  3. После получения метаданных происходит вычисление необходимых изменений в конфигурациях и кешах.

  4. Отправка подзадачи (job) в кластер. Эта подзадача применит изменения на кластере и вернет выполненное действие. Также, выполненное действие будет отображено в логе узла, на котором выполнялась подзадача.

Сборка утилиты Cache Configurations Migration Tool#

Для сборки утилиты выполните следующую команду:

mvn clean install -Dmaven.test.skip=true

Результатом сборки будет архив target/ignite-migrate-cache-configuration.zip.

Конфигурация утилиты Cache Configurations Migration Tool#
  1. Разместите скрипт mirgate-cache-configuration.sh в директории IGNITE_HOME/bin/migrate-cache-configuration.sh.

  2. Убедитесь в том, что в class path на всех узлах кластера присутствует директория libs/ignite-migrate-cache-configuration.

Утилита использует IgniteLogger из конфигурации клиентского узла для логирования. Утилита логируется в отдельный файл как отдельное приложение migrate-cache-configuration.

Использование утилиты Cache Configurations Migration Tool#

Утилита Cache Configurations Migration Tool поддерживает следующие команды:

Команда

Описание

migrate-cache-configuration.sh igniteCfgPath cachesCfgPath

Запуск для просмотра изменений (в режиме "read-only")

migrate-cache-configuration.sh igniteCfgPath cachesCfgPath --migrate

Запуск для миграции конфигурации кешей на кластер Platform V Data Grid

migrate-cache-configuration.sh igniteCfgPath cachesCfgPath --help

Вывод справочной информации

Параметры и ключи#

Имя

Описание

igniteCfgPath

Путь до XML-конфигурации клиентского узла

cachesCfgPath

Путь до XML-конфигурации кешей

--migrate

Опциональный ключ для подтверждения миграции

Вывод утилиты Cache Configurations Migrate Tool содержит следующую информацию:

  • конфигурация кластера до вызова утилиты;

  • вычисленные изменения;

  • произведенные действия;

  • конфигурация кластера после вызова утилиты.

Пример использования утилиты Cache Configurations Migration Tool#

Данный пример содержит конфигурацию серверного и клиентского узлов, а также конфигурацию кешей для миграции на другой кластер.

Конфигурация серверного узла

Имя файла: server-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
    Ignite Spring configuration file.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
       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">
    <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="igniteInstanceName" value="server"/>

        <property name="localHost" value="127.0.0.1"/>

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <value>127.0.0.1:47500..47501</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>

        <property name="dataStorageConfiguration" >
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="persistenceEnabled" value="true"/>
                    </bean>
                </property>
            </bean>
        </property>
<!--Ниже приводится пример кеш-конфигурации. Поддерживается изменение уже существующих кеш-конфигураций, даже если они статические. Ниже приводится пример такого кеша, запущенного на кластере. -->
        <property name="cacheConfiguration">
            <list>
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="test-static-cache"/>

                    <property name="queryEntities">
                        <list>
                            <bean class="org.apache.ignite.cache.QueryEntity">
                                <property name="keyType" value="java.lang.Long"/>
                                <property name="keyFieldName" value="id"/>
                                <property name="valueType" value="org.apache.ignite.migration.model.Person"/>

                                <property name="fields">
                                    <map>
                                        <entry key="id" value="java.lang.Long"/>
                                        <entry key="orgId" value="java.lang.Integer"/>
                                    </map>
                                </property>
                            </bean>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>
</beans>

Конфигурация клиентского узла

Конфигурация клиентского узла используется для подключения утилиты к кластеру.

Имя файла: client-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
    Ignite Spring configuration file.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
       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">
    <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="igniteInstanceName" value="client"/>

        <property name="clientMode" value="true"/>

        <property name="localHost" value="127.0.0.1"/>

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <value>127.0.0.1:47500..47501</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>

Конфигурация кешей

Имя файла: cache-configurations.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
    Ignite configuration.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
       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">
    <!-- Configure new cache. -->
    <bean class="org.apache.ignite.configuration.CacheConfiguration">
        <property name="name" value="new-cache1"/>
    </bean>

    <!-- Configure new cache. -->
    <bean class="org.apache.ignite.configuration.CacheConfiguration">
        <property name="name" value="new-cache2"/>
    </bean>

    <!-- Configure static cache. -->
    <bean class="org.apache.ignite.configuration.CacheConfiguration">
        <property name="name" value="test-static-cache"/>

        <!-- Change query entities -->
        <property name="queryEntities">
            <list>
                <bean class="org.apache.ignite.cache.QueryEntity">
                    <property name="keyType" value="java.lang.Long"/>
                    <property name="keyFieldName" value="id"/>
                    <property name="valueType" value="org.apache.ignite.migration.model.Person"/>

                    <property name="fields">
                        <map>
                            <entry key="id" value="java.lang.Long"/>
                            <entry key="name" value="java.lang.String"/>
                        </map>
                    </property>

                    <property name="indexes">
                        <list>
                            <!-- Single field (aka. column) index -->
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg value="name"/>
                            </bean>
                            <!-- Group index. -->
                            <bean class="org.apache.ignite.cache.QueryIndex">
                                <constructor-arg>
                                    <list>
                                        <value>id</value>
                                        <value>name</value>
                                    </list>
                                </constructor-arg>
                                <constructor-arg value="SORTED"/>
                            </bean>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>
</beans>

Запуск утилиты

  1. Перед запуском утилиты активируйте кластер при помощи вызова утилиты control.sh. На неактивном кластере утилита работать не будет и выдаст ошибку.

  2. Запустите утилиту при помощи следующей команды:

    bin/migrate-cache-configuration.sh config/client-config.xml config/cache-configurations.xml
    

    Примечание

    Параметр config/client-config.xml необходим для подключения к кластеру. Параметр config/cache-configurations.xml необходим для самой миграции.

После запуска утилиты лог Platform V Data Grid выводится в консоль, а лог утилиты записывается в отдельный файл. Логирование реализовано через log4j2:

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
    ...
    <property name="gridLogger">
        <bean class="org.apache.ignite.logger.log4j2.Log4J2Logger">
            <constructor-arg type="java.lang.String" value="config/ignite-log4j2.xml"/>
        </bean>
    </property>
    ...
</bean>

Логирование осуществляется через сконфигурированный IgniteLogger.

В логах утилиты записана информация о кластере до выполнения миграции (таблицы, колонки и индексы), изменения, обнаруженные утилитой, а также сообщение о том, что изменения не будут применены, поскольку при запуске не был указан ключ --migrate.

Пример вывода

...
Cluster info before migration:
...
Cache configurations changes:
New caches:
[cacheName=new-cache1]
[cacheName=new-cache2]
Table changes [cacheName=test-static-cache, tableName=test-static-cache]
Dropped fields:
[name=ORGID]
New fields:
[name=name, type=java.lang.String]
New indexes:
[indexName=PERSON_NAME_ASC_IDX]
[indexName=PERSON_ID_ASC_NAME_ASC_IDX]
...
New caches created [cacheNames=[new-cache1, new-cache2]]
Executed SQL [sql=ALTER TABLE PERSON DROP COLUMN IF EXISTS "ORGID"]
Executed SQL [sql=ALTER TABLE PERSON ADD COLUMN IF NOT EXISTS "NAME" VARCHAR]
Executed SQL [sql=CREATE INDEX IF NOT EXISTS PERSON_NAME_ASC_IDX ON PERSON ("name" ASC)]
Executed SQL [sql=CREATE INDEX IF NOT EXISTS PERSON_ID_ASC_NAME_ASC_IDX ON PERSON ("id" ASC, "name" ASC)]
...
Cluster info after migration:
...

События системного журнала#

Событие

Запись

Описание

crd=true

2020-10-06 17:37:16.901 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Finished exchange init [topVer=AffinityTopologyVersion [topVer=1, minorTopVer=0], crd=true]

Успешное завершение обмена топологиями с узлом-координатором

Added new node to topology

2020-10-06 17:43:43.595 [INFO ][disco-event-worker-#56][org.apache.ignite.internal.managers.discovery.GridDiscoveryManager] Added new node to topology: TcpDiscoveryNode [id=2d2103cb-c6d0-46ee-ad44-9a4010da765d, consistentId=10.53.116.114,127.0.0.1:47500, addrs=ArrayList [10.53.116.114, 127.0.0.1], sockAddrs=HashSet [tkles-pprb00123.vm.esrt.cloud.sbrf.ru/10.53.116.114:47500, /127.0.0.1:47500], discPort=47500, order=2, intOrder=2, lastExchangeTime=1601995423434, loc=false, ver=2.8.1#20200914-sha1:602ccc45, isClient=false]

В топологию добавлен новый узел

Node left topology

2020-10-06 17:48:00.828 [INFO ][disco-event-worker-#56][org.apache.ignite.internal.managers.discovery.GridDiscoveryManager] Node left topology: TcpDiscoveryNode [id=2d2103cb-c6d0-46ee-ad44-9a4010da765d, consistentId=10.53.116.114,127.0.0.1:47500, addrs=ArrayList [10.53.116.114, 127.0.0.1], sockAddrs=HashSet [tkles-pprb00123.vm.esrt.cloud.sbrf.ru/10.53.116.114:47500, /127.0.0.1:47500], discPort=47500, order=2, intOrder=2, lastExchangeTime=1601995423434, loc=false, ver=2.8.1#20200914-sha1:602ccc45, isClient=false]

Узел покинул топологию

Sending activate request

2020-10-06 17:54:27.906 [INFO ][rest-#171][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Sending activate request with BaselineTopology BaselineTopology [id=0, branchingHash=533127586, branchingType='Cluster activation', baselineNodes=[10.53.116.77,127.0.0.1:47500]]
2020-10-06 17:54:27.908 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Received activate request with BaselineTopology[id=0]
2020-10-06 17:54:27.908 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Started state transition: true
2020-10-06 17:54:27.909 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Started exchange init [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], crd=true, evt=DISCOVERY_CUSTOM_EVT, evtNode=0d1f5011-4540-473b-aced-8c7c911f86a3, customEvt=ChangeGlobalStateMessage [id=45a585ef471-773de86e-722e-45e4-9228-38bbf24f0d82, reqId=64cea40a-356d-4c84-b651-fd0b50c5f3a7, initiatingNodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, secSubjId=null, activate=true, baselineTopology=BaselineTopology [id=0, branchingHash=533127586, branchingType='Cluster activation', baselineNodes=[10.53.116.77,127.0.0.1:47500]], forceChangeBaselineTopology=false, timestamp=1601996067906], allowMerge=false, exchangeFreeSwitch=false]
2020-10-06 17:54:27.909 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Start activation process [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]
2020-10-06 17:54:27.910 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager] Configured data regions initialized successfully [total=3]
2020-10-06 17:54:27.912 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager] Configured data regions started successfully [total=3]
2020-10-06 17:54:27.912 [INFO ][exchange-worker-#58][org.apache.ignite.cache.msg] Components activation performed in 3 ms.
2020-10-06 17:54:27.915 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Started cache [name=ignite-sys-cache, id=-2100569601, dataRegionName=sysMemPlc, mode=REPLICATED, atomicity=TRANSACTIONAL, backups=2147483647, mvcc=false]
2020-10-06 17:54:27.916 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Successfully activated caches [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]
2020-10-06 17:54:27.917 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], waitTime=0ms, futInfo=NA, mode=LOCAL]
2020-10-06 17:54:27.964 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] finishExchangeOnCoordinator [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]
2020-10-06 17:54:27.967 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finish exchange future [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], err=null, rebalanced=true, wasRebalanced=false]
2020-10-06 17:54:27.968 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Finish proxy initialization, cacheName=ignite-sys-cache, localNodeId=0d1f5011-4540-473b-aced-8c7c911f86a3
2020-10-06 17:54:27.969 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Received state change finish message: true
2020-10-06 17:54:27.982 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Completed partition exchange [localNode=0d1f5011-4540-473b-aced-8c7c911f86a3, exchange=GridDhtPartitionsExchangeFuture [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], evt=DISCOVERY_CUSTOM_EVT, evtNode=TcpDiscoveryNode [id=0d1f5011-4540-473b-aced-8c7c911f86a3, consistentId=10.53.116.77,127.0.0.1:47500, addrs=ArrayList [10.53.116.77, 127.0.0.1], sockAddrs=HashSet [/127.0.0.1:47500, tkles-pprb00116.vm.esrt.cloud.sbrf.ru/10.53.116.77:47500], discPort=47500, order=1, intOrder=1, lastExchangeTime=1601995680820, loc=true, ver=2.8.1#20200914-sha1:602ccc45, isClient=false], done=true, newCrdFut=null], topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]
2020-10-06 17:54:27.982 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange timings [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], stage="Waiting in exchange queue" (0 ms), stage="Exchange parameters initialization" (0 ms), stage="Update caches registry" (3 ms), stage="Start caches" (3 ms), stage="Affinity initialization on cache group start" (0 ms), stage="Determine exchange type" (0 ms), stage="Preloading notification" (0 ms), stage="WAL history reservation" (0 ms), stage="Wait partitions release" (0 ms), stage="After states restored callback" (47 ms), stage="Waiting for all single messages" (0 ms), stage="Affinity recalculation (crd)" (0 ms), stage="Collect update counters and create affinity messages" (0 ms), stage="Validate partitions states" (0 ms), stage="Assign partitions states" (0 ms), stage="Ideal affinity diff calculation (enforced)" (0 ms), stage="Apply update counters" (0 ms), stage="Full message preparing" (1 ms), stage="Full message sending" (0 ms), stage="State finish message sending" (0 ms), stage="Exchange done" (14 ms), stage="Total time" (68 ms)]
2020-10-06 17:54:27.982 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange longest local stages [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], stage="Affinity initialization on cache group start [grp=ignite-sys-cache]" (0 ms) (parent=Affinity initialization on cache group start), stage="Affinity centralized initialization (crd) [grp=ignite-sys-cache, crd=true]" (0 ms) (parent=Determine exchange type), stage="Affinity recalculation (partitions availability) [grp=ignite-sys-cache]" (0 ms) (parent=Ideal affinity diff calculation (enforced))]
2020-10-06 17:54:27.983 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Finished exchange init [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], crd=true]
2020-10-06 17:54:27.983 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager] Skipping rebalancing (nothing scheduled) [top=AffinityTopologyVersion [topVer=3, minorTopVer=2], force=false, evt=DISCOVERY_CUSTOM_EVT, node=0d1f5011-4540-473b-aced-8c7c911f86a3]
2020-10-06 17:54:27.997 [INFO ][sys-#169][org.apache.ignite.internal.cluster.DistributedBaselineConfiguration] Baseline auto-adjust is 'enabled' with timeout='0' ms
2020-10-06 17:54:27.997 [INFO ][sys-#169][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Successfully performed final activation steps [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]

Запрос на активацию кластера

Sending deactivate request

2020-10-06 17:56:59.425 [INFO ][rest-#185][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Sending deactivate request with BaselineTopology null
2020-10-06 17:56:59.426 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Received deactivate request with BaselineTopology: null
2020-10-06 17:56:59.426 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Started state transition: false
2020-10-06 17:56:59.427 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Started exchange init [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], crd=true, evt=DISCOVERY_CUSTOM_EVT, evtNode=0d1f5011-4540-473b-aced-8c7c911f86a3, customEvt=ChangeGlobalStateMessage [id=20b585ef471-773de86e-722e-45e4-9228-38bbf24f0d82, reqId=6c8ce4b2-90ab-4d16-b5a7-8e25ad37c4e0, initiatingNodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, secSubjId=null, activate=false, baselineTopology=null, forceChangeBaselineTopology=false, timestamp=1601996219425], allowMerge=false, exchangeFreeSwitch=false]
2020-10-06 17:56:59.427 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Start deactivation process [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]
2020-10-06 17:56:59.428 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Successfully deactivated data structures, services and caches [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]
2020-10-06 17:56:59.428 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], waitTime=0ms, futInfo=NA, mode=DISTRIBUTED]
2020-10-06 17:56:59.429 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partitions release latch: ServerLatch [permits=0, pendingAcks=HashSet [], super=CompletableLatch [id=CompletableLatchUid [id=exchange, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]]]
2020-10-06 17:56:59.429 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], waitTime=0ms, futInfo=NA, mode=LOCAL]
2020-10-06 17:56:59.429 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] finishExchangeOnCoordinator [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]
2020-10-06 17:56:59.432 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finish exchange future [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], err=null, rebalanced=false, wasRebalanced=true]
2020-10-06 17:56:59.433 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Stopped cache [cacheName=ignite-sys-cache]
2020-10-06 17:56:59.434 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Received state change finish message: false
2020-10-06 17:56:59.437 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Completed partition exchange [localNode=0d1f5011-4540-473b-aced-8c7c911f86a3, exchange=GridDhtPartitionsExchangeFuture [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], evt=DISCOVERY_CUSTOM_EVT, evtNode=TcpDiscoveryNode [id=0d1f5011-4540-473b-aced-8c7c911f86a3, consistentId=10.53.116.77,127.0.0.1:47500, addrs=ArrayList [10.53.116.77, 127.0.0.1], sockAddrs=HashSet [/127.0.0.1:47500, tkles-pprb00116.vm.esrt.cloud.sbrf.ru/10.53.116.77:47500], discPort=47500, order=1, intOrder=1, lastExchangeTime=1601995680820, loc=true, ver=2.8.1#20200914-sha1:602ccc45, isClient=false], done=true, newCrdFut=null], topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]
2020-10-06 17:56:59.438 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange timings [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], stage="Waiting in exchange queue" (0 ms), stage="Exchange parameters initialization" (0 ms), stage="Update caches registry" (0 ms), stage="Start caches" (0 ms), stage="Affinity initialization on cache group start" (0 ms), stage="Determine exchange type" (0 ms), stage="Preloading notification" (0 ms), stage="WAL history reservation" (0 ms), stage="Wait partitions release" (0 ms), stage="Wait partitions release latch" (0 ms), stage="Wait partitions release" (0 ms), stage="After states restored callback" (0 ms), stage="Waiting for all single messages" (0 ms), stage="Affinity recalculation (crd)" (0 ms), stage="Collect update counters and create affinity messages" (0 ms), stage="Validate partitions states" (0 ms), stage="Apply update counters" (0 ms), stage="Full message preparing" (2 ms), stage="Full message sending" (0 ms), stage="State finish message sending" (0 ms), stage="Exchange done" (6 ms), stage="Total time" (8 ms)]
2020-10-06 17:56:59.438 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange longest local stages [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]]
2020-10-06 17:56:59.438 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Finished exchange init [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], crd=true]
2020-10-06 17:56:59.439 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager] Skipping rebalancing (nothing scheduled) [top=AffinityTopologyVersion [topVer=3, minorTopVer=3], force=false, evt=DISCOVERY_CUSTOM_EVT, node=0d1f5011-4540-473b-aced-8c7c911f86a3]

Запрос на деактивацию кластера

Partition Map Exchange crd node

2020-10-09 11:58:53.255 [INFO ][grid-timeout-worker-#23][org.apache.ignite.internal.IgniteKernal] FreeList [name=default##FreeList, buckets=256, dataPages=1, reusePages=1367]
2020-10-09 11:59:19.889 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Started exchange init [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], crd=true, evt=DISCOVERY_CUSTOM_EVT, evtNode=0aa67196-7cd2-4121-ad59-86a125c791db, customEvt=DynamicCacheChangeBatch [id=a8c1d290571-00c8b84a-af4b-41b3-8d03-0f079814104a, reqs=ArrayList [DynamicCacheChangeRequest [cacheName=Cache2, hasCfg=true, nodeId=0aa67196-7cd2-4121-ad59-86a125c791db, clientStartOnly=false, stop=false, destroy=false, disabledAfterStartfalse]], exchangeActions=ExchangeActions [startCaches=[Cache2], stopCaches=null, startGrps=[Cache2], stopGrps=[], resetParts=null, stateChangeRequest=null], startCaches=false, secSubjId=null], allowMerge=false, exchangeFreeSwitch=false]
2020-10-09 11:59:19.897 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Started cache [name=Cache2, id=2010787088, dataRegionName=default, mode=PARTITIONED, atomicity=ATOMIC, backups=0, mvcc=false]
2020-10-09 11:59:19.903 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], waitTime=0ms, futInfo=NA, mode=DISTRIBUTED]``2020-10-09 11:59:19.929 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partitions release latch: ServerLatch [permits=0, pendingAcks=HashSet [], super=CompletableLatch [id=CompletableLatchUid [id=exchange, topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2]]]]
2020-10-09 11:59:19.932 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], waitTime=0ms, futInfo=NA, mode=LOCAL]
2020-10-09 11:59:20.054 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Finished exchange init [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], crd=true]
2020-10-09 11:59:20.064 [INFO ][sys-#5847][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Coordinator received single message [ver=AffinityTopologyVersion [topVer=7, minorTopVer=2], node=4e9f9dee-9735-47d0-814d-e008f85a1889, remainingNodes=1, allReceived=false]
2020-10-09 11:59:20.068 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Coordinator received single message [ver=AffinityTopologyVersion [topVer=7, minorTopVer=2], node=b073551f-6755-4ff8-a161-91eeb403d0a3, allReceived=true]
2020-10-09 11:59:20.069 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] finishExchangeOnCoordinator [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=7, minorTopVer=2]]
2020-10-09 11:59:20.076 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finish exchange future [startVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], err=null, rebalanced=true, wasRebalanced=true]
2020-10-09 11:59:20.080 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Finish proxy initialization, cacheName=Cache2, localNodeId=0aa67196-7cd2-4121-ad59-86a125c791db
2020-10-09 11:59:20.080 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Completed partition exchange [localNode=0aa67196-7cd2-4121-ad59-86a125c791db, exchange=GridDhtPartitionsExchangeFuture [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], evt=DISCOVERY_CUSTOM_EVT, evtNode=TcpDiscoveryNode [id=0aa67196-7cd2-4121-ad59-86a125c791db, consistentId=10.53.116.77,127.0.0.1:47500, addrs=ArrayList [10.53.116.77, 127.0.0.1], sockAddrs=HashSet [/127.0.0.1:47500, tkles-pprb00116.vm.esrt.cloud.sbrf.ru/10.53.116.77:47500], discPort=47500, order=2, intOrder=2, lastExchangeTime=1602233959892, loc=true, ver=2.8.1#20200914-sha1:602ccc45, isClient=false], done=true, newCrdFut=null], topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2]]
2020-10-09 11:59:20.080 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange timings [startVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], stage="Waiting in exchange queue" (0 ms), stage="Exchange parameters initialization" (0 ms), stage="Update caches registry" (0 ms), stage="Start caches" (7 ms), stage="Affinity initialization on cache group start" (5 ms), stage="Determine exchange type" (0 ms), stage="Preloading notification" (0 ms), stage="WAL history reservation" (0 ms), stage="Wait partitions release" (0 ms), stage="Wait partitions release latch" (25 ms), stage="Wait partitions release" (2 ms), stage="After states restored callback" (122 ms), stage="Waiting for all single messages" (14 ms), stage="Affinity recalculation (crd)" (0 ms), stage="Collect update counters and create affinity messages" (0 ms), stage="Validate partitions states" (0 ms), stage="Assign partitions states" (1 ms), stage="Apply update counters" (0 ms), stage="Full message preparing" (4 ms), stage="Full message sending" (0 ms), stage="Exchange done" (3 ms), stage="Total time" (183 ms), Discovery lag=1385956 ms, Latest started node id=0aa67196-7cd2-4121-ad59-86a125c791db]
2020-10-09 11:59:20.080 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange longest local stages [startVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], stage="Affinity initialization on cache group start [grp=Cache2]" (5 ms) (parent=Affinity initialization on cache group start)]
2020-10-09 11:59:20.082 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager] Skipping rebalancing (nothing scheduled) [top=AffinityTopologyVersion [topVer=7, minorTopVer=2], force=false, evt=DISCOVERY_CUSTOM_EVT, node=0aa67196-7cd2-4121-ad59-86a125c791db]

PME. Журнал узла-координатора

Starting rebalance routine

2020-10-08 19:58:07.049 [INFO ][sys-#64][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemander] Starting rebalance routine [ignite-sys-cache, topVer=AffinityTopologyVersion [topVer=5, minorTopVer=0], supplier=0aa67196-7cd2-4121-ad59-86a125c791db, fullPartitions=[0-99], histPartitions=[]]

Начало процесса ребалансировки

Completed rebalance future

2020-10-08 19:58:07.074 [INFO ][rebalance-#69][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemander] Completed rebalance future: RebalanceFuture [grp=CacheGroupContext [grp=ignite-sys-cache], topVer=AffinityTopologyVersion [topVer=5, minorTopVer=0], rebalanceId=1, routines=1, receivedBytes=1200, receivedKeys=0, partitionsLeft=0, startTime=1602176287046, endTime=-1, lastCancelledTime=-1]

RebalanceFuture завершен

>>>Transaction

2020-06-13 23:31:15.474[WARN ][grid-timeout-worker-#119%DPL_GRID%DplGridNodeName%][o.apache.ignite.internal.diagnostic] >>> Transaction [startTime=23:30:08.115, curTime=23:31:15.471, systemTime=67347, userTime=9, tx=GridNearTxLocal [mappings=IgniteTxMappingsSingleImpl [mapping=GridDistributedTxMapping [entries=LinkedHashSet [IgniteTxEntry [txKey=IgniteTxKey [cacheId=-2100569601], val=TxEntryValueHolder [op=TRANSFORM], prevVal=TxEntryValueHolder [op=NOOP], oldVal=TxEntryValueHolder [op=NOOP], entryProcessorsCol=LinkedList [T2 {org.gridgain.grid.internal.processors.security.GridEntSecurityProcessor$AddSubjectNode@b205f19=Object[] []}], ttl=-1, conflictExpireTime=-1, conflictVer=null, explicitVer=null, dhtVer=null, filters=CacheEntryPredicate[] [], filtersPassed=false, filtersSet=true, entry=GridCacheMapEntry [ver=GridCacheVersion [topVer=0, order=0, nodeOrder=0], hash=278770679, extras=null, flags=0]GridDistributedCacheEntry [super=]GridDhtDetachedCacheEntry [super=], prepared=0, locked=false, nodeId=4d40a649-681c-42f8-8f11-85f471ec21da, locMapped=false, expiryPlc=null, transferExpiryPlc=false, flags=0, partUpdateCntr=0, serReadVer=null, xidVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40]]], explicitLock=false, dhtVer=null, last=false, nearEntries=0, clientFirst=false, node=4d40a649-681c-42f8-8f11-85f471ec21da]], nearLocallyMapped=false, colocatedLocallyMapped=false, needCheckBackup=null, hasRemoteLocks=false, trackTimeout=false, systemTime=0, systemStartTime=10318651595673684, prepareStartTime=10318651595673938, prepareTime=0, commitOrRollbackStartTime=0, commitOrRollbackTime=0, txDumpsThrottling=o.a.i.i.processors.cache.transactions.IgniteTxManager$TxDumpsThrottling@54e45a49, lb=null, thread=<failed to find active thread 19506012>, mappings=IgniteTxMappingsSingleImpl [mapping=GridDistributedTxMapping [entries=LinkedHashSet [IgniteTxEntry [txKey=IgniteTxKey [cacheId=-2100569601], val=TxEntryValueHolder [op=TRANSFORM], prevVal=TxEntryValueHolder [op=NOOP], oldVal=TxEntryValueHolder [op=NOOP], entryProcessorsCol=LinkedList [T2 {org.gridgain.grid.internal.processors.security.GridEntSecurityProcessor$AddSubjectNode@b205f19=Object[] []}], ttl=-1, conflictExpireTime=-1, conflictVer=null, explicitVer=null, dhtVer=null, filters=CacheEntryPredicate[] [], filtersPassed=false, filtersSet=true, entry=GridCacheMapEntry [ver=GridCacheVersion [topVer=0, order=0, nodeOrder=0], hash=278770679, extras=null, flags=0]GridDistributedCacheEntry [super=]GridDhtDetachedCacheEntry [super=], prepared=0, locked=false, nodeId=4d40a649-681c-42f8-8f11-85f471ec21da, locMapped=false, expiryPlc=null, transferExpiryPlc=false, flags=0, partUpdateCntr=0, serReadVer=null, xidVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40]]], explicitLock=false, dhtVer=null, last=false, nearEntries=0, clientFirst=false, node=4d40a649-681c-42f8-8f11-85f471ec21da]], super=GridDhtTxLocalAdapter [nearOnOriginatingNode=false, nearNodes=KeySetView [], dhtNodes=KeySetView [], explicitLock=false, super=IgniteTxLocalAdapter [completedBase=null, sndTransformedVals=false, depEnabled=false, txState=IgniteTxImplicitSingleStateImpl [init=true, recovery=false], super=IgniteTxAdapter [xidVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40], writeVer=null, implicit=true, loc=true, threadId=19506012, startTime=1592080208115, nodeId=48cf019e-0798-48ac-8c88-4f43e5908388, startVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40], endVer=null, isolation=READ_COMMITTED, concurrency=OPTIMISTIC, timeout=0, sysInvalidate=false, sys=true, plc=5, commitVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40], finalizing=NONE, invalidParts=null, state=PREPARING, timedOut=false, topVer=AffinityTopologyVersion [topVer=592, minorTopVer=0], skipCompletedVers=false, duration=67356ms, onePhaseCommit=false], size=1]]]]

LRT

deadlock

Deadlock: true
Completed: 298100 <br> Thread [name=""sys-stripe-3-#4"", id=23, state=WAITING, blockCnt=579, waitCnt=234477]
Lock [object=java.util.concurrent.locks.ReentrantLock$NonfairSync@6a5e882b, ownerName=sys-stripe-6-#7, ownerId=26]
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
at o.a.i.i.processors.cache.GridCacheMapEntry.lockEntry(GridCacheMapEntry.java:5033)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.lockEntries(GridDhtAtomicCache.java:3093)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal0(GridDhtAtomicCache.java:1806)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal(GridDhtAtomicCache.java:1714)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.processNearAtomicUpdateRequest(GridDhtAtomicCache.java:3301)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.access$400(GridDhtAtomicCache.java:141)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:273)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:268)
at o.a.i.i.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:1142)
at o.a.i.i.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:591)
at o.a.i.i.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:392)
at o.a.i.i.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:318)
at o.a.i.i.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:109)
at o.a.i.i.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:308)
at o.a.i.i.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1843)
at o.a.i.i.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1468)
at o.a.i.i.managers.communication.GridIoManager.access$5200(GridIoManager.java:229)
at o.a.i.i.managers.communication.GridIoManager$9.run(GridIoManager.java:1365)
at o.a.i.i.util.StripedExecutor$Stripe.body(StripedExecutor.java:555)
at o.a.i.i.util.worker.GridWorker.run(GridWorker.java:120) <br> at java.lang.Thread.run(Thread.java:748)

Взаимная блокировка

Cluster-wide snapshot operation started

[IgniteSnapshotManager] Cluster-wide snapshot operation started [snpName=MySnapshot, grps=[1794698200]]

Запуск операции создания снимка

Cluster-wide snapshot operation finished successfully

[IgniteSnapshotManager] Cluster-wide snapshot operation finished successfully: SnapshotOperationRequest [rqId=1a24fa7d-4e50-4714-ae68-959892c6d5a3, srcNodeId=b7b71afb-32c5-4730-b0dc-5090920cf4f0, snpName=MySnapshot, grpIds=ArrayList [1794698200], bltNodes=HashSet [b7b71afb-32c5-4730-b0dc-5090920cf4f0], err=null]

Завершение операции создания снимка

События мониторинга#

Введение#

Под мониторингом кластера Platform V DataGrid понимается мониторинг каждого узла топологии (как серверных, так и клиентских).

Основной задачей мониторинга является отслеживание критически важных атрибутов системы и оповещение администраторов при наличии проблем.

Помимо мониторинга кластера, рекомендуется производить мониторинг JVM и ОС, в рамках которых происходит запуск Platform V DataGrid.

Platform V DataGrid имеет несколько механизмов мониторинга:

  • Legacy;

  • New Metrics System;

  • System Views.

Legacy#

Под Legacy понимают подход публикации метрик, который использовался до версии Platform V DataGrid 2.8.

Метрики при данном подходе публикуются преимущественно через JMX.

При данном подходе разработчик сам определяет:

  • формат имени метрики;

  • тип метрики;

  • способ публикации.

Доступ к метрикам осуществляется через JMX.

Архитектура legacy-системы#

Через JMX доступно следующее дерево групп метрик:

Имя группы

Описание

"Persistent Store"

Метрики PDS (Persistent Data Store)

"SQL Query"

Свойства Timeout для SQL

"Thread Pools"

Метрики системных потоков

Baseline

Свойства Baseline

Clients

Информация об подключенных тонких клиентах

"Cache groups"

Метрики кеш-групп

DataRegionMetrics

Метрики Data Region

DataStorage

Дополнительные свойства PDS

Encryption

Информация об ключах безопасности

IgniteCluster

Информация об идентификации кластера

Kernal

Метрики локального узла Platform V DataGrid и кластера Platform V DataGrid

SPIs

Метрики различных подсистем (SPI) Platform V DataGrid

TransactionMetrics

Метрики транзакций

Transactions

Настройки свойств транзакций (Timeout/Threshold)

Security

Метрики плагина безопасности

%Имя_кеша%

Метрики кеша

Описание метрик доступно в официальной документации Apache Ignite.

New Metrics System#

Начиная с версии Platform V DataGrid 2.8, доступен новый механизм сбора метрик — New Metrics System. Он заменяет собой старую систему сбора метрик — Legacy. Данный механизм доступен и в Platform V DataGrid.

У каждой метрики в системе есть название и значение, которое она возвращает. Это значение может быть представлено в виде переменных типов long, String или double, либо в виде Java-объекта. Некоторые метрики представлены в виде гистограмм.

Благодаря появлению New Metrics System, стало возможным экспортировать метрики, используя различные технологии, например:

  • JMX;

  • SQL View;

  • Prometheus (http);

  • OpenCensus.

Примечание:

В New Metrics System предусмотрена возможность создания пользовательских экспортеров при помощи интерфейса MetricExporterSpi.

Архитектура New Metrics System#

В New Metrics System применены следующие решения относительно архитектуры:

  • В отличие от legacy-системы, метрики в New Metrics System — локальные. Они отражают состояние конкретного узла, на котором выполняется мониторинг.

    Данный подход обусловлен тем, что при использовании глобальных метрик Platform V DataGrid занимался подсчетом метрики для всего кластера, и это было затратной операцией, так как кластер может состоять из множества узлов.

  • В New Metrics System используется иерархическая структура метрик.

    Использование такой системы обусловлено наличием в Platform V DataGrid множества различных подсистем (SPI) на разных уровнях. Каждая из этих подсистем имеет определенный набор метрик. Среди этих подсистем есть те, которые обладают собственной иерархией, например, кеш. Метрики кеша собираются отдельно для каждого кеша, а не для всех сразу.

  • Был разработан стандарт названия метрик. Он основан на иерархической структуре метрик: <register_name>.<metric_name>.

    Пример:

    tx.LastCommitTime

    где:

    • tx – имя регистра;

    • LastCommitTime – имя метрики.

В New Metrics System доступно следующее дерево групп метрик:

Имя регистра

Описание

cache.{cache_name}.{near}

Метрики кеша

cacheGroups.{group_name}

Метрики кеш-группы

cluster

Метрики кластера

communication

Метрики Communication SPI

compute.jobs

Метрики вычислительных задач

ignite

Метрики локального узла

io.datastorage

IO метрики PDS

io.dataregion.{data_region_name}

IO метрики Data Region

io.communication

IO метрики Communication SPI

io.statistics.cacheGroups.{group_name}

IO метрики кеш-группы

pme

Метрики PME

snapshot

Метрики snapshot

sys

Системные метрики

threadPools.{thread_pool_name}

Метрики системных потоков

tx

Метрики транзакций

Описание метрик доступно в официальной документации Apache Ignite.

System Views#

Platform V DataGrid имеет ряд встроенных SQL-представлений, которые содержат информацию о процессах, протекающих внутри Platform V DataGrid. Доступ к метрикам осуществляется через SYS-схему.

Примечание:

Для доступа к данным, можно воспользоваться утилитой SQLLine:

./sqlline.sh -u jdbc:ignite:thin://127.0.0.1/SYS

Пример запроса данных по узлам:

`select * from NODES;`

В System Views доступно следующее дерево групп метрик:

Имя View

Описание

CACHES

Информация по кешам

CACHE_GROUPS

Информация по кеш-группам

TASKS

Информация о вычислительных задачах (TASKS)

JOBS

Информация о вычислительных задачах(JOBS) в рамках TASKS

SERVICES

Информация о сервисах

TRANSACTIONS

Информация о транзакциях

NODES

Информация об узлах

NODE_ATTRIBUTES

Информация об атрибутах узла

BASELINE_NODES

Информация о Baseline (базовой топологии)

CLIENT_CONNECTIONS

Информация о подключенных тонких клиентах

STRIPED_THREADPOOL_QUEUE

Информация о задачах в рамках striped thread pool (распределенного пула потоков)

DATASTREAM_THREADPOOL_QUEUE

Информация о задачах в рамках data streamer stripped thread pool

SCAN_QUERIES

Информация о запущенных scan queries

CONTINUOUS_QUERIES

Информация о запущенных continuous queries

SQL_QUERIES

Информация о запущенных SQL queries

SQL_QUERIES_HISTORY

Информация об истории выполнения SQL queries

SCHEMAS

Информация о схемах SQL

NODE_METRICS

Информация о метриках узла

TABLES

Информация о SQL tables

TABLE_COLUMNS

Информация о SQL table columns

VIEWS

Информация о SQL views

VIEW_COLUMNS

Информация о SQL views columns

INDEXES

Информация о SQL indexes

CACHE_GROUP_PAGE_LISTS

Информация о PAGE LISTS кеш-групп

DATA_REGION_PAGE_LISTS

Информация о PAGE LISTS в Data Region (области памяти)

PARTITION_STATES

Информация о состоянии партиций

BINARY_METADATA

Информация о существующих binary-типах

METASTORAGE

Информация о metastorage

Описание метрик доступно в официальной документации Apache Ignite.

Включение метрик#

Для доступа к метрикам по JMX включите возможность использования удаленного подключения к JVM:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1098
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Также рекомендуется отключать отображение CLASS LOADER ID в MBean-путях:

-DIGNITE_MBEAN_APPEND_CLASS_LOADER_ID=false`

Внимание

Если в рамках одной JVM происходит запуск нескольких экземпляров Platform V DataGrid, отключать отображение CLASS LOADER ID не рекомендуется.

Включение кеш-метрик#

Для включения сбора метрик по кешам явно укажите опцию statisticsEnabled со значением true.

Примечание

Данную опцию требуется указать для каждого кеша, по которому требуется получать статистику:

XML

<property name="cacheConfiguration">
    <list>
        <bean class="org.apache.ignite.configuration.CacheConfiguration">
            <property name="name" value="mycache"/>
            <property name="statisticsEnabled" value="true"/>
        </bean>
    </list>
</property>

Java

IgniteConfiguration cfg = new IgniteConfiguration();

CacheConfiguration cacheCfg = new CacheConfiguration("test-cache");

// Enable statistics for the cache.
cacheCfg.setStatisticsEnabled(true);

cfg.setCacheConfiguration(cacheCfg);

// Start the node.
Ignite ignite = Ignition.start(cfg);

Включение метрик для регионов данных#

Для включения сбора метрик по Data region явно укажите опцию metricsEnabled со значением true.

Примечание

Данную опцию нужно указать для каждого Data region, по которому требуется получать статистику.

Пример включения метрик для региона данных по умолчанию и одного дополнительного региона данных:

XML:

<bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
     <property name="dataStorageConfiguration">
         <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
             <property name="defaultDataRegionConfiguration">
                 <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                     <property name="metricsEnabled" value="true"/>
                 </bean>
             </property>
             <property name="dataRegionConfigurations">
                 <list>
                     <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                         <property name="name" value="myDataRegion"/>
                         <property name="metricsEnabled" value="true"/>
                         <property name="persistenceEnabled" value="true"/>
                     </bean>
                 </list>
             </property>
         </bean>
     </property>
</bean>

Java:

IgniteConfiguration cfg = new IgniteConfiguration();

DataStorageConfiguration storageCfg = new DataStorageConfiguration();

DataRegionConfiguration defaultRegion = new DataRegionConfiguration();
defaultRegion.setMetricsEnabled(true);

storageCfg.setDefaultDataRegionConfiguration(defaultRegion);

// Create a new data region.
DataRegionConfiguration regionCfg = new DataRegionConfiguration();

// Region name.
regionCfg.setName("myDataRegion");

// Enable metrics for this region.
regionCfg.setMetricsEnabled(true);

// Set the data region configuration.
storageCfg.setDataRegionConfigurations(regionCfg);

// Other properties

// Apply the new configuration.
cfg.setDataStorageConfiguration(storageCfg);

Ignite ignite = Ignition.start(cfg);

Включение Persistence-метрик#

Метрики, относящиеся к Persistence, также требуют указания опции metricsEnabled со значением true в org.apache.ignite.configuration.DataStorageConfiguration:

XML:

<bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
    <property name="dataStorageConfiguration">
        <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
            <property name="metricsEnabled" value="true"/>
               <property name="defaultDataRegionConfiguration">
                <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                    <property name="persistenceEnabled" value="true"/>
                </bean>
            </property>
        </bean>
    </property>
</bean>

Java

IgniteConfiguration cfg = new IgniteConfiguration();

DataStorageConfiguration storageCfg = new DataStorageConfiguration();
storageCfg.setMetricsEnabled(true);

// Apply the new configuration.
cfg.setDataStorageConfiguration(storageCfg);

Ignite ignite = Ignition.start(cfg);

Конфигурация экспортеров и включение метрик в New Metrics System#

Для включения возможности экспорта метрик укажите конкретный экспортер, который должна использовать подсистема метрик:

XML

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="metricExporterSpi">
        <list>
            <bean class="org.apache.ignite.spi.metric.jmx.JmxMetricExporterSpi"/>
            <bean class="org.apache.ignite.spi.metric.sql.SqlViewMetricExporterSpi"/>
            <bean class="org.apache.ignite.spi.metric.log.LogExporterSpi"/>
            <bean class="org.apache.ignite.spi.metric.opencensus.OpenCensusMetricExporterSpi"/>
        </list>
    </property>
</bean>

Java

IgniteConfiguration cfg = new IgniteConfiguration();

cfg.setMetricExporterSpi(new JmxMetricExporterSpi(), new SqlViewMetricExporterSpi());

Ignite ignite = Ignition.start(cfg);

Метрики в Platform V DataGrid#

Базовые задачи мониторинга в Platform V DataGrid включают в себя метрики. Для доступа к метрикам существует несколько подходов:

  • использование New Metrics System;

  • доступ к метрикам из кода;

  • использование System views.

Виды метрик в Platform V DataGrid#

Метрики в Platform V DataGrid бывают двух видов:

  • глобальные;

  • относящиеся к определенному узлу;

  • относящиеся к кешам.

Глобальные метрики#

Глобальные метрики предоставляют общую информацию о кластере, например, о количестве узлов и состоянии кластера.

Данная информация доступна на любом из узлов кластера.

Метрики, относящиеся к определенному узлу#

Данный вид метрик предоставляет информацию о конкретном узле кластера, на котором администратор запрашивает метрики. К примеру, такие метрики предоставляют информацию, касающуюся:

  • потребления памяти;

  • региона данных;

  • размера WAL-журнала;

  • размера очереди и т. д.

Метрики, относящиеся к кешам#

Метрики, относящиеся к кешам, могут быть как глобальными, так и относиться к определенному узлу.

Пример:

Общее количество записей - это глобальная метрика, и получить ее можно на любом узле.

Также можно получить количество записей в кеше определенного узла, но в этом случае метрика будет относиться к определенному узлу.

Включение метрик в Platform V DataGrid#

Внимание:

Сбор метрик – затратная операция, которая может привести к снижению производительности приложения. По этой причине некоторые метрики по умолчанию отключены.

Включение кеш-метрик#

Для включения кеш-метрик необходимо использовать любой из указанных ниже методов для каждого кеша, для которого необходим мониторинг:

XML

<property name="cacheConfiguration">
    <list>
        <bean class="org.apache.ignite.configuration.CacheConfiguration">
            <property name="name" value="mycache"/>
            <!-- Enable statistics for the cache. -->
            <property name="statisticsEnabled" value="true"/>
        </bean>
    </list>
</property>

Java

IgniteConfiguration cfg = new IgniteConfiguration();

CacheConfiguration cacheCfg = new CacheConfiguration("test-cache");

// Enable statistics for the cache.
cacheCfg.setStatisticsEnabled(true);

cfg.setCacheConfiguration(cacheCfg);

// Start the node.
Ignite ignite = Ignition.start(cfg);

C#/.NET

var cfg = new IgniteConfiguration
{
    CacheConfiguration = new[]
    {
        new CacheConfiguration("my-cache")
        {
            EnableStatistics = true
        }
    }
};

var ignite = Ignition.Start(cfg);

Для каждого кеша на узле Ignite создает два JMX Bean:

  1. bean, содержащий информацию о кеше на определенном узле.

  2. bean, содержащий общую информацию о кешах всех узлов кластера.

MBean с информацией о локальном кеше конкретного узла:

group=<Cache_Name>,name="org.apache.ignite.internal.processors.cache.CacheLocalMetricsMXBeanImpl"

Mbean с общей информацией о кешах всех узлов кластера:

 group=<Cache_Name>,name="org.apache.ignite.internal.processors.cache.CacheClusterMetricsMXBeanImpl"
Включение метрик для регионов данных#

Метрики регионов данных отражают информацию о регионах данных и включают в себя информацию об объеме памяти и размере хранилища в регионе.

Метрики региона данных можно включить двумя способами:

  1. В конфигурации региона данных.

    Пример включения метрик для одного региона данных по умолчанию и одного дополнительного региона данных:

    XML

    <bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <!-- enable mertrics for the default data region -->
                        <property name="metricsEnabled" value="true"/>
                        <!-- other properties -->
                    </bean>
                </property>
                <property name="dataRegionConfigurations">
                    <list>
                        <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                            <!-- Custom region name. -->
                            <property name="name" value="myDataRegion"/>
                            <!-- Enable metrics for this data region  -->
                            <property name="metricsEnabled" value="true"/>
    
                            <property name="persistenceEnabled" value="true"/>
                            <!-- other properties -->
                        </bean>
                    </list>
                </property>
            </bean>
        </property>
    </bean>
    

    Java

    IgniteConfiguration cfg = new IgniteConfiguration();
    
    DataStorageConfiguration storageCfg = new DataStorageConfiguration();
    
    DataRegionConfiguration defaultRegion = new DataRegionConfiguration();
    defaultRegion.setMetricsEnabled(true);
    
    storageCfg.setDefaultDataRegionConfiguration(defaultRegion);
    
    // Create a new data region.
    DataRegionConfiguration regionCfg = new DataRegionConfiguration();
    
    // Region name.
    regionCfg.setName("myDataRegion");
    
    // Enable metrics for this region.
    regionCfg.setMetricsEnabled(true);
    
    // Set the data region configuration.
    storageCfg.setDataRegionConfigurations(regionCfg);
    
    // Other properties
    
    // Apply the new configuration.
    cfg.setDataStorageConfiguration(storageCfg);
    
    Ignite ignite = Ignition.start(cfg);
    

    C#/.NET

    var cfg = new IgniteConfiguration
    {
        DataStorageConfiguration = new DataStorageConfiguration
        {
            DefaultDataRegionConfiguration = new DataRegionConfiguration
            {
                Name = DataStorageConfiguration.DefaultDataRegionName,
                MetricsEnabled = true
            },
            DataRegionConfigurations = new[]
            {
                new DataRegionConfiguration
                {
                    Name = "myDataRegion",
                    MetricsEnabled = true
                }
            }
        }
    };
    
    var ignite = Ignition.Start(cfg);
    
  2. используя JMX Beans.

    org.apache:group=DataRegionMetrics,name=<Data Region Name>
    
Включение метрик, относящихся к Persistence#

Метрики, относящиеся к Persistence, также можно включить или отключить двумя способами:

  1. В конфигурации хранилища:

    XML

    <bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
       <property name="dataStorageConfiguration">
           <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
    
             <!-- persistent storage metrics -->
               <property name="metricsEnabled" value="true"/>
    
               <property name="defaultDataRegionConfiguration">
                   <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                       <property name="persistenceEnabled" value="true"/>
    
                       <!-- enable mertrics for the default data region -->
                       <!--property name="metricsEnabled" value="true"/-->
                       <!-- other properties -->
                   </bean>
               </property>
           </bean>
       </property>
    </bean>
    

    Java

    IgniteConfiguration cfg = new IgniteConfiguration();
    
    DataStorageConfiguration storageCfg = new DataStorageConfiguration();
    storageCfg.setMetricsEnabled(true);
    
    // Apply the new configuration.
    cfg.setDataStorageConfiguration(storageCfg);
    
    Ignite ignite = Ignition.start(cfg);
    

    C#/.NET

    var cfg = new IgniteConfiguration
    {
        DataStorageConfiguration = new DataStorageConfiguration
        {
            MetricsEnabled = true
        }
    };
    
    var ignite = Ignition.Start(cfg);
    
  2. Используя следующий MXBean (во время работы приложения):

    org.apache:group="Persistent Store",name=DataStorageMetrics
    

    Операция

    Описание

    EnableMetrics

    Включение метрик постоянного хранилища данных

Метрики Legacy#

Использование оперативной памяти#

Имя

Тип

Описание

Покрытие

PagesFillFactor

float

Средний размер данных в страницах в качестве множителя размера страницы. Когда режим Native Persistence включен, данная метрика применяется только для постоянного хранилища (страниц, хранящихся на диске)

Узел

TotalUsedPages

long

Число используемых в текущий момент страниц с данными. Когда режим Native Persistence включен, данная метрика применяется только для постоянного хранилища (страниц, хранящихся на диске)

Узел

PhysicalMemoryPages

long

Число страниц, размещенных в ОЗУ

Узел

PhysicalMemorySize

long

Место, занятое в ОЗУ в байтах

Узел

Размер хранилища#

Когда включен режим Persistence, сохраняет все данные приложения на диске. Общее количество данных, которые каждый узел содержит на диске состоит из постоянного хранилища (данные приложений), файлы WAL-журнала, а также файлы архива WAL-журнала.

Размер постоянного хранилища#

Имя

Тип

Описание

Покрытие

TotalAllocatedSize

long

Место, занятое на диске для всего хранилища данных в байтах. Когда режим Persistence отключен, метрика показывает общий размер занятого пространства в ОЗУ

Узел

WalTotalSize

long

Общий размер WAL-файлов в байтах, включая файлы архива WAL-журнала

Узел

WalArchiveSegments

int

Число сегментов WAL-журнала в архиве

Узел

Размер региона данных#

Имя

Тип

Описание

Покрытие

TotalAllocatedSize

long

Место, занятое для конкретного региона данных в байтах. Когда режим Persistence отключен, метрика показывает общий размер занятого пространства в ОЗУ

Узел

PagesFillFactor

float

Среднее количество данных в страницах в качестве множителя размера страницы

Узел

TotalUsedPages

long

Число используемых в настоящий момент страниц с данными

Узел

PhysicalMemoryPages

long

Число страниц с данными в конкретном регионе данных, содержащееся в ОЗУ

Узел

PhysicalMemorySize

long

Занятое место в ОЗУ в байтах

Узел

Операция

Описание

enableMetrics

Включить сбор метрик для конкретного региона данных

disableMetrics

Отключить сбор метрик для конкретного региона данных

Размер кеш-группы#

Имя

Тип

Описание

Покрытие

TotalAllocatedSize

long

Место, занятое на конкретном узле для кеш-группы

Узел

Операции создания контрольных точек#

Имя

Тип

Описание

Покрытие

DirtyPages

long

Число страниц в памяти, которые были изменены, но еще не были синхронизированы с диском. Таке страницы будут записаны на диск при создании следующей контрольной точки

Узел

LastCheckpointDuration

long

Время, за которое была создана последняя контрольная точка (в миллисекундах)

Узел

CheckpointBufferSize

long

Размер буфера контрольной точки

Глобально

Ребалансировка#

Имя

Тип

Описание

Покрытие

RebalancingStartTime

long

Показывает время начала ребалансировки локальных партиций для кеша. Если локальные партиции не участвуют в ребалансировке, данная метрика возвращает 0. Время возвращается в миллисекундах

Узел

EstimatedRebalancingFinishTime

long

Ожидаеvое время завершения процесса ребалансировки

Узел

KeysToRebalanceLeft

long

Число ключей на узле, которые необходимо ребалансировать. Данную метрику можно отслеживать, чтобы понимать, когда заканчивается процесс ребалансировки

Узел

Топология#

Имя

Тип

Описание

Покрытие

TotalServerNodes

long

Число серверных узлов в кластере

Глобально

TotalClientNodes

long

Число клиентских узлов в кластере

Глобально

TotalBaselineNodes

long

Число узлов, зарегистрированных в базовой топологии. При отключении узла, он остается зарегистрированным в базовой топологии и удалять его необходимо вручную

Глобально

ActiveBaselineNodes

long

Число активных узлов в базовой топологии

Глобально

Имя

Тип

Описание

Покрытие

Coordinator

String

ID текущего узла координатора

Глобально

CoordinatorNodeFormatted

String

Подробная информация об узле-координаторе. Пример: TcpDiscoveryNode [id=e07ad289-ff5b-4a73-b3d4-d323a661b6d4, consistentId=fa65ff2b-e7e2-4367-96d9-fd0915529c25, addrs=[0:0:0:0:0:0:0:1%lo, 127.0.0.1, 172.25.4.200], sockAddrs=[mymachine.local/172.25.4.200:47500, /0:0:0:0:0:0:0:1%lo:47500, /127.0.0.1:47500], discPort=47500, order=2, intOrder=2, lastExchangeTime=1568187777249, loc=false, ver=8.7.5#20190520-sha1:d159cd7a, isClient=false]

кеши#

Имя

Тип

Описание

Покрытие

CacheSize

long

Общее количество записей в кеше по всем узлам в кластере

Глобально

CacheSize

long

Число записей кеша, сохраненных на локальном узле

Узел

Транзакции#

Имя

Тип

Описание

Покрытие

LockedKeysNumber

long

Число ключей, заблокированных на узле

Узел

TransactionsCommittedNumber

long

Число транзакций, зафиксированных на узле

Узел

TransactionsRolledBackNumber

long

Число транзакций, которые «откатились»

Узел

OwnerTransactionsNumber

long

Число транзакций, инициированных в узле

Узел

TransactionsHoldingLockNumber

long

Число открытых транзакций, которые имеют блокировку как минимум на один ключ на узле

Узел

Клиентские подключения#

Имя

Тип

Описание

Connections

java.util.List

Список строк. Каждая строка содержит информацию о подключении: JdbcClient [id=4294967297, user=<anonymous>, rmtAddr=127.0.0.1:39264, locAddr=127.0.0.1:10800]

Операция

Описание

dropConnection (id)

Отключить определенного клиента

dropAllConnections

Отключить всех клиентов

Очереди сообщений#

Когда очереди в пулах потоков растут, это означает, что узел не справляется с нагрузкой, либо что при обработке сообщений в очереди произошла ошибка. Постоянное увеличение очереди может привести к возникновению ошибки ООМ (OutOfMemoryError).

Очередь communication-сообщений#

Имя

Тип

Описание

Покрытие

OutboundMessagesQueueSize

int

Размер очереди исходящих communication-соообщений

Узел

Очередь discovery-сообщений#

Имя

Тип

Описание

Покрытие

MessageWorkerQueueSize

int

Размер очереди discovery-сообщений, ожидающих отправки на другие узлы

Узел

AvgMessageProcessingTime

long

Среднее время обработки сообщений

Узел

Метрики New Metrics System#

Система#

Имя реестра: sys

Имя

Тип

Описание

CpuLoad

double

Нагрузка на процессор

CurrentThreadCpuTime

long

ThreadMXBean.getCurrentThreadCpuTime()

CurrentThreadUserTime

long

ThreadMXBean.getCurrentThreadUserTime()

DaemonThreadCount

integer

ThreadMXBean.getDaemonThreadCount()

GcCpuLoad

double

Нагрузка на процессор при сборке мусора

PeakThreadCount

integer

ThreadMXBean.getPeakThreadCount

SystemLoadAverage

java.lang.Double

OperatingSystemMXBean.getSystemLoadAverage()

ThreadCount

integer

ThreadMXBean.getThreadCount

TotalExecutedTasks

long

Общее количество выполненных задач

TotalStartedThreadCount

long

ThreadMXBean.getTotalStartedThreadCount

UpTime

long

RuntimeMxBean.getUptime()

memory.heap.committed

long

MemoryUsage.getHeapMemoryUsage().getCommitted()

memory.heap.init

long

MemoryUsage.getHeapMemoryUsage().getInit()

memory.heap.used

long

MemoryUsage.getHeapMemoryUsage().getUsed()

memory.nonheap.committed

long

MemoryUsage.getNonHeapMemoryUsage().getCommitted()

memory.nonheap.init

long

MemoryUsage.getNonHeapMemoryUsage().getInit()

memory.nonheap.max

long

MemoryUsage.getNonHeapMemoryUsage().getMax()

memory.nonheap.used

long

MemoryUsage.getNonHeapMemoryUsage().getUsed()

Кеши#

Имя реестра: cache.{cache_name}.{near}

Имя

Тип

Описание

CacheEvictions

long

Общее число вытеснений из кеша

CacheGets

long

Общее число get-запросов к кешу

CacheHits

long

Число выполненных кешем get-запросов

CacheMisses

long

«Промах» (miss) – это невыполненный get-запрос

CachePuts

long

Общее число put-запросов к кешу

CacheRemovals

long

Общее число удалений из кеша

CacheTxCommits

long

Общее число фиксаций транзакций

CacheTxRollbacks

long

Общее число откатов транзакций

CacheSize

long

Размер локального кеша

CommitTime

histogram

Время фиксирования в наносекундах

CommitTimeTotal

long

Общее время фиксирования в наносекундах

EntryProcessorHits

long

Общее количество вызовов ключей, существующих в кеше

EntryProcessorInvokeTimeNanos

long

Общее время вызова кеша в наносекундах

EntryProcessorMaxInvocationTime

long

Максимальное время, требуемое для исполнения вызовов кеша

EntryProcessorMinInvocationTime

long

Минимальное время, требуемое для исполнения вызовов кеша

EntryProcessorMisses

long

Общее количество вызовов на ключи, которых нет в кеше

EntryProcessorPuts

long

Общее количество вызовов кеша, обусловленных обновлением

EntryProcessorReadOnlyInvocations

long

Общее количество вызовов кеша, обусловленных отсутствием обновлений

EntryProcessorRemovals

long

Общее количество вызовов кеша, обусловленных удалениями

EstimatedRebalancingKeys

long

Число ключей, которые необходимо ребалансировать

GetTime

histogram

Время get-запроса в наносекундах

GetTimeTotal

long

Общее количество get-запросов в кеше в наносекундах

HeapEntriesCount

long

Число записей в heap-памяти

IndexRebuildKeysProcessed

long

Число ключей с rebuilt-индексами

IsIndexRebuildInProgress

boolean

True if index build or rebuild is in progress

OffHeapBackupEntriesCount

long

Число backup-записей в offheap-памяти

OffHeapEntriesCount

long

количество записей в offheap-памяти

OffHeapEvictions

long

Общее количество вытеснений из offheap-памяти

OffHeapGets

long

Общее количество get-запросов offheap-памяти

OffHeapHits

long

Число get-запросов, выполненных heap-памятью

OffHeapMisses

long

Пропуск (miss) – get-запрос, невыполненный offheap-памятью

OffHeapPrimaryEntriesCount

long

Число первичных записей в offheap-памяти

OffHeapPuts

long

Общее число put-запросов к offheap-памяти

OffHeapRemovals

long

Общее количество удалений из offheap-памяти

PutTime

histogram

Время put-запроса в наносекундах

PutTimeTotal

long

Общее время cache put-запросов в наносеундах

QueryCompleted

long

Число завершенных запросов

QueryExecuted

long

Число выполненных запросов

QueryFailed

long

Число запросов, незавершенных из-за сбоя

QueryMaximumTime

long

Максимальное время исполнения запроса

QueryMinimalTime

long

Минимальное время исполнения запроса

QuerySumTime

long

Суммарное время запроса

RebalanceClearingPartitionsLeft

long

Число партиций, которые необходимо очистить перед началом ребалансировки

RebalanceStartTime

long

Время начала ребалансировки

RebalancedKeys

long

Число уже ребалансированных ключей

RebalancingBytesRate

long

Расчетная скорость ребалансировки в байтах

RebalancingKeysRate

long

Расчетная скорость ребалансировки в ключах

RemoveTime

histogram

Время remove-запроса в наносекундах

RemoveTimeTotal

long

общее время cache remove-запроса в наносекундах

RollbackTime

histogram

Время отката в наносекундах

RollbackTimeTotal

long

Общее время отката в наносекундах

TotalRebalancedBytes

long

Число уже ребалансированных байт

Группы кешей#

Имя реестра: cacheGroups.{group_name}

Имя

Тип

Описание

AffinityPartitionsAssignmentMap

java.util.Map

Карта назначения affinity-партиций

Caches

java.util.ArrayList

Список кешей

IndexBuildCountPartitionsLeft

long

Число обработанных партиций, необходимое для завершения создания индексов или их создания ихи реорганизации

LocalNodeMovingPartitionsCount

integer

Число партиций в состоянии MOVING для конкретной кеш-группы на конкретном узле

LocalNodeOwningPartitionsCount

integer

Число партиций в состоянии OWNING для конкретной кеш-группы на конкретном узле

LocalNodeRentingEntriesCount

long

Число записей, которые осталось выместить в RENTING-партиции для кеш-группы на конкретном узле

LocalNodeRentingPartitionsCount

integer

Число партиций в состоянии RENTING для конкретной кеш-группы на конкретном узле

MaximumNumberOfPartitionCopies

integer

Максимальное число копий всех партиций конкретной кеш-группы

MinimumNumberOfPartitionCopies

integer

Минимальное число копий всех для партиций конкретной кеш-группы

MovingPartitionsAllocationMap

java.util.Map

Карта распределения партиций со статусом MOVING в кластере

OwningPartitionsAllocationMap

java.util.Map

Карта распределения партиций со статусом OWNING в кластере

PartitionIds

java.util.ArrayList

ID локальных партиций

SparseStorageSize

long

Пространство в хранилище, настроенное на возможную низкую плотность данных в байтах

StorageSize

long

Пространство в хранилище, предназначенное для группы кешей в байтах

TotalAllocatedPages

long

Общее количество страниц, размещенных в кеш-группе

TotalAllocatedSize

long

Общий размер памяти, выделенной для кеш-группы в байтах

ReencryptionBytesLeft

long

Число байт, которые осталось перешифровать

ReencryptionFinished

boolean

Имя, обозначающий окончание перешифрования

Транзакции#

Имя реестра: tx

Имя

Тип

Описание

AllOwnerTransactions

java.util.HashMap

Карта транзакций в статусе OWNING на локальном узле

LockedKeysNumber

long

Число ключей, заблокированных на узле

OwnerTransactionsNumber

long

Число активных транзакций, для который узел является инициатором

TransactionsHoldingLockNumber

long

Число активных транзакций как минимум с одной блокировкой по ключу

LastCommitTime

long

Время последнего коммита

nodeSystemTimeHistogram

histogram

Системное время транзакций на узле в виде гистограммы

nodeUserTimeHistogram

histogram

Пользовательское время транзакций в виде гистограммы

LastRollbackTime

long

Время последнего отката

totalNodeSystemTime

long

Общее системное время транзакций на узле

totalNodeUserTime

long

Общее пользовательское время транзакций на узле

txCommits

integer

Число фиксаций транзакцийNumber of transaction commits

txRollbacks

integer

Число откатов транзакций

Обмен картами партиций (Partition Map Exchange (PME))#

Имя реестра: pme

Имя

Тип

Описание

CacheOperationsBlockedDuration

long

Продолжительность заблокированных текущих операций PME на кешах в миллисекундах

CacheOperationsBlockedDurationHistogram

histogram

Гистограмма продолжительности операций PME на кешах в миллисекундах

Duration

long

Продолжительность текущего PME в миллисекундах

DurationHistogram

histogram

Гистограмма продолжительности PME в миллисекундах

Compute Jobs#

Имя реестра: compute.jobs

Имя

Тип

Описание

compute.jobs.Active

long

Число активных джобов, исполняемых в настоящий момент

compute.jobs.Canceled

long

Число отмененных джобов, которые все еще запущены

compute.jobs.ExecutionTime

long

Общее время исполнения джобов

compute.jobs.Finished

long

Число завершенных джобов

compute.jobs.Rejected

long

Число джобов, отклоненных после самой свежей операции по устранению конфликтов

compute.jobs.Started

long

Число запущенных джобов

compute.jobs.Waiting

long

Число джобов в очереди на исполнение

compute.jobs.WaitingTime

long

Общее время, в течение которого джобы находились в очереди

Пулы потоков#

Имя реестра: threadPools.{thread_pool_name}

Имя

Тип

Описание

ActiveCount

long

Приблизительное число потоков, активно исполняющих задачи

CompletedTaskCount

long

Приблизительное общее количество выполненных задач

CorePoolSize

long

Базовое число потоков

KeepAliveTime

long

Keep-alive-время потока. Это время, в течение которого потоки, которые выходят за рамки базового размера пула потоков могут находиться в состоянии ожидания до завершения их работы

LargestPoolSize

long

Самое большое число потоков, одновременно присутствовавших в пуле

MaximumPoolSize

long

Максимально допустимое число потоков

PoolSize

long

Текущее число потоков в пуле

QueueSize

long

Текущий размер очереди на исполнение

RejectedExecutionHandlerClass

string

Имя класса для текущего обработчика отклонения выполнения

Shutdown

boolean

Верно, если текущий исполнитель отключен

TaskCount

long

Примерное общее число задач на исполнение

Terminated

boolean

Верно, если все задачи завершены с последующим отключением

Terminating

long

Верно, если завершается, но еще не завершено

ThreadFactoryClass

string

Имя класса для фабрики потоков используемой для создания новых потоков

I/O группы кешей#

Имя реестра: io.statistics.cacheGroups.{group_name}

Имя

Тип

Описание

LOGICAL_READS

long

Количество логических операций read

PHYSICAL_READS

long

Число физических операций read

grpId

integer

ID группыGroup id

name

string

Имя индекса

startTime

long

Время начала сбора статистики

Сортированные индексы#

Имя реестра: io.statistics.sortedIndexes.{cache_name}.{index_name}

Имя

Тип

Описание

LOGICAL_READS_INNER

long

Число логических read-операций для узла во внутреннем дереве

LOGICAL_READS_LEAF

long

Число логических read-операций для узла в дереве конечных объектов

PHYSICAL_READS_INNER

long

Число физических read-операций для узла во внутреннем дереве

PHYSICAL_READS_LEAF

long

Число физических read-операций для узла в дереве конечных объектов

indexName

string

Имя индекса

name

string

Имя кеша

startTime

long

Время начала сбора статистики

Хэш-индексы#

Имя реестра: io.statistics.hashIndexes.{cache_name}.{index_name}

Имя

Тип

Описание

LOGICAL_READS_INNER

long

Число логических read-операций для узла во внутреннем дереве

LOGICAL_READS_LEAF

long

Число логических read-операций для узла в дереве конечных объектов

PHYSICAL_READS_INNER

long

Число физических read-операций для узла во внутреннем дереве

PHYSICAL_READS_LEAF

long

Число физических read-операций для узла в дереве конечных объектов

indexName

string

Имя индекса

name

string

Имя кеша

startTime

long

Время начала сбора статистики

Communication I/O#

Имя реестра: io.communication

Имя

Тип

Описание

ActiveSessionsCount

integer

Число активных TCP-сессий

OutboundMessagesQueueSize

integer

Размер очереди исходящих сообщений

SentMessagesCount

integer

Число отправленных сообщений

SentBytesCount

long

Число отправленных байт

ReceivedBytesCount

long

Число полученных байт

ReceivedMessagesCount

integer

Число полученных сообщений

RejectedSslSessionsCount

integer

Число TCP-сессий, отклоненных из-за ошибок SSL (метрика экспортируется только при включенном SSL)

SslEnabled

boolean

Метрика показывает, включен ли SSL

SslHandshakeDurationHistogram

histogram

Гистограмма продолжительности SSL handshake в миллисекундах (метрика экспортируется только при включенном SSL)

Коннектор тонкого клиента Platform V DataGrid#

Имя реестра: client.connector

Имя

Тип

Описание

ActiveSessionsCount

integer

Число активных TCP-сессий

ReceivedBytesCount

long

Число полученных байт

RejectedSslSessionsCount

integer

Число TCP-сессий, отклоненных из-за ошибок SSL (метрика экспортируется только при включенном SSL)

RejectedSessionsTimeout

integer

Число TCP-сессий, отклоненных из-за таймаута handshake

RejectedSessionsAuthenticationFailed

integer

Число TCP-сессий, отклоненных из-за неудачной аутентификации

RejectedSessionsTotal

integer

Общее число отклоненных TCP-соединений

{clientType}.AcceptedSessions

integer

Количество успешно установленных соединений для клиента

{clientType}.ActiveSessions

integer

Число активных сессий для клиента

SentBytesCount

long

Число отправленных байт

SslEnabled

boolean

Метрика, показывающая, включен ли SSL

SslHandshakeDurationHistogram

histogram

Гистограмма продолжительности SSL handshake в миллисекундах (метрика экспортируется только при включенном SSL)

Коннектор REST-клиента Platform V DataGrid#

Имя реестра: rest.client

Имя

Тип

Описание

ActiveSessionsCount

integer

Число активных TCP-сессий

ReceivedBytesCount

long

Число полученных байт

RejectedSslSessionsCount

integer

Число TCP-сессий, отклоненных из-за ошибок SSL (метрика экспортируется только при включенном SSL)

SentBytesCount

long

Число отправленных байт

SslEnabled

boolean

Метрика, показывающая, включен ли SSL

SslHandshakeDurationHistogram

histogram

Гистограмма продолжительности SSL handshake в миллисекундах (метрика экспортируется только при включенном SSL)

Discovery I/O#

Имя реестра: io.discovery

Имя

Тип

Описание

CoordinatorSince

long

Временная отметка, после которой локальный узел стал узлом-координатором (метрика экспортируется только с серверных узлов)

Coordinator

UUID

ID координатора (метрика экспортируется только с серверных узлов)

CurrentTopologyVersion

long

Текущая версия топологии

JoinedNodes

integer

Число присоединившихся к топологии узлов

LeftNodes

integer

Число покинувших топологию узлов

MessageWorkerQueueSize

integer

Текущий размер очереди обработчика сообщений

PendingMessagesRegistered

integer

Число ожидающих зарегистрированных сообщений

RejectedSslConnectionsCount

integer

Число соединений TCP discovery, отклоненных из-за ошибок SSL

SslEnabled

boolean

Метрика, показывающая, включен ли SSL

TotalProcessedMessages

integer

Общее число обработанных сообщений

TotalReceivedMessages

integer

Общее число полученных сообщений

I/O региона данных#

Имя реестра: io.dataregion.{data_region_name}

Имя

Тип

Описание

AllocationRate

long

Соотношение распределения (страниц в секунду) в среднем по rateTimeInternal

CheckpointBufferSize

long

Размер буфера контрольных точек в байтах

DirtyPages

long

Число страниц в памяти, которые еще не были синхронизированы с постоянным хранилищем

EmptyDataPages

long

Метрика, подсчитывающая число пустых страниц с данными для конкретного региона данных. Метрика подсчитывает только свободные страницы, которые могут быть использованы повторно (например, страницы, содержащиеся в хранилище страниц для повторного использования)

EvictionRate

long

Уровень замещений (страниц в секунду)

LargeEntriesPagesCount

long

Количество страниц, занятых большими записями, размер которых превышает размер страницы

OffHeapSize

long

Размер offheap-памяти в байтах

OffheapUsedSize

long

Размер использованной offheap-памяти в байтах

PagesFillFactor

double

Процент использованного пространства

PagesRead

long

Число страниц, прочитанных после последнего перезапуска

PagesReplaceAge

long

Средний возраст страниц в памяти, по наступлении которого они замещаются страницами из постоянного хранилища (в миллисекундах)

PagesReplaceRate

long

Норма, при которой страницы в памяти замещаются страницами из постоянного хранилища (страниц в секунду)

PagesReplaced

long

Число страниц, замещенных после последнего перезапуска

PagesWritten

long

Число страниц, записанных после последнего перезапуска

PhysicalMemoryPages

long

Число страниц, находящихся в физической оперативной памяти

PhysicalMemorySize

long

Собирает общий размер страниц, загруденных в ОЗУ в байтах

TotalAllocatedPages

long

Общее число размещенных страниц

TotalAllocatedSize

long

Собирает общий размер памяти в регионе данных в байтах

TotalThrottlingTime

long

Общее время зависания потоков в миллисекундах. Ignite тормозит потоки, создающие «грязные» страницы в ходе процесса создания контрольной точки

UsedCheckpointBufferSize

long

Собирает размер использованного пространства в буфере контрольной точки в байтах

Хранилище данных#

Имя реестра: io.datastorage

Имя

Тип

Описание

CheckpointBeforeLockHistogram

histogram

Гистограмма действия по созданию контрольной точки до получения блокировки на запись в миллисекундах

CheckpointFsyncHistogram

histogram

Гистограмма продолжительности fsync контрольной точки в миллисекундах

CheckpointHistogram

histogram

Гистограмма продолжительности создания контрольной точки в миллисекундах

CheckpointListenersExecuteHistogram

histogram

Гистограмма продолжительности работы слушателей исполнения контрольной точки в миллисекундах

CheckpointLockHoldHistogram

histogram

Гистограмма длительности удержания блокировки контрольной точки в миллисекундах

CheckpointLockWaitHistogram

histogram

Гистограмма длительности ожидания блокировки контрольной точки в миллисекундах

CheckpointMarkHistogram

histogram

Гистограмма продолжительности маркирования контрольной точки в миллисекундах

CheckpointPagesWriteHistogram

histogram

Гистограмма продолжительности write-операции над страницами контрольной точки в миллисекундах

CheckpointSplitAndSortPagesHistogram

histogram

Гистограмма продолжительности разделения и сортировки страниц контрольной точки в миллисекундах

CheckpointTotalTime

long

Общая продолжительность контрольной точки

CheckpointWalRecordFsyncHistogram

histogram

Гистограмма продолжительности fsync WAL-журнала после появления в логах TotalNodesCheckpointRecord в начале контрольной точки в миллисекундах

CheckpointWriteEntryHistogram

histogram

Гистограмма продолжительности записи в файл входного буфера в миллисекундах

LastCheckpointBeforeLockDuration

long

Продолжительность действия контрольной точки до получения блокировки на запись в миллисекундах

LastCheckpointCopiedOnWritePagesNumber

long

Количество страниц, скопированных во временный буфер контрольной точки во время создания последней контрольной точки

LastCheckpointDataPagesNumber

long

Общее число страниц с данными, записанных во время создания последней контрольной точки

LastCheckpointDuration

long

Продолжительность создания последней контрольной точки в миллисекундах

LastCheckpointFsyncDuration

long

Продолжительность фазы синхронизации последней контрольной точки в миллисекундах

LastCheckpointListenersExecuteDuration

long

Продолжительность работы слушателей исполнения контрольной точки при блокировке на запись в миллисекундах

LastCheckpointLockHoldDuration

long

Продолжительность удержания блокировки контрольной точки в миллисекундах

LastCheckpointLockWaitDuration

long

Продолжительность ожидания блокировки контрольной точки в миллисекундах

LastCheckpointMarkDuration

long

Продолжительность маркировки контрольной точки в миллисекундах

LastCheckpointPagesWriteDuration

long

Продолжительность write-операции над страницами контрольной точки в миллисекундах

LastCheckpointTotalPagesNumber

long

Общее число страниц, записанных во время создания последней контрольной точки

LastCheckpointSplitAndSortPagesDuration

long

Продолжительность разделения и сортировки страниц последней контрольной точки в миллисекундах

LastCheckpointStart

long

Временная метка начала последней контрольной точки

LastCheckpointWalRecordFsyncDuration

long

Продолжительность fsync WAL-журнала после появления в логах CheckpointRecord в начале последней контрольной точки в миллисекундах

LastCheckpointWriteEntryDuration

long

Продолжительность записи входного буфера в файл последней контрольной точки в миллисекундах

SparseStorageSize

long

Пространство в хранилище, настроенное под возможную низкую плотность данных в байтах

StorageSize

long

Пространство в хранилизе в байтах

WalArchiveSegments

integer

Текущее число сегментов WAL-журнала в архиве WAL-журнала

WalBuffPollSpinsRate

long

Число повторов опроса буфера WAL-журнала за последний временной интервал

WalFsyncTimeDuration

long

Общая продолжительность fsync

WalFsyncTimeNum

long

Общее число операций fsync

WalLastRollOverTime

long

Время последней выгрузки сегмента WAL-журнала

WalLoggingRate

long

Среднее число записей WAL-журнале в секунду, созданных за последний временной интервал

WalTotalSize

long

Общий размер пространства для хранения файлов WAL-журнала в байтах

WalWritingRate

long

Среднее скорость записи за последний временной интервал (байт/сек)

Кластер#

Имя реестра: cluster

Имя

Тип

Описание

ActiveBaselineNodes

integer

Количество активных узлов в базовой топологии (baseline)

Rebalanced

boolean

Верно, если кластер полностью ребалансирован. Если кластер неактивен, данная метрика всегда имеет значение false, независимо от реального статуса партиций

TotalBaselineNodes

integer

Общее количество узлов в базовой топологии (baseline)

TotalClientNodes

integer

Число клиентских узлов

TotalServerNodes

integer

Количество серверных узлов

Метрики System Views#

CACHES#

Имя

Тип

Описание

CACHE_NAME

string

Имя кеша

CACHE_ID

int

ID кеша

CACHE_TYPE

string

Тип кеша

CACHE_MODE

string

Режим работы кеша

ATOMICITY_MODE

string

Атомарный режим

CACHE_GROUP_NAME

string

Имя группы кешей

AFFINITY

string

toString-репрезентация affinity-функции

AFFINITY_MAPPER

string

toString-репрезентация affinity-преобразователя

BACKUPS

int

Число резервных копий

CACHE_GROUP_ID

int

ID группы кешей

CACHE_LOADER_FACTORY

string

toString-репрезентация фабрики загрузчика кеша

CACHE_STORE_FACTORY

string

toString-representation of cache store factory

CACHE_WRITER_FACTORY

string

toString-репрезентация фабрики записи в кеш

DATA_REGION_NAME

string

Имя региона данных

DEFAULT_LOCK_TIMEOUT

long

Таймаут блокировки в миллисекундах

EVICTION_FILTER

string

toString-репрезентация фильтра замещения

EVICTION_POLICY_FACTORY

string

toString-репрезентация фабрики политики замещения

EXPIRY_POLICY_FACTORY

string

toString-репрезентация фабрики политики истечения срока хранения

INTERCEPTOR

string

toString-репрезентация сборщика данных

IS_COPY_ON_READ

boolean

Атрибут, который обозначает сохранение значения в on-heap-кеше

IS_EAGER_TTL

boolean

Атрибут, который обозначает немедленное удаление записей из кеша

IS_ENCRYPTION_ENABLED

boolean

Верно, если данные в кеше зашифрованы

IS_EVENTS_DISABLED

boolean

Верно, если события для данного кеша отключены

IS_INVALIDATE

boolean

Верно, если значения станут недействительными при фиксации в near-кеше

IS_LOAD_PREVIOUS_VALUE

boolean

Верно, если значение загружается из хранилища и не находится в кеше

IS_MANAGEMENT_ENABLED

boolean

IS_NEAR_CACHE_ENABLED

boolean

Верно, если кеш включен

IS_ONHEAP_CACHE_ENABLED

boolean

Верно, если heap-кеш включен

IS_READ_FROM_BACKUP

boolean

Верно, если чтение должно производиться из резервного узла

IS_READ_THROUGH

boolean

Верно, если включено чтение из стороннего хранилища

IS_SQL_ESCAPE_ALL

boolean

Если верно, то все имена SQL-таблиц и полей будут экранироваться двойными кавычками

IS_SQL_ONHEAP_CACHE_ENABLED

boolean

Верно, когда включен SQL on-heap-кеш. Когда он включен, Ignite будет кешировать SQL-строки по мере доступа к ним системы обработки запросов. Строки обнуляются и вытесняются из кеша при изменении или вытеснении из кеша соответствующей записи

IS_STATISTICS_ENABLED

boolean

Верно, если включена статистика по кешам

IS_STORE_KEEP_BINARY

boolean

Атрибут, который указывает на то, что реализация CacheStore работает с бинарными объектами вместо Java-объектов

IS_WRITE_BEHIND_ENABLED

boolean

Атрибут, указывающий на то, что Ignite должен использовать для хранилища кешей стратегию write-behind

IS_WRITE_THROUGH

boolean

Верно, если включена запись в стороннее хранилище

MAX_CONCURRENT_ASYNC_OPERATIONS

int

Максимальное число разрешенных параллельных асинхронных операций. Если возвращаемое значение "0", то число таких операций неограниченно

MAX_QUERY_ITERATORS_COUNT

int

Максимальное число сохраняемых итераторов запроса. Итераторы сохраняются для поддержки разбиения запроса на страницы, когда каждая страница данных отправляется на узел пользователя только при необходимости

NEAR_CACHE_EVICTION_POLICY_FACTORY

string

toString-репрезентация фабрики политики вытеснения из near cache

NEAR_CACHE_START_SIZE

int

Изначальный размер near cache, который будет использоваться для создания черновика внутренней хэш-таблицы после запуска

NODE_FILTER

string

toString-репрезентация фильтра узла

PARTITION_LOSS_POLICY

string

toString-репрезентация политики потери партиции

QUERY_DETAIL_METRICS_SIZE

int

Размер подробных метрик запросов, которые сохраняются в памяти для целей мониторинга. Если значение "0", статистика собираться не будет

QUERY_PARALLELISM

int

Указание на систему исполнения запросов при необходимой степени параллелизма внутри одного узла

REBALANCE_BATCH_SIZE

int

Размер данных, загружаемых внутри одного сообщения ребалансировки (в байтах)

REBALANCE_BATCHES_PREFETCH_COUNT

int

Число пакетов, созданных питающим узлом при начале процесса ребалансировки

REBALANCE_DELAY

long

Задержка ребалансировки в миллисекундах

REBALANCE_MODE

string

Режим ребалансировки

REBALANCE_ORDER

int

Порядок ребалансировки

REBALANCE_THROTTLE

long

Время ожидания между сообщениями ребалансировки для избежания перегрузки процессора или сети

REBALANCE_TIMEOUT

long

Таймаут ребалансировки в миллисекундах

SQL_INDEX_MAX_INLINE_SIZE

int

Размер подстановки индекса в байтах

SQL_ONHEAP_CACHE_MAX_SIZE

int

Максимальный размер SQL on-heap-кеша. изеряется в количестве строк. При достижении максимального числа строк самые старые из них вымещаются из кеша

SQL_SCHEMA

string

Имя схемы

TOPOLOGY_VALIDATOR

string

toString-репрезентация валидатора топологии

WRITE_BEHIND_BATCH_SIZE

int

Максимальный размер пакета для write-behind-операций хранилища кешей

WRITE_BEHIND_COALESCING

boolean

Объединяющий атрибут записи для write-behind-операций хранилища кешей. Операции хранения (get или remove) с одним и тем же ключом комбинируются или объединяются в одну конечную операцию для уменьшения нагрузки на соответствующее хранилище кешей

WRITE_BEHIND_FLUSH_FREQUENCY

long

Частота, с которой write-behind-кеш перемещается в хранилище кешей (в миллисекундах)

WRITE_BEHIND_FLUSH_SIZE

int

Максимальный размер write-behind-кеша. Если размер кеша превышает значение этой метрики, все содержимое кеша перемещается в хранилище кешей, а кеш записи очищается

WRITE_BEHIND_FLUSH_THREAD_COUNT

int

Количество потоков, которые будут производить перемещение кеша

WRITE_SYNCHRONIZATION_MODE

string

Получает данные о режиме синхронизации write-операций

CACHE_GROUPS#

Имя

Тип данных

Описание

AFFINITY

VARCHAR

Строковая репрезентация (возвращаемая методом toString()) affinity-функции, определенная для группы кешей

ATOMICITY_MODE

VARCHAR

Атомарный режим работы кеш-группы

BACKUPS

INT

Число резервных партиций, сконфигурированных для группы кешей

CACHE_COUNT

INT

Количество кешей в группе

CACHE_GROUP_ID

INT

ID группы кешей

CACHE_GROUP_NAME

VARCHAR

Имя кеш-группы

CACHE_MODE

VARCHAR

Режим работы кеша

DATA_REGION_NAME

VARCHAR

Имя региона данных

IS_SHARED

BOOLEAN

Если конкретная группа кешей содержит больше одного кеша

NODE_FILTER

VARCHAR

Строковая репрезентация (возвращаемая методом toString()) фильтра узла, определенная для группы кешей

PARTITION_LOSS_POLICY

VARCHAR

Политика потери партиций

PARTITIONS_COUNT

INT

Число партиций

REBALANCE_DELAY

LONG

Задержка ребалансировки

REBALANCE_MODE

VARCHAR

Режим ребалансировки

REBALANCE_ORDER

INT

Порядок ребалансировки

TOPOLOGY_VALIDATOR

VARCHAR

Строковая репрезентация (возвращаемая методом toString()) валидатора топологии, определенная для группы кешей

TASKS#

Имя

Тип

Описание

ID

UUID

ID задачи

SESSION_ID

UUID

ID сессии

TASK_NODE_ID

UUID

ID узла, происходящий от задачи

TASK_NAME

string

Имя задачи

TASK_CLASS_NAME

string

Имя класса задачи

AFFINITY_PARTITION_ID

int

ID партиции кеша

AFFINITY_CACHE_NAME

string

Имя кеша

START_TIME

long

Время начала

END_TIME

long

Время окончания

EXEC_NAME

string

Имя пула потоков, исполняющего задачу

INTERNAL

boolean

Верно, если задача является внутренней

USER_VERSION

string

Версия пользователя задачи

JOBS#

Данные метрики отражают список compute jobs, начатых узлом как часть compute task. Для просмотра статуса compute task необходимо обратиться к метрикам TASKS.

Имя

Тип

Описание

ID

UUID

ID подзадачи

SESSION_ID

UUID

ID сессии подзадачи. Для подзадач, принадлежащих к определенной задаче SESSION_ID равна TASKS.SESSION_ID for the jobs belonging to a specific task

ORIGIN_NODE_ID

UUID

ID узла, который начал подзадачу

TASK_NAME

string

Имя задачи

TASK_CLASSNAME

string

Имя класса задачи

AFFINITY_CACHE_IDS

string

ID одного или нескольких кешей, если подзадача исполняется посредством одного из методов IgniteCompute.affinity... Параметр остается без значения при использовании API IgniteCompute, которые не нацелены на использование строго определенных кешей

AFFINITY_PARTITION_ID

int

ID одной или нескольких партиций, если подзадача исполняется посредством одного из методов IgniteCompute.affinity... Параметр остается без значения при использовании API IgniteCompute, которые не нацелены на использование строго определенных партиций

CREATE_TIME

long

Время создания подзадачи

START_TIME

long

Время начала подзадачи

FINISH_TIME

long

Время окончания подзадачи

EXECUTOR_NAME

string

Имя исполнителя задачи

IS_FINISHING

boolean

Верно, если подзадача завершается

IS_INTERNAL

boolean

Верно, если подзадача является внутренней

IS_STARTED

boolean

Верно, если подзадача началась

IS_TIMEDOUT

boolean

Верно, если время на выполнение подзадачи вышло до ее завершения

STATE

string

Возможные значения: ACTIVE - подзадача исполняется. PASSIVE - Подзадача добавлена в очередь на исполнение. Для получения дополнительной информации необходимо обратиться к документации интерфейса CollisionSPI. CANCELED - Подзадача отменена

SERVICES#

Имя

Тип

Описание

AFFINITY_KEY

string

Значение affinity-ключа для сервиса

CACHE_NAME

string

Имя кеша

MAX_PER_NODE_COUNT

int

Максимальное количество экземпляров сервиса на один узел

NAME

string

Имя сервиса

NODE_FILTER

string

toString-репрезентация фильтра узла

ORIGIN_NODE_ID

UUID

ID начального узла

SERVICE_CLASS

string

Имя класса сервиса

SERVICE_ID

UUID

ID сервиса

STATICALLY_CONFIGURED

boolean

Верно, если сервис сконфигурирован статически

TOTAL_COUNT

int

Общее число экземпляров сервиса

NODES#

Имя

Тип данных

Описание

IS_LOCAL

BOOLEAN

Показывает, локальный ли узел или удаленный

ADDRESSES

VARCHAR

Отображает адреса узла

CONSISTENT_ID

VARCHAR

Согласованный идентификатор (consistent ID) узла

HOSTNAMES

VARCHAR

Имена хостов узла

IS_CLIENT

BOOLEAN

Показывает, является ли узел клиентом

IS_DAEMON

BOOLEAN

Показывает, является ли узел демоном

NODE_ID

UUID

ID узла

NODE_ORDER

INT

Порядок расположения узлов в топологии

VERSION

VARCHAR

Версия узла

NODE_ATTRIBUTES#

Имя

Тип данных

Описание

NODE_ID

UUID

ID узла

NAME

VARCHAR

Имя аттрибута

BASELINE_NODES#

Имя

Тип данных

Описание

CONSISTENT_ID

VARCHAR

Согласованный идентификатор (consistent ID) узла

ONLINE

BOOLEAN

Показывает доступность и активность узла

CLIENT_CONNECTIONS#

Имя

Тип

Описание

CONNECTION_ID

long

ID соединения

LOCAL_ADDRESS

IP

IP-адрес локального узла

REMOTE_ADDRESS

IP

IP-адрес удаленного узла

TYPE

string

Тип соединения

USER

string

Имя пользователя

VERSION

string

Версия протокола

STRIPED_POOL_QUEUE#

Имя

Тип

Описание

DESCRIPTION

string

toString-репрезентация задачи

STRIPE_INDEX

int

Индекс части потока

TASK_NAME

string

Имя класса задачи

THREAD_NAME

string

Имя части потока

DATASTREAM_THREADPOOL_QUEUE#

Имя

Тип

Описание

DESCRIPTION

string

toString-репрезентация задачи

STRIPE_INDEX

int

Индекс части потока

TASK_NAME

string

Имя класса задачи

THREAD_NAME

string

Имя части потока

SCAN_QUERIES#

Имя

Тип

Описание

CACHE_GROUP_ID

int

ID группы кешей

CACHE_GROUP_NAME

string

Имя группы кешей

CACHE_ID

int

ID кеша

CACHE_NAME

string

Имя кеша

CANCELED

boolean

Верно, если запрос отменен

DURATION

long

Продолжительность запроса

FILTER

string

toString-репрезентация фильтра

KEEP_BINARY

boolean

Верно при включенном keepBinary

LOCAL

boolean

Верно, если запрос только локальный

ORIGIN_NODE_ID

UUID

ID узла, инициировавшего запрос

PAGE_SIZE

int

Размер страницы

PARTITION

int

ID партиции запроса

QUERY_ID

long

ID запроса

START_TIME

long

Время начала запроса

SUBJECT_ID

UUID

ID пользователя, инициировавшего запрос

TASK_NAME

string

Имя класса задачи

TOPOLOGY

string

Версия топологии

TRANSFORMER

string

toString-репрезентация модификатора

CONTINUOUS_QUERIES#

Имя

Тип

Описание

AUTO_UNSUBSCRIBE

boolean

Верно, если запрос должен быть прекращен при отключении узла или выходе из топологии узла, инициировавшего запрос

BUFFER_SIZE

int

Размер буфера пакета события

CACHE_NAME

string

Имя кеша

DELAYED_REGISTER

boolean

Верно, если запрос инициируется при запуске соответствующего кеша

INTERVAL

long

Интервал уведомлений

IS_EVENTS

boolean

Верно, если используется для подписки на удаленные события

IS_MESSAGING

boolean

Верно, если используется для подписки на сообщения

IS_QUERY

boolean

Верно, если пользователь инициировал продолжительный запрос (continuous query)

KEEP_BINARY

boolean

Верно при включенном keepBinary

LAST_SEND_TIME

long

Последний раз, когда пакет события отсылается на узел, инициировавший запрос

LOCAL_LISTENER

string

toString-репрезентация локального слушателя

LOCAL_TRANSFORMED_LISTENER

string

toString-репрезентация преобразованного локального слушателя

NODE_ID

UUID

ID узла, инициировавшего запрос

NOTIFY_EXISTING

boolean

Верно, если слушателя необходимо уведомить о существующих записях

OLD_VALUE_REQUIRED

boolean

Верно, если старое значение записи должно быть включено в событие

REMOTE_FILTER

string

toString-репрезентация удаленного фильтра

REMOTE_TRANSFORMER

string

toString-репрезентация удаленного преобразователя

ROUTINE_ID

UUID

ID запроса

TOPIC

string

Имя топика запроса

SQL_QUERIES#

Имя

Тип

Описание

DURATION

long

Продолжительность исполнения запроса

LOCAL

boolean

Верно, если запрос только локальный

ORIGIN_NODE_ID

UUID

Узел, инициировавший запрос

QUERY_ID

UUID

ID запроса

SCHEMA_NAME

string

Имя запроса

SQL

string

Текст заапроса

START_TIME

date

Время начала запроса

SQL_QUERIES_HISTORY#

Имя

Тип

Описание

SCHEMA_NAME

string

Имя схемы

SQL

string

Текст запроса

LOCAL

boolean

Верно, если запрос только локальный

EXECUTIONS

long

Количество исполнений запроса

FAILURES

long

Число сбоев

DURATION_MIN

long

Минимальная продолжительность исполнения запроса

DURATION_MAX

long

Максимальная продолжительность исполнения запроса

LAST_START_TIME

date

Дата последнего исполнения запроса

SCHEMAS#

Имя

Тип

Описание

NAME

string

Имя схемы

PREDEFINED

boolean

Если верно, то схема определена заранее

NODE_METRICS#

Имя

Тип данных

Описание

NODE_ID

UUID

ID узла

LAST_UPDATE_TIME

TIMESTAMP

Последнее обновление метрик

MAX_ACTIVE_JOBS

INT

Максимальное число одновременно выполняющихся подзадач за все время работы узла

CUR_ACTIVE_JOBS

INT

Количество активных в настоящий момент активных подзадач на узле

AVG_ACTIVE_JOBS

FLOAT

Среднее число активных подзадач, параллельно исполняющихся на узле

MAX_WAITING_JOBS

INT

Максимальное количество подзадач, находящихся в ожидании, когда-либо существовали на конкретном узле в один момент времени

CUR_WAITING_JOBS

INT

Количество подзадач в очереди на выполнение на данный момент

AVG_WAITING_JOBS

FLOAT

Среднее число подзадач, находившихся в очереди за все время работы узла

MAX_REJECTED_JOBS

INT

Максимальное количество подзадач во время выполнения отдельной операции по разрешению конфликтов

CUR_REJECTED_JOBS

INT

Количество подзадач, которые были отклонены в результате выполнения последней операции по разрешению конфликтов

AVG_REJECTED_JOBS

FLOAT

Среднее количество подзадач, отклоненных текущим узлом в результате выполнения операций по разрешению конфликтов

TOTAL_REJECTED_JOBS

INT

Общее количество подзадач, отклоненных текущим узлом в результате выполнения операций по разрешению конфликтов с момента запуска узла

MAX_CANCELED_JOBS

INT

Максимальное количество отмененных подзадач, которые когда-либо выполнявшихся на узле параллельно

CUR_CANCELED_JOBS

INT

Количество отмененных, но все еще запущенных подзадач

AVG_CANCELED_JOBS

FLOAT

Среднее количество отмененных подзадач, когда-либо выполнявшихся на текущем узле параллельно

TOTAL_CANCELED_JOBS

INT

Общее количество подзадач, отмененных с момента запуска узла

MAX_JOBS_WAIT_TIME

TIME

Максимальное время, в течение которого подзадача находилась в очереди на исполнение

CUR_JOBS_WAIT_TIME

TIME

Самое продолжительное время ожидания среди подзадач, в данный момент находящихся в очереди на исполнение

AVG_JOBS_WAIT_TIME

TIME

Среднее время, в течение которого подзадачи находятся в очереди на исполнение

MAX_JOBS_EXECUTE_TIME

TIME

Максимальное время исполнения подзадачи

CUR_JOBS_EXECUTE_TIME

TIME

Самое продолжительное время, в течение которого исполняется текущая подзадача

AVG_JOBS_EXECUTE_TIME

TIME

Среднее время исполнения подзадачи на текущем узле

TOTAL_JOBS_EXECUTE_TIME

TIME

Общее время исполнения завершенных подзадач на текущем узле с момента его запуска

TOTAL_EXECUTED_JOBS

INT

Общее число подзадач, обработанных узлом с момента его запуска

TOTAL_EXECUTED_TASKS

INT

Общее количество задач, обработанных узлом

TOTAL_BUSY_TIME

TIME

Общее время, в течение которого узел занимался выполнением задач

TOTAL_IDLE_TIME

TIME

Общее время простоя текущего узла (без выполнения подзадач)

CUR_IDLE_TIME

TIME

Время, в течение которого узел простаивал после выполнения последней подзадачи

BUSY_TIME_PERCENTAGE

FLOAT

Процентное соотношение времени выполнения подзадачи ко времени простоя

IDLE_TIME_PERCENTAGE

FLOAT

Процентное соотношение времени простоя ко времени выполнения задачи

TOTAL_CPU

INT

Количество ядер процессора, доступных для JVM

CUR_CPU_LOAD

DOUBLE

Процентное соотношение использования процессора, выраженное фракцией в диапазоне [0, 1]

AVG_CPU_LOAD

DOUBLE

Среднее соотношение использование процессора, выраженное фракцией в диапазоне [0, 1]

CUR_GC_CPU_LOAD

DOUBLE

Среднее время, потраченное на сборку мусора с момента последнего обновления метрик. По умолчанию, метрики обновляются каждые 2 секунды

HEAP_MEMORY_INIT

LONG

Размер изначально запрашиваемой JVM у ОС heap-памяти для управления памятью. Если изначальный объем памяти не определен, значение метрики будет равно -1

HEAP_MEMORY_USED

LONG

Текущий размер heap-памяти, используемый для размещения объекта. Heap состоит из одного или нескольких пулов памяти. Это значение является суммой значений использованной heap-памяти во всех пулах heap-памяти

HEAP_MEMORY_COMMITED

LONG

Количество heap-памяти в байтах, выделенное для использования JVM. Heap состоит из одного или нескольких пулов памяти. Это значение является суммой значений выделенной heap-памяти во всех пулах heap-памяти

HEAP_MEMORY_MAX

LONG

Максимальный объем heap-памяти в байтах, используемый для управления памятью. Метрика отображает -1, если максимальный объем памяти не задан

HEAP_MEMORY_TOTAL

LONG

Общий объем heap-памяти в байтах. Если общий объем памяти не задан, метрика отображает -1

NONHEAP_MEMORY_INIT

LONG

Объем изначально запрашиваемой JVM у ОС off-heap-памяти в байтах для управления памятью. Метрика отображает -1, если изначальный объем памяти не задан

NONHEAP_MEMORY_USED

LONG

Текущий объем off-heap-памяти, используемый JVM. Off-heap-память состоит из одного или нескольких пулов памяти. Это значение является суммой значений использованной off-heap-памяти всех пулах памяти

NONHEAP_MEMORY_COMMITED

LONG

Объем off-heap-памяти, выделенной JVM для использования. Off-heap-память состоит из одного или нескольких пулов памяти. Это значение является суммой значений выделенного объема off-heap-памяти всех пулах памяти

NONHEAP_MEMORY_MAX

LONG

Возвращает максимальный объем off-heap-памяти, которая может использоваться для управления памятью в байтах. Метрика отображает -1, если максимальный объем памяти не задан

NONHEAP_MEMORY_TOTAL

LONG

Общее количество off-heap-памяти, которая может быть использована для управления памятью. Метрика отображает -1, если общий объем памяти не задан

UPTIME

TIME

Время работы JVM

JVM_START_TIME

TIMESTAMP

Время запуска JVM

NODE_START_TIME

TIMESTAMP

Время запуска узла

LAST_DATA_VERSION

LONG

IMDG присваивает всем кеш-операциям инкрементные версии. Эта метрика отображает последнюю версию данных на узле

CUR_THREAD_COUNT

INT

Число «живых» потоков, включая «daemon» и «non-daemon»-потоки

MAX_THREAD_COUNT

INT

Максимальное количество «живых» потоков с момента запуска JVM или сброса пиковой нагрузки

TOTAL_THREAD_COUNT

LONG

Общее количество потоков, запущенных с момента запуска JVM

CUR_DAEMON_THREAD_COUNT

INT

Количество «живых» «daemon»-потоков

SENT_MESSAGES_COUNT

INT

Число communication-сообщений, отправленных узлом

SENT_BYTES_COUNT

LONG

Число отправленных байт

RECEIVED_MESSAGES_COUNT

INT

Число полученных узлом communication-сообщений

RECEIVED_BYTES_COUNT

LONG

Число полученных байт

OUTBOUND_MESSAGES_QUEUE

INT

Размер очереди исходящих сообщений

TABLES#

Данные метрики содержат информацию об SQL-таблицах.

Имя

Тип данных

Описание

AFFINITY_KEY_COLUMN

string

Имя колонки ключа affinity

CACHE_ID

int

ID кеша для таблицы

CACHE_NAME

string

Имя кеша для таблицы

IS_INDEX_REBUILD_IN_PROGRESS

boolean

Верно, если производится перестройка индекса для конкретной таблицы

KEY_ALIAS

string

Алиас для ключа

KEY_TYPE_NAME

string

Имя типа ключа

SCHEMA_NAME

string

Имя схемы таблицы

TABLE_NAME

string

Имя таблицы

VALUE_ALIAS

string

Алиас значения

VALUE_TYPE_NAME

string

Имя типа значения

TABLE_COLUMNS#

Имя

Тип

Описание

AFFINITY_COLUMN

boolean

Верно, если это колонка ключа affinity

AUTO_INCREMENT

boolean

Верно, если увеличивается автоматически

COLUMN_NAME

string

Имя колонки

DEFAULT_VALUE

string

Значение колонки по умолчанию

NULLABLE

boolean

Верно, если допустимо пустое значение

PK

boolean

Верно, если первичный ключ (primary key)

PRECISION

int

Точность колонки

SCALE

int

Масштаб колонки

SCHEMA_NAME

string

Имя схемы

TABLE_NAME

string

Имя таблицы

TYPE

string

Тип таблицы

VIEWS#

Данная метрика отображает информацию об SQL Views.

Имя

Тип

Описание

NAME

string

Имя

SCHEMA

string

Схема

DESCRIPTION

string

Описание

VIEWS_COLUMNS#

Данная метрика отображает информацию о колонках SQL Views.

Имя

Тип

Описание

COLUMN_NAME

string

Имя колонки

DEFAULT_VALUE

string

Значение колонки по умолчанию

NULLABLE

boolean

Верно, если значение колонки может быть пустым

PRECISION

int

Точность колонки

SCALE

int

Масштаб колонки

SCHEMA_NAME

string

Имя схемы

TYPE

string

Тип колонки

VIEW_NAME

string

Имя view

INDEXES#

Колонка

Тип данных

Описание

INDEX_NAME

string

Имя индекса

INDEX_TYPE

string

Тип индекса

COLUMNS

string

Колонки, включенные в индекс

SCHEMA_NAME

string

Имя схемы

TABLE_NAME

string

Имя таблицы

CACHE_NAME

string

Имя кеша

CACHE_ID

int

ID кеша

INLINE_SIZE

int

Объем подстановки в байтах

IS_PK

boolean

Верно, если это индекс первичного ключа (primary key)

IS_UNIQUE

boolean

Верно, если индекс уникален

PAGE_LISTS#

Список страниц – это структура данных, использующаяся для хранения частично свободных страниц с данными (свободные списки) и полностью свободных выделенных страниц (списки страниц для повторного использования). Целью таких списков является быстрый поиск и локализация страницы с достаточным количеством места в ней для сохранения определенной записи, а также определение того, что такой страницы не существует и необходимо разместить в кеше новую. Списки страниц организуются в пакеты. Каждый такой пакет ссылается на страницы с примерно тем же объемом свободного места.

При включенном режиме persistence списки страниц создаются для каждой партиции каждой группы кешей. Для просмотра таких списков необходимо использовать метрику CACHE_GROUP_PAGE_LISTS.

При отключенном режиме persistence списки страниц создаются для каждого региона данных. В данном случае, необходимо использовать метрику DATA_REGION_PAGE_LISTS.

Эти метрики содержат в себе информацию о каждом из пакетов списка страниц. Это необходимо понимать, чтобы иметь представление о том, какой объем данных можно внести в кеш без размещения новых страниц. Кроме того, это помогает определить искажения в использовании списков страниц.

CACHE_GROUP_PAGE_LISTS#

Колонка

Тип данных

Описание

CACHE_GROUP_ID

int

ID группы кэшей

PARTITION_ID

int

ID партиции

NAME

string

Имя списка страниц

BUCKET_NUMBER

int

Номер контейнера

BUCKET_SIZE

long

Число страниц в контейнере

STRIPES_COUNT

int

Число дорожек, используемых контейнером. Дорожки используются для предотвращения возникновения конфликтов.

CACHED_PAGES_COUNT

int

Число страниц в on-heap-кэше списка страниц конкретного контейнера.

DATA_REGION_PAGE_LISTS#

Колонка

Тип данных

Описание

NAME

string

Имя списка страниц

BUCKET_NUMBER

int

Номер контейнера

BUCKET_SIZE

long

Число страниц в контейнере

STRIPES_COUNT

int

Число дорожек, используемых контейнером. Дорожки используются для предотвращения возникновения конфликтов.

CACHED_PAGES_COUNT

int

Число страниц в on-heap-кэше списка страниц конкретного контейнера.

PARTITION_STATES#

Колонка

Тип данных

Описание

CACHE_GROUP_ID

int

ID группы кэшей

PARTITION_ID

int

ID партиции

NODE_ID

UUID

ID узла

STATE

string

Состояние (статус) партиций. Партиция может иметь следующие состояния: MOVING — партиция находится в процессе загрузки с одного узла на другой; OWNING — узел является основным или резервным "держателем" партиции; RENTING — узел не является ни основным, ни резервным "держателем" партиции (и в настоящий момент вымещается); EVICTED — партиция вымещена; LOST — некорректный статус партиции. Партицию использовать нельзя.

IS_PRIMARY

boolean

Метка основной партиции

BINARY_METADATA#

Колонка

Тип данных

Описание

TYPE_ID

int

ID типа

TYPE_NAME

string

Имя типа

AFF_KEY_FIELD_NAME

string

Имя поля affinity-ключа

FIELDS_COUNT

int

Число полей

FIELDS

string

Записанные поля объектов

SCHEMAS_IDS

string

ID схем, зарегистрированные для конкретного типа

IS_ENUM

boolean

Метрика показывает, является ли тип перечисляемым (enum)

METASTORAGE#

Колонка

Тип данных

Описание

NAME

string

Имя

VALUE

string

Строковое или простое бинарное (в случае невозможности десериализации данных)представление элемента

DS_QUEUES#

Колонка

Тип данных

Описание

ID

UUID

ID

NAME

string

Имя структуры данных

CAPACITY

int

Пропускная способность

SIZE

int

Текущий размер

BOUNDED

boolean

True, когда пропускная способность очереди ограничена

COLLOCATED

boolean

True, если совмещено

GROUP_NAME

string

Имя группы кэшей для сохранения структуры данных

GROUP_ID

int

ID группы кэщей для сохранения структуры данных

REMOVED

boolean

True, если удалено

DS_SETS#

Колонка

Тип данных

Описание

ID

UUID

ID

NAME

string

Имя структуры данных

SIZE

int

Текущий размер

COLLOCATED

boolean

True, если совмещено

GROUP_NAME

string

Имя группы кэшей для хранения структуры данных

GROUP_ID

int

ID группы кэшей для хранения структуры данных

REMOVED

boolean

True, если удалено

DS_ATOMICSEQUENCES#

Колонка

Тип данных

Описание

NAME

string

Имя структуры данных

VALUE

long

Текущее значение последовательности

BATCH_SIZE

long

Размер локального пакета

GROUP_NAME

string

Имя группы кэшей для хранения структуры данных

GROUP_ID

int

ID группы кешей, используемой для сохранения структуры данных

REMOVED

boolean

True, если удалено

DS_ATOMICLONGS#

Колонка

Тип данных

Описание

NAME

string

Имя структуры данных

VALUE

long

Текущее значение последовательности

GROUP_NAME

string

Имя группы кэшей для хранения структуры данных

GROUP_ID

int

ID группы кешей, используемой для сохранения структуры данных

REMOVED

boolean

True, если удалено

DS_ATOMICREFERENCES#

Колонка

Тип данных

Описание

NAME

string

Имя структуры данных

VALUE

long

Текущее значение последовательности

GROUP_NAME

string

Имя группы кэшей для хранения структуры данных

GROUP_ID

int

ID группы кешей, используемой для сохранения структуры данных

REMOVED

boolean

True, если удалено

DS_ATOMICSTAMPED#

Колонка

Тип данных

Описание

NAME

string

Имя структуры данных

VALUE

long

Текущее значение последовательности

STAMP

string

Текущее значение метки

GROUP_NAME

string

Имя группы кэшей для хранения структуры данных

GROUP_ID

int

ID группы кешей, используемой для сохранения структуры данных

REMOVED

boolean

True, если удалено

DS_COUNTDOWNLATCHES#

Колонка

Тип данных

Описание

NAME

string

Имя структуры данных

COUNT

int

Текущее число

INITIAL_COUT

int

Изначальное число

AUTO_DELETE

boolean

Для автоматического снятия блокировки с кеша, когда счетчик близится к нулю должно быть установлено значение true.

GROUP_NAME

string

Имя группы кешей для сохранения структуры данных

GROUP_ID

int

ID группы кешей для сохранения структуры данных

REMOVED

boolean

True, если удалено

DS_SEMAPHORES#

Колонка

Тип данных

Описание

NAME

string

имя структуры данных

AVAILABLE_PERMITS

long

Количество доступных разрешений

HAS_QUEUED_THREADS

boolean

True, если есть другие потоки, ожидающие блокировки

QUEUE_LENGTH

int

Определенное число узлов, ожидающих блокировки

FAILOVER_SAFE

boolean

True, если восстановление после отказа безопасно

BROKEN

boolean

True, если узел вышел из строя на данном семафоре, и свойство FAILOVER_SAFE имело значение false.

GROUP_NAME

string

Имя группы кешей для сохранения структуры данных

GROUP_ID

int

ID группы кешей для сохранения структуры данных

REMOVED

boolean

True, если удалено

DS_REENTRANTLOCKS#

Колонка

Тип данных

Описание

NAME

string

Имя структуры данных

LOCKED

boolean

True, если заблокировано

HAS_QUEUED_THREADS

boolean

True, если есть другие потоки, ожидающие блокировки

FAILOVER_SAFE

boolean

True, если восстановление после отказа безопасно

FAIR

boolean

True, если блокировка "честная"

BROKEN

boolean

True, если узел вышел из строя на данном семафоре, и свойство FAILOVER_SAFE имело значение false.

GROUP_NAME

string

Имя группы кешей для сохранения структуры данных

GROUP_ID

int

ID группы кешей для сохранения структуры данных

REMOVED

boolean

True, если удалено

STATISTICS_CONFIGURATION#

Колонка

Тип данных

Описание

SCHEMA

VARCHAR

Имя схемы

TYPE

VARCHAR

Типа объекта

NAME

VARCHAR

Имя объекта

COLUMN

VARCHAR

Имя колонки

MAX_PARTITION_OBSOLESCENCE_PERCENT

TINYINT

Максимальный процент устаревающих строк в статистике

MANUAL_NULLS

BIGINT

Если не null — количество `null'-значений превышено

MANUAL_DISTINCT

BIGINT

Если не null — количество `distinct'-значений превышено

MANUAL_TOTAL

BIGINT

Если не null — превышено общее количество значений

MANUAL_SIZE

INT

Если не null — превышено количество не `null'-значений в колонке

VERSION

BIGINT

Версия конфигурации

STATISTICS_LOCAL_DATA#

Колонка

Тип данных

Описание

SCHEMA

VARCHAR

Имя схемы

TYPE

VARCHAR

Тип объекта

NAME

VARCHAR

Имя объекта

COLUMN

VARCHAR

Имя колонки

ROWS_COUNT

BIGINT

Число строк в колонке

DISTINCT

BIGINT

Число уникальных не null-значений

NULLS

BIGINT

Число null-значений

TOTAL

BIGINT

Общее число значений в колонке

SIZE

INTEGER

Средний размер значения в байтах

VERSION

BIGINT

Версия статистики

LAST_UPDATE_TIME

VARCHAR

Максимальное время, в течение которого вся статистика по партициям использовалась для создания локальной статистики

STATISTICS_PARTITION_DATA#

Колонка

Тип данных

Описание

SCHEMA

VARCHAR

Имя схемы

TYPE

VARCHAR

Тип объекта

NAME

VARCHAR

Имя объекта

COLUMN

VARCHAR

Имя колонки

ROWS_COUNT

BIGINT

Число строк в колонке

UPDATE_COUNTER

BIGINT

Обновление счетчика партиций после сбора статистики

DISTINCT

BIGINT

Число уникальных не null-значений

NULLS

BIGINT

Число null-значений

TOTAL

BIGINT

Общее число значений в колонке

SIZE

INTEGER

Средний размер значения в байтах

VERSION

BIGINT

Версия статистики

LAST_UPDATE_TIME

VARCHAR

Максимальное время, в течение которого вся статистика по партициям использовалась для создания локальной статистики

События системного журнала#

Событие

Запись

Описание

crd=true

2020-10-06 17:37:16.901 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Finished exchange init [topVer=AffinityTopologyVersion [topVer=1, minorTopVer=0], crd=true]

Успешное завершение обмена топологиями с узлом-координатором

Added new node to topology

2020-10-06 17:43:43.595 [INFO ][disco-event-worker-#56][org.apache.ignite.internal.managers.discovery.GridDiscoveryManager] Added new node to topology: TcpDiscoveryNode [id=2d2103cb-c6d0-46ee-ad44-9a4010da765d, consistentId=10.53.116.114,127.0.0.1:47500, addrs=ArrayList [10.53.116.114, 127.0.0.1], sockAddrs=HashSet [tkles-pprb00123.vm.esrt.cloud.sbrf.ru/10.53.116.114:47500, /127.0.0.1:47500], discPort=47500, order=2, intOrder=2, lastExchangeTime=1601995423434, loc=false, ver=2.8.1#20200914-sha1:602ccc45, isClient=false]

В топологию добавлен новый узел

Node left topology

2020-10-06 17:48:00.828 [INFO ][disco-event-worker-#56][org.apache.ignite.internal.managers.discovery.GridDiscoveryManager] Node left topology: TcpDiscoveryNode [id=2d2103cb-c6d0-46ee-ad44-9a4010da765d, consistentId=10.53.116.114,127.0.0.1:47500, addrs=ArrayList [10.53.116.114, 127.0.0.1], sockAddrs=HashSet [tkles-pprb00123.vm.esrt.cloud.sbrf.ru/10.53.116.114:47500, /127.0.0.1:47500], discPort=47500, order=2, intOrder=2, lastExchangeTime=1601995423434, loc=false, ver=2.8.1#20200914-sha1:602ccc45, isClient=false]

Узел покинул топологию

Sending activate request

2020-10-06 17:54:27.906 [INFO ][rest-#171][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Sending activate request with BaselineTopology BaselineTopology [id=0, branchingHash=533127586, branchingType='Cluster activation', baselineNodes=[10.53.116.77,127.0.0.1:47500]]
2020-10-06 17:54:27.908 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Received activate request with BaselineTopology[id=0]
2020-10-06 17:54:27.908 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Started state transition: true
2020-10-06 17:54:27.909 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Started exchange init [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], crd=true, evt=DISCOVERY_CUSTOM_EVT, evtNode=0d1f5011-4540-473b-aced-8c7c911f86a3, customEvt=ChangeGlobalStateMessage [id=45a585ef471-773de86e-722e-45e4-9228-38bbf24f0d82, reqId=64cea40a-356d-4c84-b651-fd0b50c5f3a7, initiatingNodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, secSubjId=null, activate=true, baselineTopology=BaselineTopology [id=0, branchingHash=533127586, branchingType='Cluster activation', baselineNodes=[10.53.116.77,127.0.0.1:47500]], forceChangeBaselineTopology=false, timestamp=1601996067906], allowMerge=false, exchangeFreeSwitch=false]
2020-10-06 17:54:27.909 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Start activation process [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]
2020-10-06 17:54:27.910 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager] Configured data regions initialized successfully [total=3]
2020-10-06 17:54:27.912 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager] Configured data regions started successfully [total=3]
2020-10-06 17:54:27.912 [INFO ][exchange-worker-#58][org.apache.ignite.cache.msg] Components activation performed in 3 ms.
2020-10-06 17:54:27.915 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Started cache [name=ignite-sys-cache, id=-2100569601, dataRegionName=sysMemPlc, mode=REPLICATED, atomicity=TRANSACTIONAL, backups=2147483647, mvcc=false]
2020-10-06 17:54:27.916 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Successfully activated caches [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]
2020-10-06 17:54:27.917 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], waitTime=0ms, futInfo=NA, mode=LOCAL]
2020-10-06 17:54:27.964 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] finishExchangeOnCoordinator [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]
2020-10-06 17:54:27.967 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finish exchange future [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], err=null, rebalanced=true, wasRebalanced=false]
2020-10-06 17:54:27.968 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Finish proxy initialization, cacheName=ignite-sys-cache, localNodeId=0d1f5011-4540-473b-aced-8c7c911f86a3
2020-10-06 17:54:27.969 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Received state change finish message: true
2020-10-06 17:54:27.982 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Completed partition exchange [localNode=0d1f5011-4540-473b-aced-8c7c911f86a3, exchange=GridDhtPartitionsExchangeFuture [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], evt=DISCOVERY_CUSTOM_EVT, evtNode=TcpDiscoveryNode [id=0d1f5011-4540-473b-aced-8c7c911f86a3, consistentId=10.53.116.77,127.0.0.1:47500, addrs=ArrayList [10.53.116.77, 127.0.0.1], sockAddrs=HashSet [/127.0.0.1:47500, tkles-pprb00116.vm.esrt.cloud.sbrf.ru/10.53.116.77:47500], discPort=47500, order=1, intOrder=1, lastExchangeTime=1601995680820, loc=true, ver=2.8.1#20200914-sha1:602ccc45, isClient=false], done=true, newCrdFut=null], topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]
2020-10-06 17:54:27.982 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange timings [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], stage="Waiting in exchange queue" (0 ms), stage="Exchange parameters initialization" (0 ms), stage="Update caches registry" (3 ms), stage="Start caches" (3 ms), stage="Affinity initialization on cache group start" (0 ms), stage="Determine exchange type" (0 ms), stage="Preloading notification" (0 ms), stage="WAL history reservation" (0 ms), stage="Wait partitions release" (0 ms), stage="After states restored callback" (47 ms), stage="Waiting for all single messages" (0 ms), stage="Affinity recalculation (crd)" (0 ms), stage="Collect update counters and create affinity messages" (0 ms), stage="Validate partitions states" (0 ms), stage="Assign partitions states" (0 ms), stage="Ideal affinity diff calculation (enforced)" (0 ms), stage="Apply update counters" (0 ms), stage="Full message preparing" (1 ms), stage="Full message sending" (0 ms), stage="State finish message sending" (0 ms), stage="Exchange done" (14 ms), stage="Total time" (68 ms)]
2020-10-06 17:54:27.982 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange longest local stages [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], stage="Affinity initialization on cache group start [grp=ignite-sys-cache]" (0 ms) (parent=Affinity initialization on cache group start), stage="Affinity centralized initialization (crd) [grp=ignite-sys-cache, crd=true]" (0 ms) (parent=Determine exchange type), stage="Affinity recalculation (partitions availability) [grp=ignite-sys-cache]" (0 ms) (parent=Ideal affinity diff calculation (enforced))]
2020-10-06 17:54:27.983 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Finished exchange init [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2], crd=true]
2020-10-06 17:54:27.983 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager] Skipping rebalancing (nothing scheduled) [top=AffinityTopologyVersion [topVer=3, minorTopVer=2], force=false, evt=DISCOVERY_CUSTOM_EVT, node=0d1f5011-4540-473b-aced-8c7c911f86a3]
2020-10-06 17:54:27.997 [INFO ][sys-#169][org.apache.ignite.internal.cluster.DistributedBaselineConfiguration] Baseline auto-adjust is 'enabled' with timeout='0' ms
2020-10-06 17:54:27.997 [INFO ][sys-#169][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Successfully performed final activation steps [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=2]]

Запрос на активацию кластера

`Sending deactivate request

2020-10-06 17:56:59.425 [INFO ][rest-#185][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Sending deactivate request with BaselineTopology null
2020-10-06 17:56:59.426 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Received deactivate request with BaselineTopology: null
2020-10-06 17:56:59.426 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Started state transition: false
2020-10-06 17:56:59.427 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Started exchange init [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], crd=true, evt=DISCOVERY_CUSTOM_EVT, evtNode=0d1f5011-4540-473b-aced-8c7c911f86a3, customEvt=ChangeGlobalStateMessage [id=20b585ef471-773de86e-722e-45e4-9228-38bbf24f0d82, reqId=6c8ce4b2-90ab-4d16-b5a7-8e25ad37c4e0, initiatingNodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, secSubjId=null, activate=false, baselineTopology=null, forceChangeBaselineTopology=false, timestamp=1601996219425], allowMerge=false, exchangeFreeSwitch=false]
2020-10-06 17:56:59.427 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Start deactivation process [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]
2020-10-06 17:56:59.428 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Successfully deactivated data structures, services and caches [nodeId=0d1f5011-4540-473b-aced-8c7c911f86a3, client=false, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]
2020-10-06 17:56:59.428 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], waitTime=0ms, futInfo=NA, mode=DISTRIBUTED]
2020-10-06 17:56:59.429 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partitions release latch: ServerLatch [permits=0, pendingAcks=HashSet [], super=CompletableLatch [id=CompletableLatchUid [id=exchange, topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]]]
2020-10-06 17:56:59.429 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], waitTime=0ms, futInfo=NA, mode=LOCAL]
2020-10-06 17:56:59.429 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] finishExchangeOnCoordinator [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]
2020-10-06 17:56:59.432 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finish exchange future [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], err=null, rebalanced=false, wasRebalanced=true]
2020-10-06 17:56:59.433 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Stopped cache [cacheName=ignite-sys-cache]
2020-10-06 17:56:59.434 [INFO ][disco-notifier-worker-#55][org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor] Received state change finish message: false
2020-10-06 17:56:59.437 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Completed partition exchange [localNode=0d1f5011-4540-473b-aced-8c7c911f86a3, exchange=GridDhtPartitionsExchangeFuture [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], evt=DISCOVERY_CUSTOM_EVT, evtNode=TcpDiscoveryNode [id=0d1f5011-4540-473b-aced-8c7c911f86a3, consistentId=10.53.116.77,127.0.0.1:47500, addrs=ArrayList [10.53.116.77, 127.0.0.1], sockAddrs=HashSet [/127.0.0.1:47500, tkles-pprb00116.vm.esrt.cloud.sbrf.ru/10.53.116.77:47500], discPort=47500, order=1, intOrder=1, lastExchangeTime=1601995680820, loc=true, ver=2.8.1#20200914-sha1:602ccc45, isClient=false], done=true, newCrdFut=null], topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]
2020-10-06 17:56:59.438 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange timings [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], stage="Waiting in exchange queue" (0 ms), stage="Exchange parameters initialization" (0 ms), stage="Update caches registry" (0 ms), stage="Start caches" (0 ms), stage="Affinity initialization on cache group start" (0 ms), stage="Determine exchange type" (0 ms), stage="Preloading notification" (0 ms), stage="WAL history reservation" (0 ms), stage="Wait partitions release" (0 ms), stage="Wait partitions release latch" (0 ms), stage="Wait partitions release" (0 ms), stage="After states restored callback" (0 ms), stage="Waiting for all single messages" (0 ms), stage="Affinity recalculation (crd)" (0 ms), stage="Collect update counters and create affinity messages" (0 ms), stage="Validate partitions states" (0 ms), stage="Apply update counters" (0 ms), stage="Full message preparing" (2 ms), stage="Full message sending" (0 ms), stage="State finish message sending" (0 ms), stage="Exchange done" (6 ms), stage="Total time" (8 ms)]
2020-10-06 17:56:59.438 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange longest local stages [startVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], resVer=AffinityTopologyVersion [topVer=3, minorTopVer=3]]]
2020-10-06 17:56:59.438 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Finished exchange init [topVer=AffinityTopologyVersion [topVer=3, minorTopVer=3], crd=true]
2020-10-06 17:56:59.439 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager] Skipping rebalancing (nothing scheduled) [top=AffinityTopologyVersion [topVer=3, minorTopVer=3], force=false, evt=DISCOVERY_CUSTOM_EVT, node=0d1f5011-4540-473b-aced-8c7c911f86a3]

Запрос на деактивацию кластера

Partition Map Exchange crd node

2020-10-09 11:58:53.255 [INFO ][grid-timeout-worker-#23][org.apache.ignite.internal.IgniteKernal] FreeList [name=default##FreeList, buckets=256, dataPages=1, reusePages=1367]
2020-10-09 11:59:19.889 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Started exchange init [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], crd=true, evt=DISCOVERY_CUSTOM_EVT, evtNode=0aa67196-7cd2-4121-ad59-86a125c791db, customEvt=DynamicCacheChangeBatch [id=a8c1d290571-00c8b84a-af4b-41b3-8d03-0f079814104a, reqs=ArrayList [DynamicCacheChangeRequest [cacheName=Cache2, hasCfg=true, nodeId=0aa67196-7cd2-4121-ad59-86a125c791db, clientStartOnly=false, stop=false, destroy=false, disabledAfterStartfalse]], exchangeActions=ExchangeActions [startCaches=[Cache2], stopCaches=null, startGrps=[Cache2], stopGrps=[], resetParts=null, stateChangeRequest=null], startCaches=false, secSubjId=null], allowMerge=false, exchangeFreeSwitch=false]
2020-10-09 11:59:19.897 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Started cache [name=Cache2, id=2010787088, dataRegionName=default, mode=PARTITIONED, atomicity=ATOMIC, backups=0, mvcc=false]
2020-10-09 11:59:19.903 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], waitTime=0ms, futInfo=NA, mode=DISTRIBUTED]``2020-10-09 11:59:19.929 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partitions release latch: ServerLatch [permits=0, pendingAcks=HashSet [], super=CompletableLatch [id=CompletableLatchUid [id=exchange, topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2]]]]
2020-10-09 11:59:19.932 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finished waiting for partition release future [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], waitTime=0ms, futInfo=NA, mode=LOCAL]
2020-10-09 11:59:20.054 [INFO ][exchange-worker-#58][org.apache.ignite.internal.exchange.time] Finished exchange init [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], crd=true]
2020-10-09 11:59:20.064 [INFO ][sys-#5847][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Coordinator received single message [ver=AffinityTopologyVersion [topVer=7, minorTopVer=2], node=4e9f9dee-9735-47d0-814d-e008f85a1889, remainingNodes=1, allReceived=false]
2020-10-09 11:59:20.068 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Coordinator received single message [ver=AffinityTopologyVersion [topVer=7, minorTopVer=2], node=b073551f-6755-4ff8-a161-91eeb403d0a3, allReceived=true]
2020-10-09 11:59:20.069 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] finishExchangeOnCoordinator [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=7, minorTopVer=2]]
2020-10-09 11:59:20.076 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Finish exchange future [startVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], err=null, rebalanced=true, wasRebalanced=true]
2020-10-09 11:59:20.080 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.GridCacheProcessor] Finish proxy initialization, cacheName=Cache2, localNodeId=0aa67196-7cd2-4121-ad59-86a125c791db
2020-10-09 11:59:20.080 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Completed partition exchange [localNode=0aa67196-7cd2-4121-ad59-86a125c791db, exchange=GridDhtPartitionsExchangeFuture [topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], evt=DISCOVERY_CUSTOM_EVT, evtNode=TcpDiscoveryNode [id=0aa67196-7cd2-4121-ad59-86a125c791db, consistentId=10.53.116.77,127.0.0.1:47500, addrs=ArrayList [10.53.116.77, 127.0.0.1], sockAddrs=HashSet [/127.0.0.1:47500, tkles-pprb00116.vm.esrt.cloud.sbrf.ru/10.53.116.77:47500], discPort=47500, order=2, intOrder=2, lastExchangeTime=1602233959892, loc=true, ver=2.8.1#20200914-sha1:602ccc45, isClient=false], done=true, newCrdFut=null], topVer=AffinityTopologyVersion [topVer=7, minorTopVer=2]]
2020-10-09 11:59:20.080 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange timings [startVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], stage="Waiting in exchange queue" (0 ms), stage="Exchange parameters initialization" (0 ms), stage="Update caches registry" (0 ms), stage="Start caches" (7 ms), stage="Affinity initialization on cache group start" (5 ms), stage="Determine exchange type" (0 ms), stage="Preloading notification" (0 ms), stage="WAL history reservation" (0 ms), stage="Wait partitions release" (0 ms), stage="Wait partitions release latch" (25 ms), stage="Wait partitions release" (2 ms), stage="After states restored callback" (122 ms), stage="Waiting for all single messages" (14 ms), stage="Affinity recalculation (crd)" (0 ms), stage="Collect update counters and create affinity messages" (0 ms), stage="Validate partitions states" (0 ms), stage="Assign partitions states" (1 ms), stage="Apply update counters" (0 ms), stage="Full message preparing" (4 ms), stage="Full message sending" (0 ms), stage="Exchange done" (3 ms), stage="Total time" (183 ms), Discovery lag=1385956 ms, Latest started node id=0aa67196-7cd2-4121-ad59-86a125c791db]
2020-10-09 11:59:20.080 [INFO ][sys-#5848][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture] Exchange longest local stages [startVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], resVer=AffinityTopologyVersion [topVer=7, minorTopVer=2], stage="Affinity initialization on cache group start [grp=Cache2]" (5 ms) (parent=Affinity initialization on cache group start)]
2020-10-09 11:59:20.082 [INFO ][exchange-worker-#58][org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager] Skipping rebalancing (nothing scheduled) [top=AffinityTopologyVersion [topVer=7, minorTopVer=2], force=false, evt=DISCOVERY_CUSTOM_EVT, node=0aa67196-7cd2-4121-ad59-86a125c791db]

PME. Логи узла-координатора

Starting rebalance routine

2020-10-08 19:58:07.049 [INFO ][sys-#64][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemander] Starting rebalance routine [ignite-sys-cache, topVer=AffinityTopologyVersion [topVer=5, minorTopVer=0], supplier=0aa67196-7cd2-4121-ad59-86a125c791db, fullPartitions=[0-99], histPartitions=[]]

Начало процесса ребалансировки

Completed rebalance future

2020-10-08 19:58:07.074 [INFO ][rebalance-#69][org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemander] Completed rebalance future: RebalanceFuture [grp=CacheGroupContext [grp=ignite-sys-cache], topVer=AffinityTopologyVersion [topVer=5, minorTopVer=0], rebalanceId=1, routines=1, receivedBytes=1200, receivedKeys=0, partitionsLeft=0, startTime=1602176287046, endTime=-1, lastCancelledTime=-1]

RebalanceFuture завершен

>>>Transaction

2020-06-13 23:31:15.474[WARN ][grid-timeout-worker-#119%DPL_GRID%DplGridNodeName%][o.apache.ignite.internal.diagnostic] >>> Transaction [startTime=23:30:08.115, curTime=23:31:15.471, systemTime=67347, userTime=9, tx=GridNearTxLocal [mappings=IgniteTxMappingsSingleImpl [mapping=GridDistributedTxMapping [entries=LinkedHashSet [IgniteTxEntry [txKey=IgniteTxKey [cacheId=-2100569601], val=TxEntryValueHolder [op=TRANSFORM], prevVal=TxEntryValueHolder [op=NOOP], oldVal=TxEntryValueHolder [op=NOOP], entryProcessorsCol=LinkedList [T2 {org.gridgain.grid.internal.processors.security.GridEntSecurityProcessor$AddSubjectNode@b205f19=Object[] []}], ttl=-1, conflictExpireTime=-1, conflictVer=null, explicitVer=null, dhtVer=null, filters=CacheEntryPredicate[] [], filtersPassed=false, filtersSet=true, entry=GridCacheMapEntry [ver=GridCacheVersion [topVer=0, order=0, nodeOrder=0], hash=278770679, extras=null, flags=0]GridDistributedCacheEntry [super=]GridDhtDetachedCacheEntry [super=], prepared=0, locked=false, nodeId=4d40a649-681c-42f8-8f11-85f471ec21da, locMapped=false, expiryPlc=null, transferExpiryPlc=false, flags=0, partUpdateCntr=0, serReadVer=null, xidVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40]]], explicitLock=false, dhtVer=null, last=false, nearEntries=0, clientFirst=false, node=4d40a649-681c-42f8-8f11-85f471ec21da]], nearLocallyMapped=false, colocatedLocallyMapped=false, needCheckBackup=null, hasRemoteLocks=false, trackTimeout=false, systemTime=0, systemStartTime=10318651595673684, prepareStartTime=10318651595673938, prepareTime=0, commitOrRollbackStartTime=0, commitOrRollbackTime=0, txDumpsThrottling=o.a.i.i.processors.cache.transactions.IgniteTxManager$TxDumpsThrottling@54e45a49, lb=null, thread=<failed to find active thread 19506012>, mappings=IgniteTxMappingsSingleImpl [mapping=GridDistributedTxMapping [entries=LinkedHashSet [IgniteTxEntry [txKey=IgniteTxKey [cacheId=-2100569601], val=TxEntryValueHolder [op=TRANSFORM], prevVal=TxEntryValueHolder [op=NOOP], oldVal=TxEntryValueHolder [op=NOOP], entryProcessorsCol=LinkedList [T2 {org.gridgain.grid.internal.processors.security.GridEntSecurityProcessor$AddSubjectNode@b205f19=Object[] []}], ttl=-1, conflictExpireTime=-1, conflictVer=null, explicitVer=null, dhtVer=null, filters=CacheEntryPredicate[] [], filtersPassed=false, filtersSet=true, entry=GridCacheMapEntry [ver=GridCacheVersion [topVer=0, order=0, nodeOrder=0], hash=278770679, extras=null, flags=0]GridDistributedCacheEntry [super=]GridDhtDetachedCacheEntry [super=], prepared=0, locked=false, nodeId=4d40a649-681c-42f8-8f11-85f471ec21da, locMapped=false, expiryPlc=null, transferExpiryPlc=false, flags=0, partUpdateCntr=0, serReadVer=null, xidVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40]]], explicitLock=false, dhtVer=null, last=false, nearEntries=0, clientFirst=false, node=4d40a649-681c-42f8-8f11-85f471ec21da]], super=GridDhtTxLocalAdapter [nearOnOriginatingNode=false, nearNodes=KeySetView [], dhtNodes=KeySetView [], explicitLock=false, super=IgniteTxLocalAdapter [completedBase=null, sndTransformedVals=false, depEnabled=false, txState=IgniteTxImplicitSingleStateImpl [init=true, recovery=false], super=IgniteTxAdapter [xidVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40], writeVer=null, implicit=true, loc=true, threadId=19506012, startTime=1592080208115, nodeId=48cf019e-0798-48ac-8c88-4f43e5908388, startVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40], endVer=null, isolation=READ_COMMITTED, concurrency=OPTIMISTIC, timeout=0, sysInvalidate=false, sys=true, plc=5, commitVer=GridCacheVersion [topVer=199920424, order=1592052840768, nodeOrder=40], finalizing=NONE, invalidParts=null, state=PREPARING, timedOut=false, topVer=AffinityTopologyVersion [topVer=592, minorTopVer=0], skipCompletedVers=false, duration=67356ms, onePhaseCommit=false], size=1]]]]

LRT

deadlock

Deadlock: true
Completed: 298100
Thread [name=""sys-stripe-3-#4"", id=23, state=WAITING, blockCnt=579, waitCnt=234477]
Lock [object=java.util.concurrent.locks.ReentrantLock$NonfairSync@6a5e882b, ownerName=sys-stripe-6-#7, ownerId=26]
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
at o.a.i.i.processors.cache.GridCacheMapEntry.lockEntry(GridCacheMapEntry.java:5033)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.lockEntries(GridDhtAtomicCache.java:3093)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal0(GridDhtAtomicCache.java:1806)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal(GridDhtAtomicCache.java:1714)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.processNearAtomicUpdateRequest(GridDhtAtomicCache.java:3301)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.access$400(GridDhtAtomicCache.java:141)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:273)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:268)
at o.a.i.i.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:1142)
at o.a.i.i.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:591)
at o.a.i.i.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:392)
at o.a.i.i.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:318)
at o.a.i.i.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:109)
at o.a.i.i.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:308)
at o.a.i.i.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1843)
at o.a.i.i.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1468)
at o.a.i.i.managers.communication.GridIoManager.access$5200(GridIoManager.java:229)
at o.a.i.i.managers.communication.GridIoManager$9.run(GridIoManager.java:1365)
at o.a.i.i.util.StripedExecutor$Stripe.body(StripedExecutor.java:555)
at o.a.i.i.util.worker.GridWorker.run(GridWorker.java:120) <br> at java.lang.Thread.run(Thread.java:748)

Взаимная блокировка

Cluster-wide snapshot operation started

[IgniteSnapshotManager] Cluster-wide snapshot operation started [snpName=MySnapshot, grps=[1794698200]]

Запуск операции создания снепшота

Cluster-wide snapshot operation finished successfully

[IgniteSnapshotManager] Cluster-wide snapshot operation finished successfully: SnapshotOperationRequest [rqId=1a24fa7d-4e50-4714-ae68-959892c6d5a3, srcNodeId=b7b71afb-32c5-4730-b0dc-5090920cf4f0, snpName=MySnapshot, grpIds=ArrayList [1794698200], bltNodes=HashSet [b7b71afb-32c5-4730-b0dc-5090920cf4f0], err=null]

Завершение операции создания снепшота

Часто встречающиеся проблемы и пути их устранения#

Раздел предусмотрен для будущих обновлений.