mysql-8.0.12讀寫分離
安裝包下載地址:https://downloads.mysql.com/archives/proxy/
環境
proxy:172.16.1.20
master:172.16.1.21
slave1:172.16.1.22
slave2:172.16.1.23
本文選用mysql-proxy作為轉發中介軟體, 版本為mysql-proxy-0.8.5-linux-el6-x86-64bit
一:在開啟主從複製的情況下,在master建立供 proxy連線的賬號(這樣就等於同時在所有mysql上建立了連線賬號)
mysql > create user 'rw'@'%' identified with mysql_native_password by 'tqw961110';
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