SQL事前巡檢外掛

京东技术發表於2024-04-11

背景:

事故頻發

每年都會看到SQL問題引發的線上問題

不易發覺

對於SQL效能問題測試在預發環境不易發現
saas系統隔離欄位在SQL條件中遺漏,造成越權風險
業務初期SQL沒問題,業務增長容易出現事故
DBS慢SQL不支援實時報警,無法及時發現
靠大家review程式碼總會出現遺漏

事後處理

每次都是線上介面效能、資料庫報警才意識到問題,再去最佳化SQL,此刻有可能引發線上的嚴重事故



思考:

透過人為去發現總是不靠譜的,而且更希望問題在測試和預發環境提前暴漏出來,儘量避免帶到線上,是否可以透過技術手段提前發現問題?研發新工具來自動檢測有問題的SQL?

流程設計:







行動:

透過開發SQL巡檢檢外掛查實現問題SQL自動預警

1. 利用SQL攔截器,攔截系統執行的SQL
2. 開啟非同步執行緒池,不阻礙業務流程的執行,解析SQL,忽略具體入引數據和格式,MD5加密SQL語句, 為了防止重複SQL執行,將之前攔截過的MD5值快取,可以自定義快取時間,這段時間內容不會解析相同的SQL
3. 為了保障業務系統的穩定性,接入外掛的時候支援手動資料來源的注入,可以選擇主或者從,來執行後續的explain/show create table操作
4. 透過 explain/show create table執行的結果,以及SQL語句透過http/MQ傳送給SQL巡檢平臺
5. SQL巡檢平臺接受資訊進行內容拆分,獲取表名和條件;
6. 首先透過執行計劃分析:如:[possible_keys][key]分析索引是否使用,如未使用會及時預警通知,並記錄到巡檢平臺;
7. 其次進行表和查詢條件分析,透過讀取平臺的配置,設定某 一個表的查詢條件的校驗規則(支援正則表達),如: xxx_info表條件必須使用xxx_code,如不符合規則也會及時預警通知, 並記錄到巡檢平臺;

SQL風險預警

【描 述】SQL安全檢測-table_name(表名)不符合條件規則:.*org_no.* (正規表示式) 【traceId】wewrerew234234242342 (請求ID) 【執行方法】com.XXX.XXX.XX.FINDBYID(mapper方法) 【SQL內容】select * from table_name where xxx=1 and yyy=2 【系統名稱】所屬系統

SQL風險預警

【描 述】SQL索引檢測-table_name(表名) 未使用索引; 【traceId】aa6ac6c89bec4f7dfdfdf74719ae583 (請求ID) 【執行方法】XXXXXMapper.selectResult (mapper方法) 【SQL內容】select * from table_name where xxx=1 and yyy=2 【系統名稱】所屬系統

1. 巡檢平臺提供了一些報警閾值管理、校驗規則管理等,來滿足不同系統的不同表的不同要求
2. 巡檢平臺同時會把有問題的SQL進行展示, 支援一鍵分析, 因為之前咱們已經獲取到執行計劃結果和建表語句,把這些資訊交給chatgpt,透過大模型分析,並返回響應的建議,輔助使用者進行治理



接入:

引入SQL巡檢jar包,在資料來源註冊攔截器

</property>
        <property name="plugins">
            <list>
                <bean class="com.yzt.plugin.MysqlExplainInterceptor">
                    <property name="sysName" value="yzt-refund"/>
                    <property name="monitorSqlService" ref="monitorSqlServiceImpl"/>
                </bean>
            </list>
        </property>

指定重複SQL攔截時間段

@Override
public boolean warnFLag(String id) {
//快取實現指定時間重複SQL上報攔截
    return false;
}
............

在我們的巡檢平臺根據配置的系統名稱來自定義報警人和報警規則;

透過自動巡檢、及時預警能提前在測試預發環境發現SQL存在的問題,進行修復,避免帶到線上,同時可以給出問題SQL的最佳化建議,幫助研發快速修復;


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70037994/viewspace-3012166/,如需轉載,請註明出處,否則將追究法律責任。

相關文章