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

MySQL Proxy 實現讀寫分離與負載均衡部署實戰

     編輯:MySQL 資料庫相關知識

MySQL Proxy 實現讀寫分離與負載均衡部署實戰

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-addresses10.0.0.60:3306主庫(寫入)位址,支援多個做備援
--proxy-read-only-backend-addresses10.0.0.61:3306從庫(唯讀)位址,可多個,自動負載均衡
--proxy-lua-scriptrw-splitting.lua讀寫分離邏輯腳本(核心)

四、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
-- 無報錯、無崩潰即通過基礎驗證

七、進階功能與遷移建議

  • 連線池:Proxy 維護後端連線池,解決 PHP 等短連線應用的連線數暴增問題
  • SQL 審計/防火牆:Lua 腳本可攔截、記錄、阻擋高風險 SQL
  • 查詢重寫:自動改寫低效 SQL
  • ⚠ 官方已停止維護:MySQL Proxy 0.8.5 (2014) 為最後版本。生產環境強烈建議遷移至 ProxySQL 或 MaxScale:
    • ProxySQL:高效能、多執行緒、動態配置、查詢規則、鏡像、快取、支援 MySQL/ClickHouse
    • MaxScale:MariaDB 官方、模組化、Binlog 路由、資料遮罩、監控儀表板

八、ProxySQL 快速上手對比


# 安裝
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 進行動態配置,無需重啟
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved