Итак, сегодня мы поговорим про квоты в кликхаусе - в отличие от профилей в read write режиме они позволяют ограничивать потребление ресурсов пользователями за определенный промежуток времени. По сути они позволяют сказать какое кол-во ресурсов может быть использовано пользователем. Задаются они в конфиг файле users.xml
. Пример конфигурации квот вы можете увидеть ниже:
<yandex>
<quotas>
<default>
<interval>
<duration>3600</duration>
<queries>0</queries>
<errors>0</errors>
<result_rows>0</result_rows>
<read_rows>0</read_rows>
<execution_time>0</execution_time>
</interval>
</default>
<test>
<interval>
<duration>120</duration>
<queries>3</queries>
<errors>2</errors>
<result_rows>10000</result_rows>
<read_rows>100000000000</read_rows>
<execution_time>900</execution_time>
</interval>
<interval>
<duration>86400</duration>
<queries>1000</queries>
<errors>100</errors>
<result_rows>1000000000</result_rows>
<read_rows>100000000000</read_rows>
<execution_time>10000</execution_time>
</interval>
</test>
</quotas>
</yandex>
Мы создали отдельную квоту test
, которую можем использовать в настройках пользователей. Квота может содержать в себе любое множество интервалов времени (<interval>
), каждый из которых имеет свою конфигурацию. Некоторые значения параметров в примере равны 0
, в таком случае на данный параметр не накладываются никакие квоты.
Время (в секундах), через которое будут сброшены все значения счетчиков интервала.
Общее количество запросов.
Количество запросов, которые при выполнении выдали ошибку.
Количество строк, которые были отданы при выполнении запросов.
Количество строк, которые доступны для чтения при выполнении запросов.
Суммарное время выполнения всех запросов.
При достижении лимита по любому интервалу будет отображаться информация о том, какое значение превышено и когда начнется следующий интервал.
Также просмотреть на значения квот в реальном времени можно в таких системных таблицах, как system.quotas
, system.quotas_usage
, system.quota_limits
.
Стоить заметить, что при распределенном запросе все значения квот подсчитываются только на сервере, который инициировал запрос. На каждом сервере ClickHouse счетчики квот для пользователей отдельные. Также счетчики сбрасываются при каждом перезапуске сервера.
Давайте попробуем повторить эксперимент с пользователем test, указав ему данную квоту в конфигурации, а так же сменив его профиль на default - чтобы он не запрещал менять нам настройки профилей:
ch1.ru-central1.internal :) select * from logs.data;
0 rows in set. Elapsed: 0.002 sec.
Received exception from server (version 21.2.5):
Code: 201. DB::Exception: Received from localhost:9000. DB::Exception: Quota for user `test` for 120s has been exceeded: queries = 4/3. Interval will end at 2021-03-09 15:42:00. Name of quota template: `test`.
В данном случае мы пытались быстро выполнить несколько запросов и превысили квоту максимального количества запросов для пользователя. И кликхаус сообщил нам, что мы можем повторить наш запрос через 120 секунд.
Таким образом вы можете установить лимиты по использованию ресурсов для различных пользователей на основе квот.
users.xml
user
.