Балансировка чтения
Содержание раздела
Система поддерживает балансировку запросов на чтение и выгрузку данных, позволяя гибко распределять нагрузку между датасорсами хранилища. Например, можно направлять высокоприоритетные и низкоприоритетные запросы в разные датасорсы или выделить им разный объем ресурсов.
Запросы балансируются, если им назначены приоритеты и для этих приоритетов заданы настройки балансировки. В остальных случаях запросы обрабатываются без балансировки — по алгоритму, действовавшему по умолчанию до версии 7.6 включительно.
Далее балансировка запросов на чтение и выгрузку данных для краткости называется балансировкой чтения.
Балансировка чтения доступна во всех поддерживаемых СУБД хранилища.
Возможности балансировки
Механизм балансировки:
- проверяет назначенный запросу приоритет; если он не задан — назначает приоритет по умолчанию;
- помещает запрос в очередь, соответствующую его приоритету;
- занимает слот на чтение в наиболее подходящем датасорсе и направляет туда запрос.
Приоритет запроса
Приоритет запроса — категория, назначенная запросу и определяющая порядок его балансировки.
Приоритет задается внешней системой и передается как параметр запроса. Если он не задан, Prostore назначает запросу приоритет по умолчанию (READ_BALANCE_SQL_REQUEST_PRIORITY). Если приоритет не задан ни внешней системой, ни параметром READ_BALANCE_SQL_REQUEST_PRIORITY, запрос обрабатывается без балансировки.
Приоритеты запросов могут быть произвольными, но для балансировки запросов с этим приоритетом должны быть заданы настройки балансировки.
Подробнее о задании приоритета запроса см. в секции Назначение приоритета запросу.
Как работает балансировка
Каждый балансируемый запрос помещается в очередь и исполняется в подходящем датасорсе при появлении свободного слота.
Запросы чтения распределяются по датасорсам на основе факторов:
- приоритета запроса;
- весов датасорсов, настроенных для этого приоритета;
- текущей нагрузки датасорсов.
Система стремится предоставить наилучшие условия обработки для каждого запроса: среди датасорсов, настроенных для приоритета запроса, выбирается тот, у которого есть свободные слоты и настроен наибольший вес. Из одинаково подходящих выбирается датасорс с наибольшим числом свободных слотов.
Подробнее о выборе датасорса см. в разделе Выбор датасорса для исполнения запроса.
Слоты на чтение
В датасорсах, участвующих в балансировке, выделяются слоты — логические единицы ресурса, ограничивающие число параллельных запросов. Слоты не отражают физически доступный объем ресурсов датасорса.
Жизненный цикл слотов
Запрос, передаваемый нодой на исполнение в датасорс, занимает там слот своего приоритета и освобождает его по завершении обработки. При потоковом чтении слот также освобождается при закрытии соединения.
Каждая нода Prostore самостоятельно выделяет слоты для полученных ею запросов, не обмениваясь этой информацией с другими нодами. При перезапуске ноды ее счетчик занятых слотов обнуляется.
Лимиты слотов
Лимит слотов, выделяемых нодой, определяется настройками балансировки. Поэтому общее число слотов в датасорсе для одного приоритета равно лимит_слотов_в_датасорсе_для_ноды × количество_нод.
При отключении или недоступности датасорса его слоты не передаются другим, и до его восстановления общее число слотов снижается.
Слоты при запросах к партиционированным таблицам
Запрос к партиционированной таблице занимает слот в каждом датасорсе с задействованными партициями.
Если в некоторых целевых датасорсах свободных слотов нет, запрос занимает слоты в датасорсах со свободными слотами и ожидает освобождения слотов в остальных целевых датасорсах. Ответ возвращается только после получения данных из всех задействованных партиций.
Очереди запросов
Балансируемый запрос помещается в очередь его приоритета и ждет свободного слота в подходящем датасорсе. На уровне очереди время ожидания не ограничено, но оно входит вместе с остальными этапами обработки в общий лимит исполнения запроса:
- [HTTP] fetchTimeoutMs,
- [JDBC] setQueryTimeout.
Порядок обработки очереди
Запросы из очереди обрабатываются по принципу FIFO: первым обрабатывается запрос, помещенный в очередь раньше других. Но пока запрос ждет свободные слоты в подходящих для него датасорсах, он пропускает вперед запросы, для которых есть слоты в других датасорсах.
Количество и размеры очередей
Каждая нода независимо от других нод ведет свой набор очередей: по одной на каждый настроенный приоритет запросов. При событиях, влияющих на число слотов, нода проверяет, появились ли свободные слоты и какие запросы из очередей можно в них направить. Примеры таких событий:
- завершение обработки запроса,
- обнуление счетчиков слотов,
- изменение настроек балансировки.
Максимальный размер очередей определяется параметром конфигурации READ_BALANCE_QUEUE_SIZE. При достижении лимита нода возвращает ошибку для новых запросов с этим приоритетом.
Удаление настроек для запросов в очереди
Если удаляются настройки для приоритета запросов, запросы с этим приоритетом освобождаются из очереди и обрабатываются вне механизма балансировки.
Настройки балансировки
Настройки балансировки определяют, как запросы распределяются по датасорсам в зависимости от приоритета, и хранятся в сервисных БД нод.
Каждая настройка задает:
- приоритет запросов, для которого она действует;
- датасорс, выделенный для обработки запросов этого приоритета;
- вес датасорса относительно других датасорсов, выделенных для этого приоритета;
- лимит слотов в датасорсе для запросов этого приоритета.
Подробнее о настройке балансировки см. в секции Управление настройками балансировки.
Ограничения
- Балансировка поддерживается только для запросов чтения (SELECT) и выгрузки (INSERT INTO download_external_table). Остальные запросы, даже содержащие SELECT-подзапросы (INSERT SELECT, CREATE VIEW, CREATE MATERIALIZED VIEW), не балансируются.
- Каждая нода Prostore балансирует запросы, полученные ей, независимо от других нод.
- Для запроса с указанным приоритетом датасорс всегда выбирается из настроенных для этого приоритета, даже при строгих критериях выбора (
DATASOURCE_TYPE/ снапшот-таблицы). Если ни один настроенный датасорс не подходит, возвращается ошибка. - Отключение и недоступность датасорсов:
- В очередь помещаются только запросы, которые могут быть исполнены во включенных датасорсах. Остальные запросы сразу отклоняются с ошибкой.
- При отключении или недоступности датасорса его слоты не передаются другим, и до его восстановления общее число слотов снижается.
Управление балансировкой
Включение балансировки
Чтобы включить балансировку чтения:
- Добавьте настройки балансировки (см. Управление настройками балансировки).
- Назначьте приоритет запросам, для которых не подходит приоритет по умолчанию (см. Назначение приоритета запросу).
После этого запросы с приоритетами, для которых есть настройки, начнут балансироваться. Дополнительно активировать балансировку или перезапускать ноды не нужно.
Управление настройками балансировки
- Чтобы добавить настройки:
- Задайте приоритет запросов по умолчанию с помощью параметра конфигурации
READ_BALANCE_SQL_REQUEST_PRIORITY. - Если необходимо, измените другие параметры в секции конфигурации
readBalance. - Выполните SET_READ_BALANCE — по одному вызову на каждую пару «приоритет запросов + датасорс».
- Задайте приоритет запросов по умолчанию с помощью параметра конфигурации
- Чтобы проверить текущие настройки, выполните GET_READ_BALANCE.
- Чтобы удалить настройки, выполните ERASE_READ_BALANCE.
Назначение приоритета запросу
Чтобы назначить запросу приоритет, отличный от приоритета по умолчанию:
- [HTTP] задайте
sqlRequestPriorityпри отправке запроса через /query или /query-upload. - [JDBC] используйте метод
setSqlRequestPriority(String priority)нестандартного JDBC-интерфейсаDtmStatementExt.
Управление слотами датасорсов
- Чтобы проверить текущее состояние слотов, выполните CHECK_READ_SLOTS.
- Чтобы обнулить счетчик занятых слотов (например, при отладке настроек), выполните RESET_READ_SLOTS.