mysql慢sql報警系統
前言:最近有同事反應有的接口響應時間時快時慢,經過排查有的數據層響應時間過長,為了加快定位定位慢sql的準確性,決定簡單地搭建一個慢sql報警系統
具體流程如下架構圖
第一步:記錄日誌
每個業務系統都會在都會有自己的查詢語句,所有的sql語句最紅都會 我們先開啟每個mysql的慢sql采集配置
1.將 slow_query_log 全局變量設置為“ON”狀態
mysql> set global slow_query_log=‘ON‘;
2.設置慢查詢日誌存放的位置
3.mysql> set global slow_query_log_file=‘/usr/local/mysql/data/slow.log‘;
設置慢sql的時間
mysql> set global long_query_time=1;
測試一下
select sleep(3);去第二步設置的路徑找到日誌文件,打開日誌發現會有一條記錄
第二步:采集日誌
當記錄下所有的日誌文件的之後,我們就需要采集,和傳統的ELK那套模式一致,用filebeat去搜集(filebeat采集的原理就不多說介紹了),采集完成後就統一傳輸到logstash
第三步:格式化數據
當logstash得到這些數據之後,需要格式化Elasticsearch需要的格式
註意:我們采集到日誌格式中無法區分sql類型,比如select * from user where userId=2 和 select * from user where userId=5 是同一種類型,但是原始日誌采集過來的數據無法判斷,我們需要特殊處理一下:
1:用正則表達式把所有 數字和引號“”裏面的內容都替換成?,
2:然後把返回的值用加密算法加密一下,得到一個新的字段
改字段就可以表明是某種類型的sql
第四步:分析和展示數據
Elasticsearch得到logstash傳來的數據之後,就可以來檢索了(sql_for_hash字段就行用來判別sql類型的字段)
第五步:報警功能
以上四步基本完成了mysql慢sql的采集分析過程,接下裏就是報警功能,采用每小時(可以更短)去掃描es的中數據,根據日誌中出現的查詢時間以及每小時出現的次數決定報警級別,調用消息中心的報警接口進行報警,這樣開發員人能夠實時地接收到慢sql的出現的情況以便及時排除解決問題(後臺也寫了一個簡單的統計頁面方便查看)
mysql慢sql報警系統