首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MyCat 日志深度解析:啟動流程、路由邏輯、連接池同步、數據合並全鏈路追蹤

     編輯:MySQL 綜合教學

MyCat 日志深度解析:啟動流程、路由邏輯、連接池同步、數據合並全鏈路追蹤

MyCat 日志是理解其中間件運行機制、排查路由錯誤、性能抖動的核心窗口。本文基於 DEBUG 級日志,完整解析啟動初始化、心跳檢測、前端連接建立、SQL 路由緩存、多節點查詢分發、連接同步、數據合並返回的全鏈路細節。

一、 啟動初始化階段

1. 系統參數加載

-sysconfig params: 
idleTimeout=1800000          # 前端空閒超時 30min
dataNodeHeartbeatPeriod=10000 # 心跳間隔 10s
processor=8                   # CPU 核心數
aio thread pool size=16       # AIO 線程池 = 核心數 × 2

端口:9066(管理)、8066(數據,對應 MySQL 3306)。

2. 後端連接池創建

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

目的:緩存元數據(庫/表/版本),供後續路由解析使用,避免重複查詢後端。

四、 SQL 路由與執行全鏈路(以 SELECT * FROM travelrecord 為例)

1. 路由緩存命中/構建

SQLRouteCache miss cache    -- 首次無緩存
SQLRouteCache add cache     -- 構建路由信息入緩存
execute mutinode query      -- 判斷為多分片查詢
has data merge logic        -- 需合並結果集

路由緩存 Key:SQL 模板(參數化後)+ 分片規則。命中直接獲取目標分片列表。

2. 多分片分發與連接借用

配置 balance=1(所有從庫參與 SELECT 負載均衡),3 分片 → 選 3 個 read source:

  • 分片 dn1 → hostS2 (192.168.244.144) 連接 1
  • 分片 dn2 → hostS2 連接 2(新建)
  • 分片 dn3 → hostS1 (192.168.244.146) 連接 1

3. 連接同步機制(核心難點)

背景:MyCat 連接池 Key = Database + AutoCommit 模式。借出的連接可能 Database 不匹配、事務模式不匹配。

同步四項指標:

  1. 事務隔離級別
  2. 事務模式(自動/手動提交)
  3. 字符集
  4. 當前 Database(Schema)

日志示例:

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。

4. 業務 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=trueDatabase 切換頻繁切換 → 調整連接池 Key 策略
on row end response分片返回數據完成單分片慢 → 後端索引/鎖問題
DataMergeService數據合並大結果集合並 OOM 風險
release channel歸還連接連接洩漏排查

六、 實戰排查技巧

  1. 過濾心跳噪音:tail -f mycat.log | grep -Ev "Timer|release channel|heartbeat"
  2. 定位慢查詢分片:關注 on row end response 時間間隔,配合 threadID 到後端 SHOW PROCESSLIST 核對
  3. 連接同步異常:schema change=true 高頻 → 檢查應用是否頻繁切換 DB、連接池配置是否合理
  4. 數據合並 OOM:大結果集分頁查詢改寫、流式處理

七、 總結

MyCat 日志揭示了「路由緩存 → 多分片分發 → 連接池借用/同步 → 並發執行 → 流式合並」的完整中間件處理鏈路。掌握 syn connection 四項同步指標、DataMergeService 合並邏輯、SQLRouteCache 生命週期,是從「會用 MyCat」進化到「懂 MyCat、調優 MyCat」的必經之路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved