ProxySQL環境下,快速處理異常會話的方法:
1 定位需要處理的異常會話
當程式存在異常、SQL效率大幅下降等情況出現時,可能導緻對後端資料庫不堪重負,此時需要快速終止會話,保護後端資料庫能提供正常的服務。
在該環節中,可以定位出“用戶端IP”、“異常SQL”、“使用的資料庫使用者名”、“通路的Schema”等資訊,以上資訊越多,越能準确地終止異常會話。
2 為異常會話設定黑名單
注意:對于目前大部分的應用程式而言,均設定了資料庫重連的功能,這意味這如果隻是單純地終止會話,往往難以起到應有的效果。是以比較好的做法是在終止前,先設定異常會話黑名單,自動的阻止異常請求的進入。以下各小節則介紹了常見的黑名單設定方法。
注意:由于路由規則根據
rule_id
順序應用的,是以可以預留前100個ID用于做異常會話的黑名單。
此時,該IP應用發起請求時,将報錯
。
ERROR 1148 (42000): Blocking Error Connection
2.1 阻止特定IP的請求
假設異常的請求來源于11.25.151.20這個IP,則登入ProxySQL管理端後,對黑名單設定的步驟及操作過程如下。
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*
開頭的任意SQL語句。
INSERT
3 終止異常會話
在ProxySQL環境下,終止會話使用
KILL CONNECTION+[session_id]
的文法。
即為
[session_id]
字段。
stats_mysql_processlist.SessionID
例如,要批量終止test_user使用者的會話,則可按如下語句拼接出終止會話的SQL。
Admin> SELECT 'KILL CONNECTION '||SessionID||';',
cli_host, srv_host, command
FROM stats_mysql_processlist
WHERE user='test_user';
參考資料:
- 《ProxySQL Wiki》
- Firewall whitelist https://github.com/sysown/proxysql/wiki/Firewall-whitelist