MyCat 日志是理解其中間件運行機制、排查路由錯誤、性能抖動的核心窗口。本文基於 DEBUG 級日志,完整解析啟動初始化、心跳檢測、前端連接建立、SQL 路由緩存、多節點查詢分發、連接同步、數據合並返回的全鏈路細節。
-sysconfig params:
idleTimeout=1800000 # 前端空閒超時 30min
dataNodeHeartbeatPeriod=10000 # 心跳間隔 10s
processor=8 # CPU 核心數
aio thread pool size=16 # AIO 線程池 = 核心數 × 2
端口:9066(管理)、8066(數據,對應 MySQL 3306)。
init backend mysql source, create connections total 10 for hostM1 index:0
# 按 schema.xml dataHost minCon=10 創建
create connection to hostM1 ...
release channel ...
connection created success.
每個 writeHost/readHost 按 minCon 預熱連接,釋放到空閒池。
heartbeat check ...
create new connection for hostS1 (192.168.244.146)
create new connection for hostS2 (192.168.244.144)
# localhost 已有連接池,復用
threadID=xx # 對應 MySQL 端 PROCESSLIST ID
邏輯:定時任務(dataNodeHeartbeatPeriod),對每個 dataHost 發送 SELECT USER(),檢測可用性、主從狀態、字符集。失敗達 slaveThreshold 次標記下線。
frontend connection ...
execute: show databases
execute: show tables
execute: select @@version_comment limit 1
目的:緩存元數據(庫/表/版本),供後續路由解析使用,避免重複查詢後端。
SELECT * FROM travelrecord 為例)SQLRouteCache miss cache -- 首次無緩存
SQLRouteCache add cache -- 構建路由信息入緩存
execute mutinode query -- 判斷為多分片查詢
has data merge logic -- 需合並結果集
路由緩存 Key:SQL 模板(參數化後)+ 分片規則。命中直接獲取目標分片列表。
配置 balance=1(所有從庫參與 SELECT 負載均衡),3 分片 → 選 3 個 read source:
背景:MyCat 連接池 Key = Database + AutoCommit 模式。借出的連接可能 Database 不匹配、事務模式不匹配。
同步四項指標:
日志示例:
syn connection for hostS2 dn1: schema change=false, autocommit change=false, charset change=false
syn connection for hostS1 dn3: schema change=true (db1->db3), autocommit change=false, charset change=false
total syn cmd 2 commands -- hostS2 發送 2 條同步命令
total syn cmd 3 commands -- hostS1 發送 3 條同步命令
received ok response -- 同步命令執行成功回應
✅ 關鍵點:同步完成前**不會發送業務 SQL**。每個同步命令收到 ok response 才發送下一條或業務 SQL。
execute query on hostS2 dn1: SELECT * FROM travelrecord
on row end response -- dn1 返回行數據
field metadata inf -- DataMergeService 合並列元數據
release connection/channel
execute query on hostS1 dn3: SELECT * FROM travelrecord
-- dn3 無數據,直接釋放
execute query on hostS2 dn2: SELECT * FROM travelrecord
syn connection... (新連接需同步)
on row end response
last packet id -- 合並完成,發送給前端
| 日志關鍵字 | 含義 | 排查價值 |
|---|---|---|
SQLRouteCache miss/add | 路由緩存未命中/構建 | 首次執行慢、DDL 後需刷新緩存 |
execute mutinode query | 多分片查詢 | 跨分片 JOIN/聚合性能風險 |
syn connection | 連接同步 | 同步耗時長 → 連接池污染/頻繁切換 DB |
schema change=true | Database 切換 | 頻繁切換 → 調整連接池 Key 策略 |
on row end response | 分片返回數據完成 | 單分片慢 → 後端索引/鎖問題 |
DataMergeService | 數據合並 | 大結果集合並 OOM 風險 |
release channel | 歸還連接 | 連接洩漏排查 |
tail -f mycat.log | grep -Ev "Timer|release channel|heartbeat"on row end response 時間間隔,配合 threadID 到後端 SHOW PROCESSLIST 核對schema change=true 高頻 → 檢查應用是否頻繁切換 DB、連接池配置是否合理MyCat 日志揭示了「路由緩存 → 多分片分發 → 連接池借用/同步 → 並發執行 → 流式合並」的完整中間件處理鏈路。掌握 syn connection 四項同步指標、DataMergeService 合並邏輯、SQLRouteCache 生命週期,是從「會用 MyCat」進化到「懂 MyCat、調優 MyCat」的必經之路。