Перейти к основному содержимому
Версия: 2.0.x

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

В этом разделе описывается, как управлять очередями запросов в Selena.

Начиная с версии v1.5.2, Selena поддерживает очереди запросов. При включённых очередях запросов Selena автоматически ставит входящие запросы в очередь, когда достигнут порог параллелизма или лимит ресурсов, тем самым предотвращая ухудшение перегрузки. Ожидающие запросы ждут в очереди, пока не станет доступно достаточно вычислительных ресурсов для начала выполнения. Начиная с версии v1.5.2, Selena поддерживает настройку очередей запросов на уровне группы ресурсов.

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

Дорожная карта:

ВерсияГлобальная очередь запросовОчередь на уровне группы ресурсовКоллективное управление параллелизмомДинамическая корректировка параллелизма
v1.5.2
v1.5.2

Включение очередей запросов

Очереди запросов отключены по умолчанию. Вы можете включить глобальные очереди или очереди на уровне группы ресурсов для загрузки INSERT, SELECT-запросов и запросов статистики, установив соответствующие глобальные переменные сессии.

Включение глобальных очередей запросов

  • Включить очереди запросов для задач загрузки:
SET GLOBAL enable_query_queue_load = true;
  • Включить очереди запросов для SELECT-запросов:
SET GLOBAL enable_query_queue_select = true;
  • Включить очереди запросов для запросов статистики:
SET GLOBAL enable_query_queue_statistic = true;

Включение очередей запросов на уровне группы ресурсов

Начиная с версии v1.5.2, Selena поддерживает настройку очередей запросов на уровне группы ресурсов.

Чтобы включить очереди запросов на уровне группы ресурсов, вам также нужно установить enable_group_level_query_queue в дополнение к глобальным переменным сессии, упомянутым выше.

SET GLOBAL enable_group_level_query_queue = true;

Указание порогов ресурсов

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

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

ПеременнаяПо умолчаниюОписание
query_queue_concurrency_limit0Верхний предел параллельных запросов на BE. Вступает в силу только при значении больше 0. Значение 0 означает, что лимит не установлен.
query_queue_mem_used_pct_limit0Верхний предел процента использования памяти на BE. Вступает в силу только при значении больше 0. Значение 0 означает, что лимит не установлен. Диапазон: [0, 1]
query_queue_cpu_used_permille_limit0Верхний предел промилле использования CPU (использование CPU * 1000) на BE. Вступает в силу только при значении больше 0. Значение 0 означает, что лимит не установлен. Диапазон: [0, 1000]

ПРИМЕЧАНИЕ

По умолчанию BE отправляет отчёт об использовании ресурсов в FE с интервалом в одну секунду. Вы можете изменить этот интервал, установив элемент конфигурации BE report_resource_usage_interval_ms.

Указание порогов ресурсов для очередей на уровне группы ресурсов

Начиная с версии v1.5.2, вы можете установить индивидуальные лимиты параллелизма (concurrency_limit) и лимиты ядер CPU (max_cpu_cores) при создании группы ресурсов. Когда инициируется запрос, если любое из потреблений ресурсов превышает порог ресурсов на глобальном уровне или уровне группы ресурсов, запрос будет помещён в очередь до тех пор, пока все потребления ресурсов не будут в пределах порога.

ПеременнаяПо умолчаниюОписание
concurrency_limit0Лимит параллелизма для группы ресурсов на одном узле BE. Вступает в силу только при значении больше 0.
max_cpu_cores0Лимит ядер CPU для этой группы ресурсов на одном узле BE. Вступает в силу только при значении больше 0. Диапазон: [0, avg_be_cpu_cores], где avg_be_cpu_cores представляет среднее количество ядер CPU на всех узлах BE.

Вы можете использовать SHOW USAGE RESOURCE GROUPS для просмотра информации об использовании ресурсов для каждой группы ресурсов на каждом узле BE, как описано в Просмотр информации об использовании группы ресурсов.

Управление параллелизмом запросов

