作者: 小龍蝦愛大龍蝦 原文來源: https://tidb.net/blog/7247e68f
簡介
lynx 工具可以定時將 TiDB 集群的慢查詢收集并持久化到后端數據庫中,然后通過 grafana 查詢展示出來,這可以幫助我們更好的分析慢查詢日志。
背景
盡管 TiDB 提供了慢查詢日志和 SQL 語句分析功能,并在 Dashboard 上提供了直觀的查詢界面,但在實際使用中仍存在一些局限性:
- 早期版本 SQL 語句分析功能數據存儲在內存中,當 TiDB Server 發生 Out-of-Memory (OOM) 時,數據會丟失,導致無法查詢到相關數據。
- SQL 語句分析功能存儲的 SQL 類別有限,當 SQL 語句數量較多時,舊的記錄可能會驅逐,從而無法查詢到想要的數據。
- 慢查詢日志以單條語句的形式存在,當 TiDB 集群繁忙時,短時間會產生大量慢查詢記錄,界面返回的行數過多,不利于分析。
- 慢查詢日志底層存儲在日志文件中,跨長時間段查詢慢查詢日志時,不僅速度較慢,還可能導致 TiDB Server OOM。
- 慢查詢日志界面無法自定義查詢,無法滿足復雜的分析需求。
- 慢查詢日志導出的 Excel 格式混亂,無法直接發送給應用研發團隊。
- 等等 。。。
特點
- 支持多 TiDB 版本,適用于 TiDB v6.0 及以上版本。
- 根據時間窗口采集慢查詢數據,有效降低對目標 TiDB 集群的壓力。
- 同一集群中,具有相同 SQL 指紋和計劃指紋的 SQL 語句和執行計劃只收集一次,節約了存儲空間,同時也降低了對采集目標集群的壓力。
- 可以靈活自定義 Grafana 面板,例如查找執行計劃中包含隱式轉換的 SQL 語句(計劃中包含
cast關鍵字)。 - 通過 Grafana 可以方便地將慢查詢數據導出為 Excel 格式,還可以開發腳本定期自動將數據通過郵件發送給相關人員。
- lynx 收集的慢日志適合分析因執行計劃不佳導致的查詢慢的問題。然而,對于那些時快時慢的查詢情況(可能是由于傳入參數不同或集群運行狀態變化引起的),TiDB Dashboard 的慢查詢日志功能可能更為合適,因為同一執行計劃 lynx 只采集一次執行計劃。
- 與慢查詢日志一樣,Lynx 無法獲取低于慢查詢閾值的語句信息。
下載地址
https://github.com/harry1129/tidb-slowquery-lynx/releases/tag/v1.0.0
部署lynx
準備后端存儲庫
后端存儲庫用于存儲收集到的慢查詢日志,可以是 Mysql 數據庫或 TiDB 數據庫,數據庫需手工創建,用戶權限需要對數據庫有所有權限,程序會自動創建表結構。示例:
create database test;
create user u1 dientified by "u1";
grant all privileges on test.* to u1;
準備配置文件config.toml
[global]
time_window_minutes = 60 #采集窗口,單位(分鐘),建議設置 30 ~ 60,與定時任務配置同樣窗口,窗口會自動#后端存儲庫
[database]
host = "localhost"
port = 4000
user = "root"
password = ""
db_name = "test"
max_idle_conns = 2
max_open_conns = 10
conn_max_lifetime = 600 #單位(秒)[target_dbs]
cluster1.host = "196.128.1.1"
cluster1.port = 4000
cluster1.user = "root1"
cluster1.password = ""cluster2.host = "196.128.1.2"
cluster2.port = 4000
cluster2.user = "root"
cluster2.password = ""cluster3.host = "196.128.1.4"
cluster3.port = 4000
cluster3.user = "root"
cluster3.password = ""
目標數據庫的采集用戶最少需要以下權限
-- 查詢 information_schema.schema 時需要看到所有的數據庫名
GRANT SHOW DATABASES ON . TO 'xxxx'@'%';
-- 查詢 information_schema.cluster_slow_query 時需要看到所有用戶的慢查詢
GRANT DASHBOARD_CLIENT ON . TO 'xxxx'@'%';
添加定時執行任務
這里定時執行時間要與 time_window_minutes 一樣
crontab -e
*/30 * * * * /your/path/lynx -c /your/path/config.toml -l /your/path/lynx.log
添加 grafana 面板
- 在 Grafana 上配置 mysql 數據源
Configuration =》 data sources =》Add data source =》Mysql
- 將 https://github.com/harry1129/tidb-slowquery-lynx/tree/main/grafana 中帶的面板導入到 Grafana
Create =》Import
Grafana 面板展示
SQL 聚合面板展示

單條 SQL 面板展示

總結
Lynx 工具通過定時收集和持久化 TiDB 集群的慢查詢日志,配合 Grafana 提供了直觀的查詢和展示功能,提供了更高效、更靈活的 TiDB 慢日志分析手段。解決了 TiDB 慢查詢日志分析中的一些常見問題,幫助數據庫管理員和開發人員更好地優化數據庫性能。