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

MySQL Proxy 實現讀寫分離:踩坑實錄與 Lua 腳本遷移指南

     編輯:MySQL 資料庫相關知識

背景

MySQL Proxy 0.7.0 即將發布,筆者從 BZR 獲取源碼編譯測試,配置讀寫分離過程中遇到諸多坑,網上資料極少,最終在開發環境穩定運行,記錄分享。

核心問題 1:舊版 Lua 腳本不兼容

現象

(critical) proxy-plugin.c:1367: .address is deprecated. Use .src.name or .dst.name instead
(critical) (read_query) ... .address is deprecated ...
(critical) proxy-plugin.c.1115: I have no server backend, closing connection

啟動頻報 MySQL Server has gone away。

根因

自帶 rw-splitting.lua 仍為 0.6.1 版本,API 已變更:

  • 舊:proxy.global.backends[i].address
  • 新:proxy.global.backends[i].src.name / .dst.name

解決方案

  1. 從 官方 Lua 腳本分支 下載最新 rw-splitting.lua 替換舊版。
  2. 或手動修改所有 .address 為 .src.name/.dst.name。

核心問題 2:Prepared Statement 無結果返回

現象

PHP PDO 連接 Proxy 時,查詢隨機無結果,單獨連 MySQL 正常,日志無有用信息。

繞過方案

使用 PDO 模擬預處理(客戶端模擬),而非原生預處理:

$pdo = new PDO($dsn, $user, $pass, [
    PDO::ATTR_EMULATE_PREPARES => true  // 關鍵
]);

官方稱模擬模式性能反而更好,可作安慰獎。

核心問題 3:Proxy 進程不穩定

現象

偶發 Crash,需人工重啟。

解決方案

啟動參數加上 --keepalive:

mysql-proxy --keepalive --proxy-lua-script=rw-splitting.lua ...

進程掛掉自動拉起,保證服務可用性。

最佳實踐總結

  1. 腳本版本鎖定:生產環境務必使用與 Proxy 版本匹配的 Lua 腳本,避免 API 變更導致故障。
  2. 監控告警:對 Proxy 進程、後端 MySQL 存活、主從延遲建立監控。
  3. 連接池配置:合理設置 proxy.pool.no_backends、max_idle_time 等參數。
  4. 考慮替代方案:Proxy 社區活躍度低,生產建議評估 ProxySQL、MaxScale、ShardingSphere-Proxy 等更成熟的中間件。

結語

MySQL Proxy 輕量級、可編程性強,適合中小規模讀寫分離。但 Lua 生態滯後、文檔缺失是硬傷。若團隊有運維能力,ProxySQL 等新一代中間件在功能豐富度、穩定性、社區支持上更有優勢。

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