Когда количество выполняющихся запросов (num_running_queries) превышает глобальный лимит или concurrency_limit группы ресурсов, входящие запросы помещаются в очередь. Способ получения num_running_queries отличается между версиями < v1.5.2 и >= v1.5.2.

  • В версиях < v1.5.2 num_running_queries сообщается BE с интервалом, указанным в report_resource_usage_interval_ms. Поэтому может быть некоторая задержка в идентификации изменений в num_running_queries. Например, если num_running_queries, сообщённое BE в данный момент, не превышает глобальный лимит или concurrency_limit группы ресурсов, но входящие запросы поступают и превышают concurrency_limit до следующего отчёта, эти входящие запросы будут выполнены без ожидания в очереди.

  • В версиях >= v1.5.2 все выполняющиеся запросы коллективно управляются Leader FE. Каждый Follower FE уведомляет Leader FE при инициировании или завершении запроса, позволяя Selena обрабатывать сценарии, когда происходит внезапное увеличение запросов, превышающих concurrency_limit.

Настройка очередей запросов

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

ПеременнаяПо умолчаниюОписание
query_queue_max_queued_queries1024Верхний предел запросов в очереди. При достижении этого порога входящие запросы отклоняются. Вступает в силу только при значении больше 0.
query_queue_pending_timeout_second300Максимальный тайм-аут ожидающего запроса в очереди. При достижении этого порога соответствующий запрос отклоняется. Единица измерения: секунды.

Настройка динамической корректировки параллелизма запросов

Начиная с версии v1.5.2, для запросов, управляемых очередью запросов и выполняемых Pipeline Engine, Selena может динамически корректировать параллелизм запроса pipeline_dop для входящих запросов на основе текущего количества выполняющихся запросов num_running_queries, количества фрагментов num_fragments и параллелизма запроса pipeline_dop. Это позволяет динамически контролировать параллелизм запросов, минимизируя накладные расходы на планирование и обеспечивая оптимальное использование ресурсов BE. Дополнительную информацию о фрагментах и параллелизме запросов pipeline_dop см. в разделе Управление запросами - Настройка параллелизма запросов.

Для каждого запроса в очереди Selena поддерживает концепцию драйверов, которые представляют параллельные фрагменты запроса на одном BE. Его логическое значение num_drivers, представляющее общий параллелизм всех фрагментов этого запроса на одном BE, равно num_fragments * pipeline_dop. Когда поступает новый запрос, Selena корректирует параллелизм запроса pipeline_dop на основе следующих правил:

  • Чем больше количество выполняющихся драйверов num_drivers превышает нижний предел параллельных драйверов query_queue_driver_low_water, тем ниже корректируется параллелизм запроса pipeline_dop.
  • Selena ограничивает количество выполняющихся драйверов num_drivers ниже верхнего предела параллельных драйверов для запросов query_queue_driver_high_water.

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

ПеременнаяПо умолчаниюОписание
query_queue_driver_high_water-1Верхний предел параллельных драйверов для запроса. Вступает в силу только при неотрицательном значении. При значении 0 эквивалентно avg_be_cpu_cores * 16, где avg_be_cpu_cores представляет среднее количество ядер CPU на всех узлах BE. При значении больше 0 используется это значение напрямую.
query_queue_driver_low_water-1Нижний предел параллельных драйверов для запросов. Вступает в силу только при неотрицательном значении. При значении 0 эквивалентно avg_be_cpu_cores * 8. При значении больше 0 используется это значение напрямую.

Мониторинг очередей запросов

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

SHOW PROC

Вы можете проверить количество выполняющихся запросов, использование памяти и CPU на узлах BE с помощью SHOW PROC:

mysql> SHOW PROC '/backends'\G
*************************** 1. row ***************************
...
NumRunningQueries: 0
MemUsedPct: 0.79 %
CpuUsedPct: 0.0 %

SHOW PROCESSLIST

Вы можете проверить, находится ли запрос в очереди (когда IsPending равно true), с помощью SHOW PROCESSLIST:

