本文介紹如何使用云數(shù)據(jù)庫(kù)ClickHouse的資源隊(duì)列增強(qiáng)功能。

背景信息

ClickHouse官方開源版目前沒有資源隊(duì)列的功能設(shè)計(jì),20.8及以上版本的云數(shù)據(jù)庫(kù)ClickHouse社區(qū)兼容版集群對(duì)于資源限制的用法,詳情請(qǐng)參見Restrictions on Query Complexity

本文介紹的資源隊(duì)列是云數(shù)據(jù)庫(kù)ClickHouse的增強(qiáng)功能,并且只適配于20.3版本的云數(shù)據(jù)庫(kù)ClickHouse社區(qū)兼容版集群。由于ClickHouse官方開源版存在用戶級(jí)別內(nèi)存隔離機(jī)制,資源隊(duì)列功能在新購(gòu)集群時(shí)默認(rèn)不開啟。

使用限制

云數(shù)據(jù)庫(kù)ClickHouse云原生版不支持資源隊(duì)列增強(qiáng)功能。

資源隊(duì)列定義

創(chuàng)建資源隊(duì)列語(yǔ)法:

-- 創(chuàng)建資源隊(duì)列定義
CREATE RESOURCE QUEUE [IF NOT EXISTS | OR REPLACE] name [ON CLUSTER cluster]
  * {[SET] MEMORY = {number}
  * [, CONCURRENCY = {number}]
  * [, PRIORITY = { LOWEST | LOW | NORMAL | HIGH | HIGHEST }]
  * [, ISOLATE = {number}]
    * }
  * [TO {role [,...] | ALL | ALL EXCEPT role [,...]}]

-- 更改指定資源隊(duì)列定義
ALTER RESOURCE QUEUE [IF NOT EXISTS | OR REPLACE] name [ON CLUSTER cluster]
  * {[SET] MEMORY = {number}
  * [, CONCURRENCY = {number}]
  * [, PRIORITY = { LOWEST | LOW | NORMAL | HIGH | HIGHEST }]
  * [, ISOLATE = {number}]
    * }
  * [TO {role [,...] | ALL | ALL EXCEPT role [,...]}]  

-- 查看指定資源隊(duì)列定義
SHOW CREATE resource queue name

-- 查看當(dāng)前用戶使用的資源隊(duì)列定義
SHOW CREATE resource queue current

-- 刪除指定資源隊(duì)列定義
DROP resource queue if exists name
定義參數(shù)說(shuō)明:
  • memory:聲明創(chuàng)建的資源隊(duì)列內(nèi)存池大小,如果節(jié)點(diǎn)的總內(nèi)存被已有的資源隊(duì)列分配完,則創(chuàng)建會(huì)失敗。
  • concurrency:聲明創(chuàng)建的資源隊(duì)列中查詢的并發(fā)數(shù)限制,默認(rèn)值為20,并發(fā)限制會(huì)對(duì)用戶發(fā)起的查詢進(jìn)行阻塞排隊(duì),對(duì)系統(tǒng)發(fā)起的子查詢不會(huì)阻塞但是會(huì)計(jì)入到當(dāng)前并發(fā)統(tǒng)計(jì)中。即并發(fā)限制為20的資源隊(duì)列當(dāng)前同時(shí)在跑的系統(tǒng)子查詢可以達(dá)到25個(gè),但此時(shí)用戶發(fā)起的查詢?nèi)繒?huì)被阻塞,直到系統(tǒng)子查詢數(shù)降低到20以下。
  • priority:聲明創(chuàng)建的資源隊(duì)列優(yōu)先級(jí),包含cpu調(diào)度優(yōu)先級(jí)和內(nèi)存搶占優(yōu)先級(jí)。
  • isolate:聲明創(chuàng)建的資源隊(duì)列內(nèi)存隔離級(jí)別。
    • 默認(rèn)值是0,表示沒有隔離,當(dāng)目標(biāo)資源隊(duì)列中的內(nèi)存使用率處于低水位時(shí),更高優(yōu)先級(jí)的資源隊(duì)列在內(nèi)存不夠用時(shí)可以臨時(shí)搶占目標(biāo)資源隊(duì)列的內(nèi)存。
    • 設(shè)定為1時(shí),表示該資源隊(duì)列有軟隔離,不可被高優(yōu)先級(jí)隊(duì)列搶占內(nèi)存。
    • 設(shè)定為2時(shí),表示該資源隊(duì)列絕對(duì)隔離,不可被搶占內(nèi)存,同時(shí)也不會(huì)去搶占低優(yōu)先級(jí)隊(duì)列的內(nèi)存。
  • role:通過(guò)To role [,...]聲明,把目標(biāo)資源隊(duì)列綁定到多個(gè)用戶上,對(duì)應(yīng)用戶的查詢默認(rèn)會(huì)進(jìn)入到目標(biāo)資源隊(duì)列中。當(dāng)同時(shí)有多個(gè)資源隊(duì)列綁定同一用戶時(shí),系統(tǒng)會(huì)隨機(jī)選擇一個(gè)最高優(yōu)先級(jí)的資源隊(duì)列執(zhí)行查詢。
