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


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';

參考資料:

  1. 《ProxySQL Wiki》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM