ELK是由 Elasticsearch、Logstash 和 Kibana 三個(gè)開源軟件組合而來,用于實(shí)時(shí)展示大量日志數(shù)據(jù),掌握系統(tǒng)運(yùn)行狀態(tài)。在開發(fā)和維護(hù) MySQL 數(shù)據(jù)庫時(shí),我們需要不斷地對其進(jìn)行審計(jì),以保證數(shù)據(jù)的完整性和安全性。
對于 MySQL 日志的審計(jì),我們可以使用 ELK 進(jìn)行集中管理和展示。首先,我們需要使用 Logstash 將 MySQL 日志導(dǎo)入到 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 { # 將時(shí)間字段格式化 match =>[ "time", "yyyy-MM-dd HH:mm:ss" ] } } output { elasticsearch { hosts =>"localhost:9200" index =>"mysql-slow-%{+YYYY.MM.dd}" } }
上述 Logstash 配置使用 file 輸入插件從 MySQL 慢查詢?nèi)罩局凶x取數(shù)據(jù),使用 Grok 過濾插件解析日志格式并將結(jié)果賦值給相應(yīng)字段,最后使用 date 插件處理時(shí)間字段。將處理后數(shù)據(jù)輸出到 Elasticsearch 中,使用 index 配置將每日的數(shù)據(jù)寫入一個(gè)不同的索引中。
在 Elasticsearch 中,我們可以使用 Kibana 進(jìn)行數(shù)據(jù)的查詢和展示。在 Kibana 中創(chuàng)建新的索引模式,定義日期字段和其他字段的類型,并創(chuàng)建 Dashboard 顯示各種指標(biāo):
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 的聚合功能,查詢每個(gè)客戶端的慢查詢數(shù)、每個(gè)用戶的慢查詢數(shù)和查詢耗時(shí)分布。Dashboard 中可以使用這些數(shù)據(jù)創(chuàng)建表格、圖表和其他可視化組件,方便我們快速了解 MySQL 數(shù)據(jù)庫的狀態(tài)。