前言php
前面學習了主從複製和主主複製,接下來給你們分享一下怎麼去使用mysql-proxy這個插件去配置MySQL集羣中的負載均衡以及讀寫分離。mysql
注意:這裏比較坑的就是mysql-proxy一直沒有更新致使版本太落後了,我在MySQL5.7.19中搭建玩負載均衡後有bug,因此這裏我在windows中搭建了兩個MySQL(好像是5.6或5.6如下的均可以搭建成功)服務器。linux
還有就是可使用mysql-proxy的替代品mysql-Router功能更強大!廢話很少說,咱們直接幹起來。程序員
mysql-proxy是官方提供的mysql中間件產品能夠實現負載平衡,讀寫分離,failover等web
MySQL Proxy就是這麼一個中間層代理,簡單的說,MySQL Proxy就是一個鏈接池,負責將前臺應用的鏈接請求轉發給後臺的數據庫,而且經過使用lua腳本,能夠實現複雜的鏈接控制和過濾,sql
從而實現讀寫分離和負載平衡。對於應用來講,MySQL Proxy是徹底透明的,應用則只須要鏈接到MySQL Proxy的監聽端口便可。數據庫
固然,這樣proxy機器可能成爲單點失效,但徹底可使用多個proxy機器作爲冗餘,在應用服務器的鏈接池配置中配置到多 個proxy的鏈接參數便可。ubuntu
1)咱們在進行web開發的時候,每每一臺MySQL服務器是不夠用的,可能須要多臺,web到底鏈接哪一個數據庫?windows
這個要程序員本身寫的代碼來決定的,如今是二臺mysql服務器,若是有多臺或者是N臺呢,靠用php代碼來管理鏈接數據庫,就很尷尬了。緩存
2)mysql proxy就很好解決了這個問題,對於程序端而言,web端的請求,只要到mysql proxy的鏈接池就OK了,剩下的工做就交給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 --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做爲目前世界上使用最普遍的免費數據庫,相信全部從事系統運維的工程師都必定接觸過。但在實際的生產環境中,由單臺Mysql做爲獨立的數據庫是徹底不能知足實際需求的,不管是在安全性,高可用性以及高併發等各個方面。
所以,通常來講都是經過 主從複製(Master-Slave)的方式來同步數據,再經過讀寫分離(MySQL-Proxy)來提高數據庫的併發負載能力 這樣的方案來進行部署與實施的。
在這裏我只是配置的是主主複製。
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 –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。
能夠經過 JDBC 訪問mysql-proxy進而訪問mysql集羣 Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://192.168.41.201:4040/test?user=briup&password=briup";
不錯就點個「推薦」哦!