配置參數(shù)說(shuō)明:
  • target_resource_queue:聲明目標(biāo)查詢強(qiáng)制路由到指定資源隊(duì)列中,也可以在用戶的profile文件中配置強(qiáng)制用戶對(duì)應(yīng)的查詢強(qiáng)制路由。
  • resource_queue_max_wait_ms:聲明查詢?cè)谫Y源隊(duì)列中因?yàn)椴l(fā)限制阻塞排隊(duì)的最長(zhǎng)等待時(shí)間,默認(rèn)10s。

示例:

CREATE RESOURCE QUEUE IF NOT EXISTS test_queue ON CLUSTER cluster SET 
  MEMORY = 1073741824, CONCURRENCY = 20, ISOLATE = 0, PRIORITY = NORMAL 
    TO default;

CREATE RESOURCE QUEUE IF NOT EXISTS anonymous_queue ON CLUSTER cluster SET 
  MEMORY = 1073741824, CONCURRENCY = 20, ISOLATE = 1, PRIORITY = LOW;

SHOW CREATE resource queue test_queue;

SHOW CREATE resource queue current;

SELECT count (distinct intDiv(number, 10)) FROM numbers(100000) settings target_resource_queue='anonymous_queue';

DROP resource queue if exists test_queue;

DROP resource queue if exists anonymous_queue;

資源隊(duì)列狀態(tài)查詢

List當(dāng)前所有的資源隊(duì)列定義:
show resource queues;

返回結(jié)果說(shuō)明:

名稱類型說(shuō)明
nameString資源隊(duì)列名。
concurrencyUInt32資源隊(duì)列的并發(fā)限制。
memoryUInt64資源隊(duì)列的內(nèi)存池大小。單位:Byte。
isolateUInt8資源隊(duì)列的隔離級(jí)別。
priorityEnum8(枚舉)資源隊(duì)列的優(yōu)先級(jí)別。
rolesArray<String>資源隊(duì)列綁定的所有相關(guān)用戶。
List指定資源隊(duì)列的查詢使用狀態(tài):
show resource queue stat [CURRENT | ALL];

返回結(jié)果說(shuō)明:

名稱類型說(shuō)明
nameString資源隊(duì)列名。
running_queryUInt32資源隊(duì)列中正在執(zhí)行的查詢數(shù)量。
waiting_queryUInt32資源隊(duì)列中正在等待執(zhí)行的查詢數(shù)量。
grabbing_queryUInt32正在臨時(shí)搶占使用資源隊(duì)列內(nèi)存池的查詢(不屬于該資源隊(duì)列)數(shù)量。
allocated_memoryUInt64資源隊(duì)列內(nèi)存池被正常申請(qǐng)使用的內(nèi)存大小。單位:Byte。
grabbed_memoryUInt64資源隊(duì)列內(nèi)存池被臨時(shí)搶占使用的內(nèi)存大小。單位:Byte。
free_memoryUInt64資源隊(duì)列內(nèi)存池當(dāng)前剩余內(nèi)存大小。單位:Byte。

資源隊(duì)列相關(guān)查詢異常

并發(fā)限制導(dǎo)致查詢超時(shí)
相關(guān)錯(cuò)誤碼:13005
解決方案:降低客戶端的查詢并發(fā)數(shù)。
Bad Query使用內(nèi)存超過(guò)資源隊(duì)列內(nèi)存池
相關(guān)錯(cuò)誤碼:241
解決方案:優(yōu)化查詢Plan,或調(diào)大資源隊(duì)列內(nèi)存池。
查詢強(qiáng)制路由的資源隊(duì)列不存在
相關(guān)錯(cuò)誤碼:13006
解決方案:檢查資源隊(duì)列創(chuàng)建狀態(tài)。
查詢臨時(shí)搶占申請(qǐng)低優(yōu)先級(jí)資源隊(duì)列被Kill
相關(guān)錯(cuò)誤碼:394
解決方案:降低資源隊(duì)列并發(fā)數(shù),調(diào)整隊(duì)列優(yōu)先級(jí)。