安裝包下載地址:https://downloads.mysql.com/archives/proxy/mysql
環境linux
proxy:172.16.1.20sql
master:172.16.1.21數據庫
slave1:172.16.1.22vim
slave2:172.16.1.23後端
本文選用mysql-proxy做爲轉發中間件, 版本爲mysql-proxy-0.8.5-linux-el6-x86-64bit服務器
一:在開啓主從複製的狀況下,在master建立供 proxy鏈接的帳號(這樣就等於同時在全部mysql上建立了鏈接帳號)tcp
mysql > create user 'rw'@'%' identified with mysql_native_password by 'tqw961110';ide
mysql > grant all on *.* to 'rw'@'%';性能
二:停用slave(全部mysql都執行一遍)
mysql > stop slave;
mysql > reset slave all;
三:解壓安裝包並進入
cd /tools/mysql-proxy-0.8.5-linux-el6-x86-64bit/
mkdir lua 建立存放lua腳本的目錄
mkdir logs 建立存放日誌的目錄
cp share/doc/mysql-proxy/rw-splitting.lua ./lua #複製讀寫分離配置文件
cp share/doc/mysql-proxy/admin-sql.lua ./lua #複製管理腳本
vim /etc/mysql-proxy.cnf #建立配置文件
[mysql-proxy]
user=root
admin-username=rw #proxy的鏈接帳號(主從都要有)
admin-password=tqw961110 #密碼
proxy-address=172.16.1.20:4040 #proxy運行的地址
proxy-read-only-backend-addresses=172.16.1.22,172.16.1.23 #只讀服務池
proxy-backend-addresses=172.16.1.21 #寫服務池
proxy-lua-script=/tools/mysql-proxy-0.8.5-linux-el6-x86-64bit/lua/rw-splitting.lua #讀寫腳本存放位置
admin-lua-script=/tools/mysql-proxy-0.8.5-linux-el6-x86-64bit/lua/admin-sql.lua #管理腳本存放位置
log-file=/tools/mysql-proxy-0.8.5-linux-el6-x86-64bit/logs/mysql.log #日誌存放位置
log-level=info #定義log日誌級別,由高到低分別有(error|warning|info|message|debug)
daemon=true #以守護進程的方式運行
keepalive=true #mysql-proxy崩潰時,嘗試重啓。
四:修改讀寫腳本
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
啓動proxy
/tools/mysql-proxy-0.8.5-linux-el6-x86-64bit/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
查看日誌
已經將後端mysql加進鏈接池
查看端口
netstat -atunlp | grep 4040
tcp 0 0 172.16.1.20:4040 0.0.0.0:* LISTEN 33297/mysql-proxy
測試讀寫性能
在proxy服務器上登錄mysql(proxy服務器須要有mysql命令。能夠yum -y install mysql)
mysql -h 172.16.1.20 -urw -ptqw961110 --port=4040
分別在主從數據庫插入數據
create database test;
use test;
create table test(id int(10),name varchar(20));
insert into t values(1,'this_is_master'); !!!!在slave上則是執行 insert into t values(1,'this_is_slave');
此時master與slave中的test庫test表的內容是不一樣的。
在proxy服務器上
use test;
select * from test;
顯示的是slave的內容
再在proxy服務器上插入數據試試
insert into t values(1,'this_is_proxy');
select * from test;
顯示的依舊是slave的內容
可是在master服務器上查看內容
select * from test;
已經能夠看到從proxy插入的數據
經測試,寫操做只會在master上進行,而讀操做只會在slave上進行。
至此,mysql讀寫分離成功。
若想關閉proxy
killall -9 mysql-proxy