MySQL Proxy(Lua 腳本驅動)可透明攔截 SQL,實現讀寫分離、負載均衡、連線池、SQL 審計、防火牆等功能。本文以 0.7.2 版為例,詳細記錄編譯安裝、配置啟動、測試驗證、生產調優全流程。
# 1. 下載(官方已停止維護,建議改用 ProxySQL/MaxScale)
wget https://mysql.stu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.7.2-linux-rhel4-x86-64bit.tar.gz
# 2. 解壓
tar zxf mysql-proxy-0.7.2-linux-rhel4-x86-64bit.tar.gz
cd mysql-proxy-0.7.2-linux-rhel4-x86-64bit
# 3. 安裝二進制與 Lua 腳本
mv sbin/mysql-proxy /usr/local/sbin/
mv share/mysql-proxy /usr/local/share/
# 4. 去除符號表減小體積
strip /usr/local/sbin/mysql-proxy
#!/bin/sh
# /etc/init.d/mysql-proxy
export LUA_PATH=/usr/local/share/mysql-proxy/?.lua
mode=$1
if [ -z "$mode" ]; then mode="start"; fi
case $mode in
'start')
mysql-proxy --daemon \
--admin-address=:4401 \
--proxy-address=:3307 \
--proxy-backend-addresses=10.0.0.60:3306 \
--proxy-read-only-backend-addresses=10.0.0.61:3306 \
--proxy-read-only-backend-addresses=10.0.0.62:3306 \
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua
;;
'stop')
killall mysql-proxy
;;
'restart')
if $0 stop; then $0 start; else echo "restart failed!"; exit 1; fi
;;
esac
exit 0
| 參數 | 範例值 | 說明 |
|---|---|---|
--daemon | - | 守護進程模式運行 |
--admin-address | :4401 | 管理介面監聽位址(可查狀態、動態調整) |
--proxy-address | :3307 | 應用連線的 Proxy 監聽埠 |
--proxy-backend-addresses | 10.0.0.60:3306 | 主庫(寫入)位址,支援多個做備援 |
--proxy-read-only-backend-addresses | 10.0.0.61:3306 | 從庫(唯讀)位址,可多個,自動負載均衡 |
--proxy-lua-script | rw-splitting.lua | 讀寫分離邏輯腳本(核心) |
下載:https://bazaar.launchpad.net/~diego-fmpwizard/mysql-proxy/bug-43424/download/head%3A/rw-splitting.lua-20090112150705-l9v35osiopsn0nz0-10/rw-splitting.lua
建議修改預設連線池參數:
-- rw-splitting.lua 內
min_idle_connections = 1 -- 每後端最小空閒連線
max_idle_connections = 3 -- 每後端最大空閒連線
根據實際併發調整,避免連線風暴。
# 啟動
/etc/init.d/mysql-proxy start
# 測試連線
mysql -h 127.0.0.1 -u root -P 3307 -p
# 驗證讀寫分離
mysql> SHOW PROCESSLIST;
-- 應看到連線分散到不同後端
# 準備測試資料
sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 \
--mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-db=test prepare
# 執行測試
sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 \
--mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-db=test run
# 觀察輸出:Threads fairness、events、execution time
-- 無報錯、無崩潰即通過基礎驗證
# 安裝
yum install -y proxysql # 或 apt
# 核心配置(/etc/proxysql.cnf 或 Admin 介面)
# 定義後端伺服器組:writer group (主)、reader group (從)
# 定義查詢規則:SELECT → reader group,其他 → writer group
# 啟用連線池、快取、統計
# 管理介面
mysql -u admin -padmin -h 127.0.0.1 -P 6032
-- ProxySQL Admin CLI 進行動態配置,無需重啟