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*
為正則表達式,代表以INSERT
開頭的任意SQL語句。
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
- Firewall whitelist