數據庫自治服務DAS(Database Autonomy Service)提供SQL限流功能。您可以通過SQL限流來控制數據庫請求訪問量和SQL并發量,保障服務的可用性。本文以RDS MySQL為例介紹如何使用SQL限流功能。
前提條件
支持的數據庫引擎為:
RDS MySQL 5.6、5.7、 8.0
PolarDB MySQL版 5.6、5.7、 8.0
PolarDB-X 2.0
應用場景
場景 | 說明 |
某類SQL并發急劇上升 | 例如緩存穿透或異常調用,可能會導致SQL并發量突然上升。 |
有數據傾斜SQL | 例如大促時拉取某個特別大的數據,導致整體系統繁忙。 |
未創建索引表 | 例如SQL調用量特別大,并且沒有創建索引表,導致整體系統繁忙。 |
限流模式
支持的限流模式如下:
參數 | 說明 | 支持的數據庫 |
通過關鍵詞限流 | 根據SQL語句中的關鍵詞進行匹配從而限流。 |
|
通過SQL模板ID限流 | 對SQL模板ID進行匹配從而限流,可從SQL日志、會話、EXPLAIN執行結果中獲得SQL模板ID。 說明 SQL模板ID是長度為8的16進制字符串。 | PolarDB-X 2.0 |
通過執行耗時限流 | 根據SQL執行時間進行限流。創建了該類限流模式的規則后,當指定類型SQL的執行時間超過設定的閾值時,該類型SQL所屬的模板ID會被自動加入到限流規則中,SQL會按照規則指定的并發度執行。 說明 您可以同時設置限流SQL模板ID數量上限,達到上限后,便不再自動對其他SQL創建限流規則。 | PolarDB-X 2.0 |
操作步驟
登錄DAS控制臺。
在左側導航欄中,單擊實例監控。
找到目標實例,單擊實例ID,進入目標實例詳情頁。
在左側導航欄,單擊實例會話。
在會話管理頁面,單擊SQL限流。
在彈出的SQL限流對話框中,配置如下參數。
參數
說明
限流模式
根據需要選擇限流模式,詳情請參見限流模式。
SQL類型
選擇SQL類型,取值如下:SELECT、UPDATE、DELETE、INSERT。
說明當前支持限流INSERT類型的數據庫引擎:
RDS MySQL 8.0
PolarDB MySQL版 5.7、8.0
PolarDB-X 2.0
不支持限流INSERT...SELECT...類型的SQL語句。
最大并發度
SQL最大并發數,允許設置的最小值為1。
當同時執行的滿足限流策略的SQL數達到最大并發數時觸發SQL限流。
限流時間
SQL限流的生效時間。SQL限流是應急措施,建議您按實際需求設置限流時長,用完及時關閉。
SQL關鍵詞
需要限流的SQL關鍵詞。
說明限流模式為通過關鍵詞限流時,需要配置此參數。
若您設置多個關鍵詞,則SQL語句中需要同時包含這些關鍵詞才會觸發限流規則,多個關鍵詞間用波浪線(~)分隔,且無順序限制。
不支持只設置SELECT、UPDATE、DELETE為限流關鍵詞,且關鍵詞大小寫敏感(部分早期版本實例不區分)。
關鍵詞設置舉例:如原始語句為
SELECT min(id), max(id) FROM task_event WHERE gmt_modified < '2020-06-21' AND begin_time > '2020-07-09' AND source IN (527) AND id >= 15673 AND id <= 8015673
,則對應該語句的限流關鍵詞為SELECT~min~id~max~id~FROM~task_event~WHERE~gmt_modified~AND~begin_time~AND~source~IN~AND~id~AND~id
。模板ID
需要限流的SQL模板ID,多個SQL模板ID間用英文逗號(,)分隔。
說明限流模式為通過SQL模板ID限流時,需要配置此參數。
SQL執行時間
SQL執行時間的閾值,當SQL的執行時間大于設置的閾值時,系統會將該類型SQL所屬的SQL模板ID加入到限流規則中。
說明限流模式為通過執行耗時限流時,需要配置此參數。
限流SQL ID數量上限
通過執行耗時限流的SQL模板ID數量上限,達到上限后,系統不再對其他執行時間大于設置閾值的SQL創建限流規則。
說明限流模式為通過執行耗時限流時,需要配置此參數。
被限流SQL的數據庫賬號
被限流SQL所屬的數據庫賬號。
說明數據庫實例為PolarDB-X 2.0,且限流模式為通過關鍵詞限流或通過SQL模板ID限流時,需要配置此參數。
說明目標SQL限流規則創建后,當應用端使用了同時包含所有關鍵詞的SQL:
RDS MySQL 5.6、RDS MySQL 5.7的實例和PolarDB MySQL版 5.6的集群會返回1317錯誤(query execution was interrupted)。
RDS MySQL 8.0實例、PolarDB MySQL版 5.7和PolarDB MySQL版 8.0集群會讓相關SQL會處于
Concurrency control waiting
狀態,直至等待數量超過ccl_max_waiting_count參數的值(如果實例版本支持該參數)時,會返回錯誤碼和錯誤描述(Concurrency control waiting count exceed max waiting count),錯誤碼分別是:RDS MySQL 8.0為
ERROR 7534 (HY000)
。PolarDB MySQL版 5.7為
ERROR 3277 (HY000)
。PolarDB MySQL版 8.0為
ERROR 7533 (HY000)
。
其中,若ccl_max_waiting_count參數值為默認值0時,所有被限流的SQL均會處于
Concurrency control waiting
狀態,不返回錯誤。通過DAS限流時,若該參數值為0,DAS會將其值設置為DAS的默認值(當前默認值為10);若用戶將其設置為大于0的其他值,DAS不再設置該參數,直接使用用戶的設置。
單擊創建。
SQL限流規則創建完成后,您可以在運行中頁簽查看SQL限流規則的相關信息。
如您需要關閉或修改限流規則,可單擊目標規則右側操作欄的關閉或修改按鈕。
相關文檔
相關API
API | 描述 |
啟用SQL限流。 | |
關閉指定限流規則。 | |
關閉全部正在執行的限流規則。 | |
獲取正在執行的限流規則。 | |
獲取正在執行或被觸發過的限流規則。 | |
根據SQL語句生成限流關鍵詞。 |