1. mysql proxy 簡介
- mysql-proxy是mysql官方提供的mysql中間件服務,上游可接入若干個mysql-client,後端可連接若干個mysql-server。
它使用mysql協議,任何使用mysql-client的上游無需修改任何代碼,即可遷移至mysql-proxy上。
mysql-proxy最基本的用法,就是作爲一個請求攔截,請求中轉的中間層:
進一步的,mysql-proxy可以分析與修改請求。攔截查詢和修改結果,需要通過編寫Lua腳本來完成。
mysql-proxy允許用戶指定Lua腳本對請求進行攔截,對請求進行分析與修改,它還允許用戶指定Lua腳本對服務器的返回結果進行修改,加入一些結果集或者去除一些結果集均可。
所以說,根本上,mysql-proxy是一個官方提供的框架,具備良好的擴展性,可以用來完成:
sql攔截與修改
性能分析與監控
讀寫分離
請求路由等
讀寫分離實例
1)我們在進行web開發的時候,往往一臺MySQL服務器是不夠用的,可能需要多臺,web到底連接哪個數據庫?
這要程序員自己寫的代碼來決定的,現在是二臺mysql服務器,如果有多臺或者是N臺呢,靠用php代碼來管理連接數據庫,就太過繁瑣
2)mysql proxy就很好解決了這個問題,對於程序端而言,web端的請求,只要到mysql proxy的連接池就OK了,剩下的工作就交給mysql proxy了。對於程序代碼管理來說就簡單多了。
基於主從複製進行 mysql 的讀寫分離
主重複制的相關信息可參看的我博客mysql主從複製(基於GTID的主從複製、並行複製、半同步複製)
注:
以下實驗是基於mysql 基於GTID 的半同步複製模式進行的在此條件下進行的
實驗拓撲
master:server11:IP 172.25.21.11
slave:server12:IP 172.25.21.12
mysql proxy :server13:IP 172.25.21.13
mysql 版本:5.7.17-1.el6.x86_64
musql-proxy 版本:mysql-proxy-0.8.5-linux-el6-x86-64
2. 進行mysql proxy的安裝配置
將mysql-proxy安裝包進行解壓,並移動到指定目錄下
[root@serve13 mnt]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@serve13 mnt]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
進行mysql-proxy配置文件的編寫
編輯配置文件
[root@serve13 ~]# vim /etc/mysql-proxy.conf
[mysql-proxy]
user=root
proxy-address=0.0.0.0:3306 # 本機監聽的地址及端口
proxy-backend-addresses=172.25.21.11:3306
# 配置讀寫服務器,IP及端口
proxy-read-only-backend-addresses=172.25.21.12:3306
# 配置只讀服務器,IP及端口
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
# 用這個lua腳本來實現讀寫分離
admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua
# admin模塊的lua腳本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
# 服務日誌
log-level=debug # 日誌模式設置爲debug模式,方便調試
keepalive=true # 持續連接
daemon=true # 打入後臺
在/usr/local/mysql-proxy/路徑中建立對應的logs目錄,否則在開啓服務時會出現報錯
還要將mysql-proxy的配置文件的權限修改爲660,否則在開啓服務器時會有權限問題。
[root@serve13 ~]# mkdir /usr/local/mysql-proxy/logs/
[root@serve13 ~]# chmod 660 /etc/mysql-proxy.conf
編輯讀寫分離的lua腳本,方便實驗觀測(生產環境中不需要此操作)
[root@serve13 mysql-proxy]# vim share/doc/mysql-proxy/rw-splitting.lua
第38行
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, --4
# 最小連接數,默認值爲4
max_idle_connections = 1, --8
# 最大連接數後實現讀寫分離,默認值爲
is_debug = false
}
end
3. 啓動服務,並進行測試
直接執行安裝包中的命令進行啓動服務
[root@serve13 bin]# /usr/local/mysql-proxy/bin/mysql-proxy --help
# 查看啓動時調用的參數
[root@serve13 bin]# /usr/local/mysql-proxy/bin/mysql-proxy \
> --plugins=admin \ # 模塊選擇
> --plugins=proxy \
> --defaults-file=/etc/mysql-proxy.conf \ # 指定配置文件
> --admin-username=root \ # admin 模塊指定的啓動用戶
> --admin-password=redhat # admin 模塊啓用的密碼
查看進程及啓動日誌
[root@serve13 bin]# ps ax # 查看進程是否啓用
[root@serve13 bin]# cat /usr/local/mysql-proxy/logs/mysql-proxy.log
# 通過日誌查看運行狀態
ps ax
日誌內容
可通過admin 模塊來查看proxy 的後端情況
通過 tcpdump,lsof 命令來查看數據包走向