現象:./mysql-proxy: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file
LD_DEBUG=libs ./mysql-proxy -h # 查看運行時搜索路徑
# 假設 libevent 安裝在 /usr/local/lib
ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2
# 或寫入 ld.so.conf 並執行 ldconfig
echo "/usr/local/lib" > /etc/ld.so.conf.d/libevent.conf
ldconfig
創建 /etc/systemd/system/mysql-proxy.service:
[Unit]
Description=MySQL Proxy Read/Write Splitting
After=network.target mysqld.service
Wants=mysqld.service
[Service]
Type=forking
User=mysql
Group=mysql
Environment=LUA_PATH=/usr/local/share/mysql-proxy/?.lua
ExecStart=/usr/local/bin/mysql-proxy \
--daemon \
--admin-address=:4401 \
--proxy-address=:3307 \
--proxy-backend-addresses=127.0.0.1:3306 \
--proxy-read-only-backend-addresses=192.168.133.232:3306 \
--proxy-read-only-backend-addresses=10.10.74.61:3306 \
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua \
--pid-file=/var/run/mysql-proxy/mysql-proxy.pid \
--log-file=/var/log/mysql-proxy/mysql-proxy.log \
--log-level=info
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable mysql-proxy
systemctl start mysql-proxy
systemctl status mysql-proxy
journalctl -u mysql-proxy -f # 實時看日誌
| 參數 | 含義 |
|---|---|
--proxy-address=:3307 | 應用端連接的代理端口 |
--proxy-backend-addresses=127.0.0.1:3306 | 主庫(寫入)地址,可多個逗號分隔 |
--proxy-read-only-backend-addresses=... | 從庫(讀取)地址,支援多個,自動負載均衡 |
--proxy-lua-script=rw-splitting.lua | 內建讀寫分離腳本,SELECT 走從庫,事務/寫入走主庫 |
--admin-address=:4401 | 管理接口,可連接查看後端狀態、執行 Lua 命令 |
--daemon | 後台守護進程模式 |
# 連接代理
mysql -h 127.0.0.1 -P 3307 -u app_user -p
# 執行查詢
SELECT @@hostname; -- 應輪詢顯示從庫主機名
START TRANSACTION;
INSERT INTO t VALUES (1); -- 應路由到主庫
COMMIT;
mysql -h 127.0.0.1 -P 4401
# 進入後
SELECT * FROM backends; -- 查看後端節點狀態、權重、連接數
LUA_PATH 環境變量必須指向 ?.lua 目錄,否則 rw-splitting.lua 找不到。chown mysql:mysql。rw-splitting.lua 不支援準備語句:應用層若大量用 PreparedStatement,需改用 ProxySQL 或修改 Lua 腳本。MySQL Proxy 輕量實現讀寫分離,關鍵在於 libevent 依賴解決、Systemd 服務化、Lua 腳本正確加載、管理接口驗證。對於高可用要求高的場景,建議直接上 ProxySQL(支援集群、查詢重寫、緩存、熔斷、Metrics),避免二次造輪子。