本文介紹如何使用云數(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ō)明 |
---|---|---|
name | String | 資源隊(duì)列名。 |
concurrency | UInt32 | 資源隊(duì)列的并發(fā)限制。 |
memory | UInt64 | 資源隊(duì)列的內(nèi)存池大小。單位:Byte。 |
isolate | UInt8 | 資源隊(duì)列的隔離級(jí)別。 |
priority | Enum8(枚舉) | 資源隊(duì)列的優(yōu)先級(jí)別。 |
roles | Array<String> | 資源隊(duì)列綁定的所有相關(guān)用戶。 |
List指定資源隊(duì)列的查詢使用狀態(tài):
show resource queue stat [CURRENT | ALL];
返回結(jié)果說(shuō)明:
名稱 | 類型 | 說(shuō)明 |
---|---|---|
name | String | 資源隊(duì)列名。 |
running_query | UInt32 | 資源隊(duì)列中正在執(zhí)行的查詢數(shù)量。 |
waiting_query | UInt32 | 資源隊(duì)列中正在等待執(zhí)行的查詢數(shù)量。 |
grabbing_query | UInt32 | 正在臨時(shí)搶占使用資源隊(duì)列內(nèi)存池的查詢(不屬于該資源隊(duì)列)數(shù)量。 |
allocated_memory | UInt64 | 資源隊(duì)列內(nèi)存池被正常申請(qǐng)使用的內(nèi)存大小。單位:Byte。 |
grabbed_memory | UInt64 | 資源隊(duì)列內(nèi)存池被臨時(shí)搶占使用的內(nèi)存大小。單位:Byte。 |
free_memory | UInt64 | 資源隊(duì)列內(nèi)存池當(dāng)前剩余內(nèi)存大小。單位:Byte。 |
資源隊(duì)列相關(guān)查詢異常
- 并發(fā)限制導(dǎo)致查詢超時(shí)
- 相關(guān)錯(cuò)誤碼:13005
- Bad Query使用內(nèi)存超過(guò)資源隊(duì)列內(nèi)存池
- 相關(guān)錯(cuò)誤碼:241
- 查詢強(qiáng)制路由的資源隊(duì)列不存在
- 相關(guān)錯(cuò)誤碼:13006
- 查詢臨時(shí)搶占申請(qǐng)低優(yōu)先級(jí)資源隊(duì)列被Kill
- 相關(guān)錯(cuò)誤碼:394