Обработка исключений#
В разделе описываются основные исключения, которые может сгенерировать DataGrid, а также объясняется, как настроить и использовать обработчик критических ошибок.
В таблице описаны исключения, которые поддерживает Ignite API, и действия для обработки исключений:
Исключение |
Описание |
Действие для обработки исключения |
Исключения в режиме выполнения (runtime) |
|---|---|---|---|
|
Генерируется при попытке выполнения операций с кешем, в котором есть потерянные партиции. В зависимости от политики потери партиций, которая настроена для кеша, это исключение генерируется при операциях чтения или записи. Подробнее об этом написано в подразделе «Политика потери партиций» раздела «Настройка кешей» |
Сброс потерянных партиций. Чтобы восстановить данные, верните в кластер узлы, которые привели к потере партиций |
Да |
|
Указывает на наличие ошибки в кластере |
Операция не выполнена. Выйдите из метода |
Да |
|
Генерируется с помощью Ignite API при отключении клиентского узла от кластера. Генерируется из операций с кешем, Compute API и структур данных |
Подождите и повторите выполнение операции |
Да |
|
Генерируется при ошибках аутентификации узла или безопасности |
Операция не выполнена. Выйдите из метода |
Нет |
|
Может быть сгенерировано из операций c кешем |
Проверьте сообщение об исключении — в нем указано, что нужно сделать |
Да |
|
Генерируется, когда Ignite API не может развернуть задание или задачу на узле. Генерируется из Compute API |
Операция не выполнена. Выйдите из метода |
Да |
|
Генерируется при внештатном прерывании выполнения задачи или потока |
Выполните корректное завершение задачи (task) / задания (job) и освободите ресурсы. Для вычислительных задач (compute tasks) используйте кооперативную отмену: переопределите метод |
Да |
|
Генерируется различными SPI ( |
Операция не выполнена. Выйдите из метода |
Да |
|
Генерируется при ошибке обработки SQL-запроса. Исключение также предоставляет коды ошибок, которые относятся к запросу |
Операция не выполнена. Выйдите из метода |
Да |
|
Генерируется при наличии ошибок аутентификации/авторизации |
Операция не выполнена. Выйдите из метода |
Нет |
|
Генерируется из API кеша DataGrid при перезапуске кеша |
Подождите и повторите выполнение операции |
Да |
|
Генерируется, когда истекает время получения результата асинхронных вычислений |
Увеличьте ограничение по тайм-ауту или выйдите из метода |
Да |
|
Генерируется, когда вычисление |
Повторите выполнение операции |
Да |
|
Указывает, что экземпляр DataGrid находится в недопустимом состоянии для запрошенной операции |
Операция не выполнена. Выйдите из метода |
Да |
|
Указывает, что узел должен попытаться повторно подключиться к кластеру |
Повторите выполнение операции |
Нет |
|
Генерируется, если обнаружено нарушение целостности данных |
Операция не выполнена. Выйдите из метода |
Да |
|
Генерируется из операций с кешем, когда система не имеет достаточного размера памяти для обработки операций DataGrid |
Операция не выполнена. Выйдите из метода |
Да |
|
Генерируется при оптимистичном падении транзакции |
Повторите выполнение операции |
Нет |
|
Генерируется при автоматическом откате транзакции |
Повторите выполнение операции |
Нет |
|
Генерируется, когда время выполнения транзакции истекло |
Повторите выполнение операции |
Нет |
|
Указывает на наличие ошибки в топологии кластера, например критического сбоя узла и других. Генерируется из Compute и Events API |
Подождите выполнение |
Да |
Обработка критических сбоев#
DataGrid — отказоустойчивая система. В реальности могут возникать непредсказуемые проблемы, которые влияют на состояние отдельного узла или всего кластера. Такие проблемы можно обнаружить во время выполнения и устранить с помощью предварительно настроенного обработчика критических ошибок.
Критические сбои#
Ошибки, которые относятся к критическим:
системные критические ошибки, в том числе
OutOfMemoryError(подробнее написано в перечне ниже);случайные завершения работы системных рабочих потоков, в том числе из-за необработанных исключений;
зависание системных рабочих потоков;
сегментация узлов кластера.
Системные критические ошибки ведут к неработоспособности системы, например:
Ошибки файлового ввода-вывода — обычно
IOExceptionгенерируется во время операций чтения и записи. Ошибка может появляться при режиме хранения в памяти и включенной персистентности регионов данных (в том числе при ошибках устройства и в случаях, когда не осталось места в памяти). DataGrid использует диск для хранения метаданных, например в случаях, когда превышен лимит файловых дескрипторов или запрещен доступ к файлу.Ошибка нехватки памяти — системе управления памяти DataGrid не удается выделить больше места (
IgniteOutOfMemoryException).Ошибка нехватки памяти — на узле кластера заканчивается Java heap (
OutOfMemoryError).
Обработка критических сбоев#
Когда DataGrid обнаруживает критический сбой, он устраняется в соответствии с предварительно настроенным обработчиком ошибок. Пример настройки обработчика:
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="failureHandler">
<bean class="org.apache.ignite.failure.StopNodeFailureHandler"/>
</property>
</bean>
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setFailureHandler(new StopNodeFailureHandler());
Ignite ignite = Ignition.start(cfg);
DataGrid поддерживает следующие обработчики ошибок:
Класс |
Описание |
|---|---|
|
Игнорирует любые сбои. Полезно для тестирования и отладки |
|
Реализация, которую можно использовать только с |
|
Вызывает остановку узла в случае критических ошибок с помощью вызова метода |
|
Обработчик ошибок по умолчанию, который вызывает остановку узла. Если узел не может остановиться, обработчик прекращает процессы JVM |
Проверка работоспособности критически важных потоков#
В DataGrid есть несколько внутренних потоков, которые критически важны для корректной работы кластера. Если один из них остановился, узел может стать неработоспособным.
Критически важные системные потоки:
Discovery worker— обработка событий Discovery.TCP communication worker— одноранговая (peer-to-peer) коммуникация между узлами.Exchange worker— обмен картой партиций.Striped pool— выполнение пользовательских операцийSystem pool— координация работы кластера, обработка системных событий, управление кешем.Timeout worker— обработка тайм-аутов.Checkpoint thread— создание контрольных точек в персистентном DataGrid.WAL workers— ведение WAL-журнала, архивирование сегментов и сжатие.Expiration worker— отслеживание срока жизни кешей TTL.NIO workers— обработка сетевых операций.
В DataGrid есть внутренний механизм проверки работоспособности критически важных потоков. Каждый поток регулярно проверяется, чтобы подтвердить, что он активен и обновляет временную метку Heartbeat. Если поток неактивен и не обновляется, он считается заблокированным. DataGrid выведет сообщение в log-файл. Можно установить период неактивности с помощью свойства IgniteConfiguration.systemWorkerBlockedTimeout.
Хотя в DataGrid отсутствие ответа системного потока считается критической ошибкой, эта ситуация не обрабатывается автоматически, кроме вывода сообщения в log-файл. Чтобы включить конкретный обработчик ошибок для не отвечающих системных потоков всех типов, очистите свойство обработчика ignoredFailureTypes:
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="systemWorkerBlockedTimeout" value="#{60 * 60 * 1000}"/>
<property name="failureHandler">
<bean class="org.apache.ignite.failure.StopNodeFailureHandler">
<!-- Разрешите обработчику реагировать на неактивные критические потоки. -->
<property name="ignoredFailureTypes">
<list>
</list>
</property>
</bean>
</property>
</bean>
StopNodeFailureHandler failureHandler = new StopNodeFailureHandler();
failureHandler.setIgnoredFailureTypes(Collections.EMPTY_SET);
IgniteConfiguration cfg = new IgniteConfiguration().setFailureHandler(failureHandler);
Ignite ignite = Ignition.start(cfg);
Обработка исключений в вычислительных заданиях#
Если ComputeTaskAdapter используется в качестве реализации вычислительной задачи и любое сопоставленное вычислительное задание генерирует исключение во время выполнения, вся вычислительная задача немедленно завершается с исключением IgniteException, а все оставшиеся вычислительные задания останавливаются асинхронно. Сбои вычислительных заданий можно отслеживать в лог-файле DataGrid по сообщениям вида Remote job throws user exception…. Подробнее о классе ComputeTaskAdapter написано в подразделе «Адаптеры вычислительных задач» раздела «MapReduce API».
Примечание
В данном случае нет гарантии, что все вычислительные задания завершат свое исполнение к концу выполнения вычислительной задачи.