Балансировка чтения

Содержание раздела
  1. Возможности балансировки
  2. Приоритет запроса
  3. Как работает балансировка
    1. Слоты на чтение
      1. Жизненный цикл слотов
      2. Лимиты слотов
      3. Слоты при запросах к партиционированным таблицам
    2. Очереди запросов
      1. Порядок обработки очереди
      2. Количество и размеры очередей
      3. Удаление настроек для запросов в очереди
  4. Настройки балансировки
  5. Ограничения
  6. Управление балансировкой
    1. Включение балансировки
    2. Управление настройками балансировки
    3. Назначение приоритета запросу
    4. Управление слотами датасорсов

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

Запросы балансируются, если им назначены приоритеты и для этих приоритетов заданы настройки балансировки. В остальных случаях запросы обрабатываются без балансировки — по алгоритму, действовавшему по умолчанию до версии 7.6 включительно.

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

Балансировка чтения доступна во всех поддерживаемых СУБД хранилища.

Возможности балансировки

Механизм балансировки:

  • проверяет назначенный запросу приоритет; если он не задан — назначает приоритет по умолчанию;
  • помещает запрос в очередь, соответствующую его приоритету;
  • занимает слот на чтение в наиболее подходящем датасорсе и направляет туда запрос.

Приоритет запроса

Приоритет запроса — категория, назначенная запросу и определяющая порядок его балансировки.

Приоритет задается внешней системой и передается как параметр запроса. Если он не задан, Prostore назначает запросу приоритет по умолчанию (READ_BALANCE_SQL_REQUEST_PRIORITY). Если приоритет не задан ни внешней системой, ни параметром READ_BALANCE_SQL_REQUEST_PRIORITY, запрос обрабатывается без балансировки.

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

Подробнее о задании приоритета запроса см. в секции Назначение приоритета запросу.

Как работает балансировка

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

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

  • приоритета запроса;
  • весов датасорсов, настроенных для этого приоритета;
  • текущей нагрузки датасорсов.

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

Подробнее о выборе датасорса см. в разделе Выбор датасорса для исполнения запроса.

Слоты на чтение

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

Жизненный цикл слотов

Запрос, передаваемый нодой на исполнение в датасорс, занимает там слот своего приоритета и освобождает его по завершении обработки. При потоковом чтении слот также освобождается при закрытии соединения.

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

Лимиты слотов

Лимит слотов, выделяемых нодой, определяется настройками балансировки. Поэтому общее число слотов в датасорсе для одного приоритета равно лимит_слотов_в_датасорсе_для_ноды × количество_нод.

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

Слоты при запросах к партиционированным таблицам

Запрос к партиционированной таблице занимает слот в каждом датасорсе с задействованными партициями.

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

Очереди запросов

Балансируемый запрос помещается в очередь его приоритета и ждет свободного слота в подходящем датасорсе. На уровне очереди время ожидания не ограничено, но оно входит вместе с остальными этапами обработки в общий лимит исполнения запроса:

Порядок обработки очереди

Запросы из очереди обрабатываются по принципу FIFO: первым обрабатывается запрос, помещенный в очередь раньше других. Но пока запрос ждет свободные слоты в подходящих для него датасорсах, он пропускает вперед запросы, для которых есть слоты в других датасорсах.

Количество и размеры очередей

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

  • завершение обработки запроса,
  • обнуление счетчиков слотов,
  • изменение настроек балансировки.

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

Удаление настроек для запросов в очереди

Если удаляются настройки для приоритета запросов, запросы с этим приоритетом освобождаются из очереди и обрабатываются вне механизма балансировки.

Настройки балансировки

Настройки балансировки определяют, как запросы распределяются по датасорсам в зависимости от приоритета, и хранятся в сервисных БД нод.

Каждая настройка задает:

  • приоритет запросов, для которого она действует;
  • датасорс, выделенный для обработки запросов этого приоритета;
  • вес датасорса относительно других датасорсов, выделенных для этого приоритета;
  • лимит слотов в датасорсе для запросов этого приоритета.

Подробнее о настройке балансировки см. в секции Управление настройками балансировки.

Ограничения

  • Балансировка поддерживается только для запросов чтения (SELECT) и выгрузки (INSERT INTO download_external_table). Остальные запросы, даже содержащие SELECT-подзапросы (INSERT SELECT, CREATE VIEW, CREATE MATERIALIZED VIEW), не балансируются.
  • Каждая нода Prostore балансирует запросы, полученные ей, независимо от других нод.
  • Для запроса с указанным приоритетом датасорс всегда выбирается из настроенных для этого приоритета, даже при строгих критериях выбора (DATASOURCE_TYPE / снапшот-таблицы). Если ни один настроенный датасорс не подходит, возвращается ошибка.
  • Отключение и недоступность датасорсов:
    • В очередь помещаются только запросы, которые могут быть исполнены во включенных датасорсах. Остальные запросы сразу отклоняются с ошибкой.
    • При отключении или недоступности датасорса его слоты не передаются другим, и до его восстановления общее число слотов снижается.

Управление балансировкой

Включение балансировки

Чтобы включить балансировку чтения:

  1. Добавьте настройки балансировки (см. Управление настройками балансировки).
  2. Назначьте приоритет запросам, для которых не подходит приоритет по умолчанию (см. Назначение приоритета запросу).

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

Управление настройками балансировки

  • Чтобы добавить настройки:
    1. Задайте приоритет запросов по умолчанию с помощью параметра конфигурации READ_BALANCE_SQL_REQUEST_PRIORITY.
    2. Если необходимо, измените другие параметры в секции конфигурации readBalance.
    3. Выполните 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.