Docker-Mysql-proxy Mysql實現讀寫分離與負載
原理
- MySQL Proxy處於客戶端應用程序和MySQL服務器之間,通過截斷、改變並轉發客戶端和后端數據庫之間的通信來實現其功能。
- MySQL Proxy就是這么一個中間層代理,簡單的說,MySQL Proxy就是一個連接池,負責將前台應用的連接請求轉發給后台的數據庫,並且通過使用lua腳本,可以實現復雜的連接控制和過濾,從而實現讀寫分離和負載平衡。對於應用來說,MySQL Proxy是完全透明的,應用則只需要連接到MySQL Proxy的監聽端口即可。當然,這樣proxy機器可能成為單點失效,但完全可以使用多個proxy機器做為冗余,在應用服務器的連接池配置中配置到多個proxy的連接參數即可。
負載解析
- mysql-proxy負載均衡是體現在“連接”的均衡上。mysql_proxy會把連接mysql服務器的TCP/IP連接緩存進連接池以提高性能在緩存池里,緩存的連接大致是平均分配在每台mysql服務器上,但具體的每一個連接,始終連接某台服務器。所以在出現了mysql的sql查詢時,卻總往某一台mysql server來發送是這么回事的。
資源
-
Mysql-proxy官網下載地址:https://downloads.mysql.com/archives/proxy/
准備
- 2個正在運行的mysql。
- 一個centos,部署mysql-proxy。
- ngvicat,用於測試。
配置
- 通過docker啟動2個運行的mysql環境
docker run -tid -p 3307:3306 --name mysql_master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
docker run -tid -p 3308:3306 --name mysql_slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
2. 配置mysql-proxy
wget https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz
tar zxvf mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz
mv mysql-proxy-0.8.5-linux-debian6.0-x86-64bit mysql-proxy cd /usr/local/mysql-proxy mkdir lua #創建腳本存放目錄 mkdir logs #創建日志目錄 touch logs/mysql-proxy.log chmod 777 logs/mysql-proxy.log cp share/doc/mysql-proxy/rw-splitting.lua ./lua #復制讀寫分離配置文件 cp share/doc/mysql-proxy/admin-sql.lua ./lua #復制管理腳本
vi /etc/mysql-proxy.cnf #創建配置文件
3. 配置文件
[mysql-proxy]
user=root #運行mysql-proxy用戶 log-level=info #定義log日志級別,由高到低分別有(error|warning|info|message|debug) log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置 proxy-address=172.17.0.5:4040 #mysql-proxy運行ip和端口,不加端口,默認4040 proxy-backend-addresses=172.17.0.2:3306 #指定后端主master寫入數據 proxy-read-only-backend-addresses=172.17.0.3:3306 #指定后端從slave讀取數據 proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定讀寫分離配置文件位置 admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua #指定管理腳本 daemon=true #以守護進程方式運行 keepalive=true #mysql-proxy崩潰時,嘗試重啟
4. 配置完成,保存退出!
chmod 660 /etc/mysql-porxy.cnf
修改讀寫分離配置文件
vi /usr/local/mysql-proxy/lua/rw-splitting.lua
找到下面的代碼,覆蓋對應部分即可,其余代碼均保留不變。
if not proxy.global.config.rwsplit then proxy.global.config.rwsplit = { min_idle_connections = 1, #默認超過4個連接數時,才開始讀寫分離,改為1 max_idle_connections = 1, #默認8,改為1 is_debug = false } end
注意
- 配置文件中的注視不能保留,否則啟動的的時候可能報錯。
- 使用下列第一種啟用方式則不需要配置,但通常情況下,我們則會使用配置文件啟動。
啟動方式2種
- 通過命令行啟動
/usr/local/mysql-proxy/bin/mysql-proxy --proxy-backend-addresses=172.17.0.5:3306 --proxy-backend-addresses=172.17.0.3:3306 --proxy-backend-addresses=172.17.0.2:3306

- 通過配置文件啟動
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf &
加&是置於后台運行。

測試




出現錯誤分析
- mysql-proxy代理的服務器中(邏輯數據庫)不能連接到其他兩台服務器(物理數據庫)。可能原因:3者未處於同一網橋中。解決方法:要么不建立網絡network,要么創建於同一個network中。




- 通過配置文件啟動報如下錯誤。解決方法:賦予配置文件600權限即可。chmod 600 /etc/mysql-proxy.cnf。
- 服務未正常啟動,查看對應的日志文件。可能錯誤,配置中存在注釋,導致出現多個日志文件,存在錯誤。




- 檢查配置文件中的lua文件是否存在對應的目錄中,如果沒有則復制進去。

