ELK是由 Elasticsearch、Logstash 和 Kibana 三個開源軟件組合而來,用于實時展示大量日志數據,掌握系統運行狀態。在開發和維護 MySQL 數據庫時,我們需要不斷地對其進行審計,以保證數據的完整性和安全性。
對于 MySQL 日志的審計,我們可以使用 ELK 進行集中管理和展示。首先,我們需要使用 Logstash 將 MySQL 日志導入到 Elasticsearch 中:
input { file { path =>"/var/lib/mysql/mysql-slow.log" start_position =>"beginning" sincedb_path =>"/dev/null" } } filter { grok { # 解析日志格式 match =>{ "message" =>"%{DATA:time} %{BASE10NUM:duration:float} %{GREEDYDATA:query}" } } date { # 將時間字段格式化 match =>[ "time", "yyyy-MM-dd HH:mm:ss" ] } } output { elasticsearch { hosts =>"localhost:9200" index =>"mysql-slow-%{+YYYY.MM.dd}" } }
上述 Logstash 配置使用 file 輸入插件從 MySQL 慢查詢日志中讀取數據,使用 Grok 過濾插件解析日志格式并將結果賦值給相應字段,最后使用 date 插件處理時間字段。將處理后數據輸出到 Elasticsearch 中,使用 index 配置將每日的數據寫入一個不同的索引中。
在 Elasticsearch 中,我們可以使用 Kibana 進行數據的查詢和展示。在 Kibana 中創建新的索引模式,定義日期字段和其他字段的類型,并創建 Dashboard 顯示各種指標:
GET mysql-slow-*/_search { "size": 0, "aggs": { "slow_queries_by_host": { "terms": { "field": "host.keyword" } }, "slow_queries_by_user": { "terms": { "field": "user.keyword" } }, "query_duration_histogram": { "histogram": { "field": "duration", "interval": 0.1, "min_doc_count": 1, "extended_bounds": { "min": 0, "max": 3 } } } } }
上述請求使用 Elasticsearch 的聚合功能,查詢每個客戶端的慢查詢數、每個用戶的慢查詢數和查詢耗時分布。Dashboard 中可以使用這些數據創建表格、圖表和其他可視化組件,方便我們快速了解 MySQL 數據庫的狀態。