MySQL Proxy 部署於客戶端應用程式與MySQL 伺服器叢集之間,扮演透明代理角色。其核心運作流程:
這要求 Proxy 同時實作 MySQL 客戶端與伺服器雙向協議,並內建 SQL 解析器,可視為輕量級 MySQL 節點。
MySQL 協議包含兩大階段:
Proxy 透過 Lua 腳本鉤子介入各階段:
connect_server() -- 連接後端伺服器
read_handshake() -- 讀取握手封包
read_auth() -- 讀取認證資訊
read_auth_result() -- 讀取認證結果
read_query() -- 讀取/攔截 SQL 查詢(核心路由邏輯)
read_query_result() -- 讀取查詢結果
MySQL Proxy 採用 Wormhole 儲存引擎,其資料儲存格式本身即為 Lua 腳本,這種設計使得 Lua 成為天然的擴展語言,靈活控制連線轉發、SQL 改寫、負載均衡邏輯。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| MySQL Proxy + Lua | 輕量、官方專案、深度可控 | Lua 開發門檻高、社群較小、已停止維護 | 簡單讀寫分離、自定義 SQL 改寫需求 |
| Amoeba | 功能豐富、Java 生態、中文文檔友善 | 不支援事務/DDL、單點故障需配合 Keepalived | 中小型專案、需分庫分表路由 |
| MyCat / ShardingSphere | 功能完整、活躍社群、支援分散式事務 | 部署較重、學習曲線陡峭 | 大型專案、微服務架構、強一致性需求 |