Плавное завершение работы
Начиная с версии v1.5.2, Selena поддерживает плавное завершение работы (Graceful Exit).
Обзор
Плавное завершение работы — это механизм, предназначенный для поддержки обновлений и перезапусков без прерывания работы узлов FE, BE и CN в Selena. Его основная цель — минимизировать влияние на выполняющиеся запросы и задачи загрузки данных во время операций обслуживания, таких как перезапуск узла, последовательное обновление или масштабирование cluster.
Плавное завершение работы гарантирует, что:
- Узел прекращает принимать новые задачи посл е начала завершения работы;
- Существующим запросам и заданиям загрузки разрешено завершиться в контролируемом временном окне;
- Системные компоненты (FE/BE/CN) координируют изменения статуса, чтобы cluster корректно перенаправлял трафик.
Механизмы плавного завершения работы различаются для узлов FE и BE/CN, как описано ниже.
Механизм плавного завершения работы FE
Сигнал триггера
Плавное завершение работы FE инициируется командой:
stop_fe.sh -g
Это отправляет сигнал SIGUSR1, тогда как завершение по умолчанию (без опции -g) отправляет сигнал SIGTERM.
Осведомлённость балансировщика нагрузки
При получении сигнала:
- FE немедленно возвращает HTTP 500 на конечной точке
/api/health. - Балансировщики нагрузки обнаруживают ухудшенное состояние в течение ~15 секунд и прекращают направлять новые соединения к этому FE.
Логика опустошения соединений и завершения работы
Follower FE
- Обрабатывает запросы только на чтение.
- Если у узла FE нет активных сессий, соединение закрывается немедленно.
- Если выполняется SQL, узел FE ожидает завершения выполнения перед закрытием сессии.
Leader FE
-
Обработка запросов на чтение идентична обработке Follower.
-
Обработка запросов на запись требует:
- Закрытия BDBJE.
- Разрешения завершения выбора нового Leader.
- Перенаправления последующих записей на вновь избранного Leader.
Контроль тайм-аута
Если запрос выполняется слишком долго, FE принудительно завершает работу через 60 секунд (настраивается с помощью опции --timeout).
Механизм плавного завершения работы BE/CN
Сигнал триггера
Плавное завершение работы BE инициируется командой:
stop_be.sh -g
Плавное завершение работы CN инициируется командой:
stop_cn.sh -g
Это отправляет сигнал SIGTERM, тогда как завершение по умолчанию (без опции -g) отправляет сигнал SIGKILL.
Переход состояния
После получения сигнала:
- Узел BE/CN помечает себя как завершающийся.
- Он отклоняет новые фрагменты запросов, возвращая
INTERNAL_ERROR. - Он продолжает обрабатывать существующие фрагменты.
Цикл ожидания для выполняющихся запросов
Поведение, при котором BE/CN ожидает завершения существующих фрагментов, контролируется параметром конфигурации BE/CN loop_count_wait_fragments_finish (по умолчанию: 2). Фактическая продолжительность ожидания равна loop_count_wait_fragments_finish × 10 секунд (то есть 20 секунд по умолчанию). Если фрагменты остаются после тайм-аута, BE/CN продолжает нормальное завершение работы (закрытие потоков, сети и других процессов).
Улучшенная осведомлённость FE
Начиная с версии v1.5.2, FE больше не помечает BE/CN как DEAD на основе сбоев heartbeat. Он корректно распознаёт состояние BE/CN "завершение работы", что позволяет значительно увеличить временные окна плавного завершения для завершения фрагментов.
Конфигурации
Конфигурации FE
stop_fe.sh -g --timeout
- Описание: Максимальное время ожидания перед принудительным завершением FE.
- По умолчанию: 60 (секунд)
- Как применить: Укажите в команде скрипта, например,
--timeout 120.
Минимальное время обнаружения LB
- Описание: Балансировщику нагрузки требуется минимум 15 секунд для обнаружения ухудшенного состояния.
- По умолчанию: 15 (секунд)
- Как применить: Фиксированное значение
Конфигурации BE/CN
loop_count_wait_fragments_finish
- Описание: Продолжительность ожидания BE/CN для существующих фрагментов. Умножьте значение на 10 секунд.
- По умолчанию: 2
- Как применить: Измените в файле конфигурации BE/CN или обновите динамически.
graceful_exit_wait_for_frontend_heartbeat
- Описание: Ожидает ли BE/CN подтверждения SHUTDOWN от FE через heartbeat. Начиная с версии v1.5.2.
- По умолчанию: false
- Как применить: Измените в файле конфигурации BE/CN или обновите динамически.
stop_be.sh -g --timeout, stop_cn.sh -g --timeout
- Описание: Максимальное время ожидания перед принудительным завершением BE/CN. Установите значение больше, чем
loop_count_wait_fragments_finish* 10, чтобы предотвратить завершение до достижения времени ожидания BE/CN. - По умолчанию: false
- Как применить: Укажите в команде скрипта, например,
--timeout 30.