ProxySQL環境下,快速處理異常會話的方法(黑名單、KILL)

ProxySQL環境下,快速處理異常會話的方法:

1 定位須要處理的異常會話

當程序存在異常、SQL效率大幅降低等狀況出現時,可能致使對後端數據庫不堪重負,此時須要快速終止會話,保護後端數據庫能提供正常的服務。mysql

在該環節中,能夠定位出「客戶端IP」、「異常SQL」、「使用的數據庫用戶名」、「訪問的Schema」等信息,以上信息越多越能準確地終止異常會話git

2 爲異常會話設置黑名單

注意:對於當前大部分的應用程序而言,均設置了數據庫重連的功能,這意味這若是隻是單純地終止會話,每每難以起到應有的效果。所以比較好的作法是在終止前,先設置異常會話黑名單,自動的阻止異常請求的進入。如下各小節則介紹了常見的黑名單設置方法。github

注意:因爲路由規則根據rule_id順序應用的,所以能夠預留前100個ID用於作異常會話的黑名單
此時,該IP應用發起請求時,將報錯ERROR 1148 (42000): Blocking Error Connection正則表達式

2.1 阻止特定IP的請求

假設異常的請求來源於11.25.151.20這個IP,則登陸ProxySQL管理端後,對黑名單設置的步驟及操做過程以下。sql

Admin> insert into mysql_query_rules(rule_id,active,client_addr,error_msg,apply)
values (1,1,'11.25.151.20','Blocking Error Connection', 1);

--將內存暫存配置加載爲運行配置(不須要將配置存至disk)
Admin> load mysql query rules to runtime;

2.2 阻止特定IP的特定SQL

假設異常的請求來源於11.25.151.20這個IP,異常請求爲INSERT,則登陸ProxySQL管理端後,對黑名單設置的步驟及操做過程以下。數據庫

Admin> insert into mysql_query_rules(rule_id,active,client_addr,match_digest,error_msg,apply)
values (1,1,'11.25.151.20','^INSERT*','Blocking Error Connection', 1);

--將內存暫存配置加載爲運行配置(不須要將配置存至disk)
Admin> load mysql query rules to runtime;

^INSERT*正則表達式,表明以INSERT開頭的任意SQL語句。後端

3 終止異常會話

在ProxySQL環境下,終止會話使用KILL CONNECTION+[session_id]的語法。session

[session_id]即爲stats_mysql_processlist.SessionID字段。app

例如,要批量終止test_user用戶的會話,則可按以下語句拼接出終止會話的SQL。code

Admin> SELECT 'KILL CONNECTION '||SessionID||';', 
    cli_host, srv_host, command
FROM stats_mysql_processlist
WHERE user='test_user';

參考資料:

  1. 《ProxySQL Wiki》
相關文章
相關標籤/搜索