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