讀寫分離將寫操作路由至 Master,讀操作分發至 Slave,大幅降低主庫壓力。本文詳解中間件 mysql-proxy(Lua 腳本路由)與 PHP 擴展 mysqlnd_ms(驅動層路由)的安裝配置全流程。
下載二進制包解壓:
tar -zxvf mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz mv mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit /usr/local/mysql-proxy
依賴:libevent 2.x、lua 5.1.x、glibc 2.6+、pkg-config、libtool 1.5+。
Master: 192.168.216.133:3306 Slave: 192.168.216.132:3306
[mysql-proxy] daemon=true keepalive=true log-level=debug log-file=/var/log/mysql-proxy.log basedir=/usr/local/mysql-proxy proxy-address=192.168.216.132:4040 proxy-backend-addresses=192.168.216.133:3306 # Master (讀寫) proxy-read-only-backend-addresses=192.168.216.132:3306 # Slave (唯讀) proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua admin-address=192.168.216.132:4041 admin-username=admin admin-password=admin admin-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua
權限 chmod 600 mysql-proxy.conf,確保 Lua 腳本存在。
/usr/local/mysql-proxy/bin/mysql-proxy \ --plugins=proxy --plugins=admin \ --defaults-file=mysql-proxy.conf
管理端檢查後端狀態:
mysql -uadmin -padmin -h192.168.216.132 -P4041 SELECT * FROM backends;
需在後端 MySQL 授權 proxy 連接用戶。自定義 admin.lua 實現管理介面。
常見問題:連接數不足調整 min_idle_connections/max_idle_connections;亂碼設置 skip-character-set-client-handshake、init-connect='SET NAMES utf8'。
需 PHP 編譯時 --with-mysqlnd,無需本地 MySQL 客戶端庫。
tar -zxvf mysqlnd_ms-1.5.2.tgz cd mysqlnd_ms-1.5.2 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
記錄生成的 .so 路徑。
extension = /path/to/mysqlnd_ms.so mysqlnd_ms.enable = On mysqlnd_ms.config_file = /usr/local/php/etc/mysqlnd_ms_plugin.ini
{
"myapp": {
"master": {
"master_0": { "host": "192.168.6.135", "socket": "/tmp/mysql.sock" }
},
"slave": {
"slave_0": { "host": "192.168.6.136", "port": "3306" },
"slave_1": { "host": "192.168.6.137", "port": "3306" }
},
"filters": { "random": { "sticky": "1" } }
}
}
sticky=1 保證同一請求內讀操作固定路由到同一 Slave,避免複製延遲導致讀舊數據。
以 WordPress 為例,修改 wp-config.php:
define('DB_HOST', 'myapp');
驅動自動識別 SELECT 路由至 Slave,寫操作路由至 Master。