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

MySQL Proxy 安裝避坑指南:libevent 依賴解決與 Systemd 服務化腳本

     編輯:MySQL 資料庫相關知識

常見啟動失敗:libevent 找不到

現象:./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

Systemd 服務單元文件(生產就緒)

創建 /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;  -- 查看後端節點狀態、權重、連接數

避坑清單

  1. Lua 腳本路徑:LUA_PATH 環境變量必須指向 ?.lua 目錄,否則 rw-splitting.lua 找不到。
  2. 防火牆:放行 3307(代理)、4401(管理)、3306(後端實際不直接暴露)。
  3. 權限:代理以 mysql 用戶運行,日誌、PID 目錄需 chown mysql:mysql。
  4. 單點風險:Proxy 本身是單點,生產需雙節點 + Keepalived VIP 漂移,或改用 ProxySQL(功能更豐富、集群化)。
  5. rw-splitting.lua 不支援準備語句:應用層若大量用 PreparedStatement,需改用 ProxySQL 或修改 Lua 腳本。

總結

MySQL Proxy 輕量實現讀寫分離,關鍵在於 libevent 依賴解決、Systemd 服務化、Lua 腳本正確加載、管理接口驗證。對於高可用要求高的場景,建議直接上 ProxySQL(支援集群、查詢重寫、緩存、熔斷、Metrics),避免二次造輪子。

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