為應對突發的資料庫請求流量、資源消耗過高的語句訪問以及SQL訪問模型的變化等問題,PolarDB-X提供了節點層級的SQL限流功能來限制造成上述問題的SQL執行,從而保證執行個體的持續穩定運行。本文介紹如何使用SQL限流功能。
版本限制
僅計算節點組件版本為5.4.9-16167266及以上的PolarDB-X企業版執行個體支援SQL限流功能,其中慢SQL限流觸發器則需要執行個體的計算節點組件版本為5.4.11-16251897及以上。
建立限流規則
文法
CREATE CCL_RULE [ IF NOT EXISTS ] `ccl_rule_name`
ON `database`.`table`
TO '<username>'@'<host>'
FOR { UPDATE | SELECT | INSERT | DELETE }
[ filter_options ]
with_options
filter_options:
[ FILTER BY KEYWORD('KEYWORD1', 'KEYWORD2',…) ]
[ FILTER BY TEMPLATE('template_id') ]
with_options:
WITH MAX_CONCURRENCY = value1 [ , WAIT_QUEUE_SIZE = value2 ] [ , WAIT_TIMEOUT = value3 ] [ ,FAST_MATCH = { 0 , 1 }]參數說明:
參數 | 是否必選 | 說明 | |
限流規則匹配參數 |
| 必選 | 限流規則的名稱。 說明 為避免名稱與SQL關鍵字衝突,建議在規則名稱前後各加一個反引號(`)。 |
| 必選 | 資料庫和資料表的名稱,支援使用星號(*)表示任意匹配。 說明 為避免名稱與SQL關鍵字衝突,建議在庫表名稱前後各加一個反引號(`)。 | |
| 必選 | 帳號名稱。其中 | |
| 必選 | SQL語句類型。當前支援UPDATE、SELECT、INSERT和DELETE類型。 說明 每條限流規則僅支援傳入一種類型的SQL語句。 | |
| 可選 | 過濾條件,支援包括如下兩種條件:
| |
限流規則行為控制參數 |
| 必選 | WITH選項中支援如下4個參數來控制限流規則的行為:
說明
|
僅當一個SQL語句滿足所有的匹配參數條件時,才會根據該規則的WITH選項進行限流。
樣本
假設需要建立一條名為selectrule的規則,用於限制帳號為'ccltest'@'%'使用者發起的,包含cclmatched關鍵字的,且對任意表執行SELECT操作的SQL語句,同時將最大並發度設定為10。
規則建立語句如下:
CREATE CCL_RULE IF NOT EXISTS `selectrule` ON *.* TO 'ccltest'@'%'
FOR SELECT
FILTER BY KEYWORD('cclmatched')
WITH MAX_CONCURRENCY=10;帳號ccltest從任何IP發起的查詢(SELECT語句),且含有cclmatched關鍵字,這一類查詢語句的最高並發為10。
限流結果
某條SQL匹配到該規則後,根據限流規則中WITH選項裡配置的參數,會出現如下幾種結果:
RUN(可運行)
若並發度還未達到最大並發度(即MAX_CONCURRENCY參數值沒有達到最大值),該SQL正常執行不會被限流。
WAIT(等待中)
若並發度已經達到最大並發度,但等待隊列長度還未達到最大長度(即WAIT_QUEUE_SIZE參數值沒有達到最大值),該SQL進入等待狀態,直到進入可運行(RUN)狀態,或者等待逾時(WAIT_TIMEOUT)狀態。您可以通過如下命令查看由於匹配到限流規則而等待的SQL語句:
SHOW FULL PROCESSLIST;結果如下:
+----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | SQL_TEMPLATE_ID | +----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+ | 2 | polardbx_root | ***.*.*.*:62787 | polardbx | Query | 0 | | show full processlist | NULL | | 1 | polardbx_root | ***.*.*.*:62775 | polardbx | Query(Waiting-selectrulereal) | 12 | | select 1 | 9037e5e2 | +----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+ 2 rows in set (0.08 sec)說明SQL語句
select 1由於限流規則selectrulereal而處於等待(Waiting)狀態。WAIT_TIMEOUT(等待逾時)
SQL語句進入等待狀態後,當等待時間超過最長等待時間(
WAIT_TIMEOUT)時,該語句將會執行失敗並返回錯誤資訊。例如:設定了一條最長等待時間為10秒的限流規則,執行SELECT sleep(11)語句時會因為等待逾時而報錯,樣本如下:ERROR 3009 (HY000): [11a07e23fd800000][30.225.XXX.XX:8527][polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal after waiting for 10060 msKILL(結束)
並發度和等待隊列長度均已經達到最大值,用戶端將收到超過最大並發度的報錯,報錯資訊中會包含匹配上的限流規則的名稱。例如:在並發度和等待隊列長度均已經達到最大值後執行
SELECT 1;命令,會出現如下報錯:ERROR 3009 (HY000): [11a07c4425c00000][**.***.***.**:8527][polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal說明該SQL語句
SELECT 1;由於超出了限流規則selectrulereal設定的最大並發度而執行失敗。
查看限流規則
查看指定限流規則
指定規則名稱進行查看,多個名稱用,分隔。
文法:
SHOW CCL_RULE `ccl_rule_name1` [, `ccl_rule_name2` ]樣本:
SHOW CCL_RULE `selectrulereal` 結果如下:
NO.: 1
RULE_NAME: selectrulereal
RUNNING: 2
WAITING: 29
KILLED: 0
MATCH_HIT_CACHE: 21374
TOTAL_MATCH: 21406
ACTIVE_NODE_COUNT: 2
MAX_CONCURRENCY_PER_NODE: 1
WAIT_QUEUE_SIZE_PER_NODE: 100
WAIT_TIMEOUT: 600
FAST_MATCH: 1
SQL_TYPE: SELECT
USER: ccltest@%
TABLE: *.*
KEYWORDS: ["SELECT"]
TEMPLATEID: NULL
CREATED_TIME: 2020-11-26 17:04:08欄位說明:
欄位 | 說明 |
NO. | 匹配優先順序,數字越小,優先順序越高。 |
RULE_NAME | 限流規則名稱。 |
RUNNING | 匹配到該限流規則且正常執行的SQL語句數量。 |
WAITING | 匹配到該限流規則且正在等待隊列裡的查詢數量。 |
KILLED | 匹配到該限流規則且被KILL的SQL語句數量。 |
MATCH_HIT_CACHE | 匹配到該限流規則且命中Cache的SQL語句數量。 |
TOTAL_MATCH | 匹配到該限流規則命中的總次數。 |
ACTIVE_NODE_COUNT | 計算層中啟用了SQL限流的節點數。 |
MAX_CONCURRENCY_PER_NODE | 每個計算節點的並發度。 |
WAIT_QUEUE_SIZE_PER_NODE | 每個計算節點上等待隊列的最大長度。 |
WAIT_TIMEOUT | SQL語句在等待隊列的最大等待時間。 |
FAST_MATCH | 是否啟動緩衝加速匹配速度。 |
SQL_TYPE | SQL語句類型。 |
USER | 使用者名稱。 |
TABLE | 資料庫表。 |
KEYWORDS | 關鍵詞列表。 |
TEMPLATEID | SQL模板的編號。 |
CREATED_TIME | 建立時間(本地時間),格式為 |
查看所有限流規則
SHOW CCL_RULES;刪除限流規則
被刪除的限流規則會立即失效,此時該規則下等待隊列中的SQL語句全部會被正常執行。
刪除指定限流規則。
指定規則名稱進行刪除,多個名稱用
,分隔。文法:
DROP CCL_RULE [ IF EXISTS ] `ccl_rule_name1` [, `ccl_rule_name2`, ...]樣本:
DROP CCL_RULE IF EXISTS `selectrulereal`;刪除所有限流規則:
CLEAR CCL_RULES;
慢SQL限流觸發器
開啟慢SQL限流觸發器
當SQL的執行時間超過某一閾值時,系統可以自動為該SQL建立一個限流規則。
文法:
SLOW_SQL_CCL GO ['SQL_TYPE'[MAX_CONCURRENCY] [SLOW_SQL_TIME] [MAX_CCL_RULE]]樣本:
SLOW_SQL_CCL GO 'SELECT' 2 5 2;參數說明:
SQL_TYPE:取值為ALL,SELECT,UPDATE,INSERT,預設值為SELECT。相同語句類型的命令,有更新作用。
MAX_CONCURRENCY:自動建立的限流規則的最高並發數,預設值為CPU核心數的一半。
SLOW_SQL_TIME:慢SQL的執行時間,SQL執行時間超過此值時會執行該觸發器,預設值為系統參數SLOW_SQL_TIME的值,單位為毫秒(ms)。
MAX_CCL_RULE:可建立限流規則的個數,預設值為1000。
執行過程:
遍曆整個執行個體的Session,識別出該語句類型慢SQL的TemlateId。
建立針對慢SQL的限流觸發器,名稱為:_SYSTEM_SLOW_SQL_CCL_TRIGGER_{SQL_TYPE}_。
傳遞慢SQL的TemplateId給限流觸發器,由限流觸發器建立限流規則。
KILL(結束)所有超過MAX_CONCURRENCY的該語句類型的慢TemplateId查詢。
查看慢SQL限流觸發器
SLOW_SQL_CCL SHOW;結果如下:
欄位名 | 值 |
NO. | 1 |
SCHEMA | __cdc__ |
TEMPLATE_ID | 1394f5db |
SQL | SELECT * FROM test |
RULE_NAME | AUTO__SYSTEM_SLOW_SQL_CCL_TRIGGER_SELECT____cdc___1394f5db_9e1c7f6d |
RUNNING | 0 |
WAITING | 0 |
KILLED | 0 |
TOTAL_MATCH | 0 |
ACTIVE_NODE_COUNT | 4 |
MAX_CONCURRENCY_PER_NODE | 2 |
CREATED_TIME | 2025-04-23 00:00:00 |
調整慢SQL的閾值
調整慢SQL的閾值有三種方式,按優先順序降序排序如下:
在
SLOW_SQL_CCL GO語句中設定SLOW_SQL_TIME參數的值。在一鍵開啟SQL限流之前,設定使用者變數SLOW_SQL_TIME。
樣本:
SET @slow_sql_time=2000; SLOW_SQL_CCL GO;在控制台上設定系統參數SLOW_SQL_TIME。
關閉慢SQL限流觸發器
關閉由SLOW_SQL_CCL GO建立的限流觸發器,會同時刪除由限流觸發器建立的限流規則。
SLOW_SQL_CCL BACK;