前言
前面學習了主從復制和主主復制,接下來給大家分享一下怎么去使用mysql-proxy這個插件去配置MySQL集群中的負載均衡以及讀寫分離。
注意:這里比較坑的就是mysql-proxy一直沒有更新導致版本太落后了,我在MySQL5.7.19中搭建玩負載均衡后有bug,所以這里我在windows中搭建了兩個MySQL(好像是5.6或5.6以下的都可以搭建成功)服務器。
還有就是可以使用mysql-proxy的替代品mysql-Router功能更強大!廢話不多說,我們直接干起來。
一、mysq-proxy簡介與安裝
1.1、mysql-proxy簡介
mysql-proxy是官方提供的mysql中間件產品可以實現負載平衡,讀寫分離,failover等
MySQL Proxy就是這么一個中間層代理,簡單的說,MySQL Proxy就是一個連接池,負責將前台應用的連接請求轉發給后台的數據庫,並且通過使用lua腳本,可以實現復雜的連接控制和過濾,
從而實現讀寫分離和負載平衡。對於應用來說,MySQL Proxy是完全透明的,應用則只需要連接到MySQL Proxy的監聽端口即可。
當然,這樣proxy機器可能成為單點失效,但完全可以使用多個proxy機器做為冗余,在應用服務器的連接池配置中配置到多 個proxy的連接參數即可。
1.2、實例描述作用
1)我們在進行web開發的時候,往往一台MySQL服務器是不夠用的,可能需要多台,web到底連接哪個數據庫?
這個要程序員自己寫的代碼來決定的,現在是二台mysql服務器,如果有多台或者是N台呢,靠用php代碼來管理連接數據庫,就很尷尬了。
2)mysql proxy就很好解決了這個問題,對於程序端而言,web端的請求,只要到mysql proxy的連接池就OK了,剩下的工作就交給mysql proxy了。對於程序代碼管理來說就簡單多了。個人覺得這一點最值得借用的了。
1.3、mysql-proxy的安裝
其實這個也有windows的版本,但是我推薦在linux中去使用,因為在開發中大部分服務器都是安裝在linux中的。我的就是安裝在ubuntu17.04版本的server版中。
1)首先你需要有這個安裝包:mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz(需要的話私聊我)
2)一般我們把這個第三方的軟件安裝在/opt目錄下
解壓mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz到/opt/目錄並創建軟鏈接。
tar zxvf mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz –C /opt/
ln –snf /opt/mysql-proxy-0.8.5-linux-debian6.0-x86-64bit /opt/mysql-proxy(創建軟鏈接不懂的看前面的博文)
3)配置環境變量
這里的話,一般配置在.bashrc下,因為每個用戶有每個用戶不同的功能,你也可以配置在全局環境變量當中(/etc/profile)
我在.baserc下的配置:
sudo vi .bashrc 在最后面添加:
完成之后注意要更新:source .bashrc如果配置在全局變量中也要更新
4)查看是否安裝成功
其實當你輸入mysql-p的時候,按tab鍵能夠聯想出來,說明你已經配置成功了。我們可以通過mysql-proxy -V查看是否配置成功。
二、使用mysql-proxy實現負載均衡
那我們該怎么去配置負載均衡呢?我們可以通過mysql-proxy --help來查看參數的意思
搭建步驟:
我的mysql-proxy安裝在ubuntu中,兩個mysql服務器安裝在windows當中。
1)在你的已經安裝了mysql-proxy的主機上創建一個腳本:mysql-proxy-replication.sh
#!/bin/bash /opt/mysql-proxy/bin/mysql-proxy \ --proxy-address=1.0.0.3:4040 \ #這個是安裝mysql-proxy的主機上的ip,這個4040端口是mysql-proxy的默認端口 --proxy-backend-addresses=192.168.2.45:3125 \ #這個是mysql服務器安裝主機的ip和mysql的端口 --proxy-backend-addresses=192.168.2.45:3126 \ --log-level=info \ --log-file=/opt/mysql-proxy/logs/mysql-proxy-12.log \ #存放日志文件的位置 --daemon
2)然后我們執行這個腳本,我把腳本放在了家目錄上面
創建好了,可以修改一下文件的權限sudo chmod u+x mysql-proxy-replication.sh
還要創建一下存放日志文件的目錄與文件sudo mkdir -r /opt/mysql-proxy/logs與touch mysql-proxy-12.log
執行sudo ./mysql-proxy-replication.sh
注意:這里我為了給大家演示我把mysql-proxy先關閉:使用ps -ef查看進程號,在使用sudo kill -9 進程號或者sudo killall mysql-proxy
3)我們查看一下日志,看是否腳本運行成功
sudo vi /opt/mysql-proxy/logs/mysql-proxy-12.log
從日志文件可以清楚的看到,插件proxy正在監聽着4040端口,它還添加了兩個MySQL服務器(主主復制)。
4)獲取mysql-proxy中管理的兩個服務器的連接
獲取連接:mysql -uroot -p123456 -h1.0.0.3 -P4040
分析:我們的用戶名和密碼是使用的是MySQL服務器的用戶名和密碼,因為是要從他們兩個當中獲取連接,ip和端口都是使用代理的ip和端口。
5)結果
我們在這里執行創建一個數據庫:create database db_test_1
使用mysql -uroot -p123456 -h1.0.0.3 -P4040獲取的連接
然后在查看mysql兩台服務器有沒有創建成功
使用mysql -uroot -p -h192.168.2.45 -P3125和mysql -uroot -p -h192.168.2.45 -P3126登錄
兩個都是一樣的,說明主主復制的兩個集群,使用mysql-proxy管理成功!
總結:在這個負載均衡當中,其實就是使用mysql-proxy均衡兩個MySQL服務器的連接數。這里不管這個連接里面的連接處理的數據量有多大,處理時間有多長。
比如主機A有5個連接,處理時間只需要10分鍾。二主機B有2個連接,處理時間需要1個小時。當有第8個連接時,更有可能獲取的是主機B的連接。
mysql_proxy會把連接mysql服務器的tcp/IP連接緩存進連接池,以提高性能. 在緩存池里, 緩存的連接大致是平均分配在每台mysql服務器上. 但具體的每一個連接,始終連某台服務器.
三、使用mysql-proxy實現讀寫分離
3.1、概述
Mysql作為目前世界上使用最廣泛的免費數據庫,相信所有從事系統運維的工程師都一定接觸過。但在實際的生產環境中,由單台Mysql作為獨立的數據庫是完全不能滿足實際需求的,無論是在安全性,高可用性以及高並發等各個方面。
因此,一般來說都是通過 主從復制(Master-Slave)的方式來同步數據,再通過讀寫分離(MySQL-Proxy)來提升數據庫的並發負載能力 這樣的方案來進行部署與實施的。
3.2、配置讀寫分離
在這里我只是配置的是主主復制。
1)怎么配置在兩台MySQL服務器中的主主復制我就不介紹了,前面一篇博客已經介紹了。
2)在你的已經安裝了mysql-proxy的主機上創建一個腳本:mysql-proxy-rw-splitting.sh,並運行
首先我們在前面當中已經運行了mysql-proxy我們需要先殺死這個進程:sudo killall mysql-proxy
#!bash/bin
/opt/mysql-proxy/bin/mysql-proxy \ --proxy-address=1.0.0.3:4040 \ --proxy-backend-addresses=17.16.15.112:3125 \ #在3125端口的服務器中配置可讀可寫 --proxy-read-only-backend-addresses=172.16.15.112:3126 \ #在3126端口的服務器中配置只讀 --proxy-lua-script=/opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua \ #用這個lua腳本來實現讀寫分離 --log-level=info \ --log-file=/opt/mysql-proxy/logs/mysql-proxy-12.log \ #這是它的日志 --daemon
3)我們查看一下日志,看是否腳本運行成功
sudo vi /opt/mysql-proxy/logs/mysql-proxy-12.log
2017-09-20 03:03:58: (critical) plugin proxy 0.8.5 started 2017-09-20 03:03:58: (message) proxy listening on port 1.0.0.3:4040 2017-09-20 03:03:58: (message) added read/write backend: 17.16.15.112:3125 2017-09-20 03:03:58: (message) added read-only backend: 172.16.15.112:3126
4)獲取連接:mysql -uroot -p123456 -h1.0.0.3 -P4040
分析:我們的用戶名和密碼是使用的是MySQL服務器的用戶名和密碼,因為是要從他們兩個當中獲取連接,ip和端口都是使用代理的ip和端口。
四、Mysql-proxy 中間件的使用
4.1、在mysql 客戶端通過中間件連接mysql集群
mysql –uroot –p –h 192.168.41.201 –P 4040(注意修改my.conf中綁定ip后才能遠程登錄mysql,且有遠程登錄賬號 GRANT ALL PRIVILEGES ON *.* TO ‘root’@‘%’ IDENTIFIED BY ‘’ WITH GRANT OPTION;)
如果遠程連接很卡,或者很慢,可以關閉mysql節點 地址反向解析功能 在my.cnf 中添加 skip-name-resolve。
4.2、在mysql 客戶端通過中間件連接mysql集群
可以通過 JDBC 訪問mysql-proxy進而訪問mysql集群 Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://192.168.41.201:4040/test?user=briup&password=briup";
不錯就點個“推薦”哦!