mysql> SHOW PROCESSLIST;
+------+------+---------------------+-------+---------+---------------------+------+-------+-------------------+-----------+
| Id | User | Host | Db | Command | ConnectionStartTime | Time | State | Info | IsPending |
+------+------+---------------------+-------+---------+---------------------+------+-------+-------------------+-----------+
| 2 | root | xxx.xx.xxx.xx:xxxxx | | Query | 2022-11-24 18:08:29 | 0 | OK | SHOW PROCESSLIST | false |
+------+------+---------------------+-------+---------+---------------------+------+-------+-------------------+-----------+

Журнал аудита FE

Вы можете проверить файл журнала аудита FE fe.audit.log. Поле PendingTimeMs указывает время, которое запрос провёл в ожидании в очереди, и его единица измерения — миллисекунды.

Метрики мониторинга

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

МетрикаЕдиницаТипОписание
selena_fe_query_queue_pendingКоличествоМгновенноеТекущее количество запросов в очереди.
selena_fe_query_queue_totalКоличествоМгновенноеОбщее количество исторически поставленных в очередь запросов (включая выполняющиеся в данный момент).
selena_fe_query_queue_timeoutКоличествоМгновенноеОбщее количество запросов, которые истекли по тайм-ауту в очереди.
selena_fe_resource_group_query_queue_totalКоличествоМгновенноеОбщее количество исторически поставленных в очередь запросов в этой группе ресурсов (включая выполняющиеся в данный момент). Метка name указывает имя группы ресурсов. Эта метрика поддерживается с версии v1.5.2.
selena_fe_resource_group_query_queue_pendingКоличествоМгновенноеКоличество запросов, в данный момент находящихся в очереди для этой группы ресурсов. Метка name указывает имя группы ресурсов. Эта метрика поддерживается с версии v1.5.2.
selena_fe_resource_group_query_queue_timeoutКоличествоМгновенноеКоличество запросов, которые истекли по тайм-ауту в очереди для этой группы ресурсов. Метка name указывает имя группы ресурсов. Эта метрика поддерживается с версии v1.5.2.

SHOW RUNNING QUERIES

Начиная с версии v1.5.2, Selena поддерживает SQL-выражение SHOW RUNNING QUERIES, которое используется для отображения информации об очереди для каждого запроса. Значения каждого поля следующие:

  • QueryId: ID запроса.
  • ResourceGroupId: ID группы ресурсов, в которую попал запрос. Когда нет попадания в определённую пользователем группу ресурсов, отображается "-".
  • StartTime: Время начала запроса.
  • PendingTimeout: Время, когда ожидающий запрос истечёт по тайм-ауту в очереди.
  • QueryTimeout: Время, когда запрос истечёт по тайм-ауту.
  • State: Состояние очереди запроса, где "PENDING" означает, что он находится в очереди, а "RUNNING" означает, что он выполняется в данный момент.
  • Slots: Логическое количество ресурсов, запрошенных запросом, в настоящее время фиксировано на 1.
  • Frontend: Узел FE, инициировавший запрос.
  • FeStartTime: Время запуска узла FE, инициировавшего запрос.

Пример:

MySQL [(none)]> SHOW RUNNING QUERIES;
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+
| QueryId | ResourceGroupId | StartTime | PendingTimeout | QueryTimeout | State | Slots | Frontend | FeStartTime |
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+
| a46f68c6-3b49-11ee-8b43-00163e10863a | - | 2023-08-15 16:56:37 | 2023-08-15 17:01:37 | 2023-08-15 17:01:37 | RUNNING | 1 | 127.00.00.01_9010_1692069711535 | 2023-08-15 16:37:03 |
| a6935989-3b49-11ee-935a-00163e13bca3 | 12003 | 2023-08-15 16:56:40 | 2023-08-15 17:01:40 | 2023-08-15 17:01:40 | RUNNING | 1 | 127.00.00.02_9010_1692069658426 | 2023-08-15 16:37:03 |
| a7b5e137-3b49-11ee-8b43-00163e10863a | 12003 | 2023-08-15 16:56:42 | 2023-08-15 17:01:42 | 2023-08-15 17:01:42 | PENDING | 1 | 127.00.00.03_9010_1692069711535 | 2023-08-15 16:37:03 |
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+