首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 高可用叢集架構實作:MySQL-HA-Proxy 設計與通訊協定分析

     編輯:MySQL 資料庫相關知識

背景動機

Web 應用(Linux+Apache+PHP+MySQL)流量暴增,單一 MySQL 負載過高導致回應緩慢、鎖表頻繁、Load Average 飆升。傳統「修改程式碼分離讀寫」工程浩大且易出錯。需要一個透明的中介層,自動依 SQL 類型(讀/寫)路由至主/從庫,並具備健康檢查、負載均衡、高可用(HA)能力。

架構演進

  1. 單主單從 + 程式碼分流:手動改 PHP 連不同庫,擴充困難、寫入誤路由風險高。
  2. MySQL-HA-Proxy 方案:Proxy 解析 SQL,SELECT → 從庫,INSERT/UPDATE/DELETE → 主庫,結果透明回傳。支援依負載/鎖狀態動態路由,零程式碼修改。

MySQL Client/Server 通訊協定分析(3.23.49,協定版本 10)

Server → Client 回應封包

位移欄位長度說明
0-2Data Length3封包體長度(小端序)
3Sequence ID1遞增序號
4Flag10=普通、1=多段、2=認證回應、>2=段結束
5CMD Code1命令碼
6-MessageLen-1承載資料

關鍵 CMD Code 對照

Code類型Message 結構
0x00狀態碼影響行數(2) + ...
0x0A握手/版本版本字串(8) + Session ID(4) + Unknown(11) + 挑戰碼(8)
0xFF錯誤ErrCode(2) + ErrMsg
0xFE多段結束空

Client → Server 請求封包

位移欄位長度
0-2Data Length3
3Sequence ID1
4Compressed1
5Command ID1
6-Command DataLen-1

常用 Command ID

0x01  COM_QUIT
0x03  COM_QUERY          -- 普通查詢(核心路由點)
0x0B  COM_PROCESS_INFO
0x10  COM_PROCESS_KILL
0x17  COM_CHANGE_USER

認證流程破解與 Proxy 設計

挑戰:Server 握手時送出 8-byte 挑戰碼,Client 用其加密密碼回傳。作者未破解加密演算法,採「跳過密碼」策略:

  1. Client 連 Proxy → Proxy 連專用 MySQL Auth Server(最小資源實例)。
  2. Auth Server 回傳握手封包(含挑戰碼)給 Client。
  3. Client 加密密碼回傳 → Proxy 轉發給 Auth Server 驗證,同時保留封包副本。
  4. 驗證成功 → Proxy 從副本移除密碼欄位、重組封包 → 連向叢集真實 Real Server(無密碼帳號)。
  5. Real Server 因無密碼直接允許連線(內網隔離,風險可控)。

系統拓撲與流程

架構圖

  • HA:Heartbeat 雙機熱備,虛擬 IP 漂移。
  • Proxy:MySQL-HA-Proxy 核心,解析 SQL 路由。
  • MySQL Auth:專用認證實例。
  • Real Server (紅):主庫,可寫入,同步至其他從庫。
  • Real Server (綠):從庫,唯讀。

SQL 路由邏輯

  • 解析 COM_QUERY 封包中的 SQL 文本。
  • SELECT、SHOW、EXPLAIN → 輪詢/負載導向從庫。
  • INSERT/UPDATE/DELETE/REPLACE/CREATE/ALTER/DROP → 強制導向主庫。
  • 事務(BEGIN/COMMIT/ROLLBACK)整段黏著主庫。
  • 動態採集各 Real Server LoadAvg 回報 Proxy,依負載加權路由(版本 0.0.4 仍採輪詢,負載感知在開發中)。

專案現況與測試

  • 版本 0.0.4 已跑通官方 sql-bench(單點效能基準)。
  • 叢集效能測試計畫:VBB 論壇 + Apache ab 壓測。
  • 最小測試環境:5 台機(1 Apache+PHP、1 AB、1 Proxy+Auth、2 Real Server)。
  • 原始碼:https://netsock.org/bbs/(MySQL-HA-Cluster 專案)。

作者

徐超,TOM.COM 北京,網路系統技術支援。業餘開發 NetSocket 基礎應用:SocketChat、MySQL-HA-Proxy、PHP Session Server。

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