mysql通过mysql-proxy实现读写分离

实验环境

此实验基于半同步复制
前面做了主从复制,
#注意: 如果server3之前做过mysql(要将server3上的mysql停掉)
systemctl stop mysqld #mysql-proxy使用的也是3306端口(会和mysql冲突)

mysql读写分离的应用场景

主库可以写,从库只能读,
主库不能同步从库的数据,
所以如果在从库上写的话数据就乱了,
我们需要让客户知道哪个是写(主库),哪个是读(从库)
我们肯定不能让用户知道我们的IP,
我们需要一个中间件,这个中间件知道去那里写去哪里读,
就想我们之前做反向代理额haproxy和nginx,
这个代理知道哪个是读哪个是写,
我们要给主从复制来一个读写分离,
所以要让server3一个proxy

实现mysql读写分离的软件很多,有Mycat,Amoeba,mysql-proxy
Mycat,Amoeba这两个软件了解一下,面试可能会问
自己也可以学习一下

关闭mysql-proxy:

killall -9 mysql-proxy (killall命令需要安装psmisc.x86_64 0:22.20-11.el7)
yum whatprovides */killall
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

安装mysql读写分离使用的包

tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
在这里插入图片描述
cd /usr/local/mysql-proxy/bin
./mysql-proxy --help
在这里插入图片描述
在这里插入图片描述

配置mysql-proxy

在/user/local/mysql-proxy中手动加一个目录

[mysql-proxy]
proxy-address=0.0.0.0:3306     #proxy的地址就是本机,全0表示本机,全1是广播地址

proxy-backend-addresses=172.25.21.1:3306    #后端mysql写的主机
proxy-read-only-backend-addresses=172.25.21.2:3306   #mysql的从服务器
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
#lua脚本
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid    #定义PID文件位置
plugins=proxy      #插件是proxy
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log   #定义日志文件位置
log-level=debug     #日志级别是调试
keepalive=true    #一直可用 
daemon=true      

在这里插入图片描述

建立log日志

我们要自己去建立log日志的目录(本身是没有这个目录的)

mkdir /usr/local/mysql-proxy/log

查看一下lua脚本并且修改

find / -name rw-splitting.lua

在这里插入图片描述

然后我们进到这个目录下,改一下这个lua脚本中的一些配置
为了更方便我们测试,我们将最小连接数改为1,将最大连接数改为2

min_idle_connections = 1,
max_idle_connections = 2,

#连接数在1和2之间时启动读写分离(包含1,2)
在这里插入图片描述

给减小mysql-proxy.conf权限,启动 mysql-proxy

然后这时启动mysql-proxy
权限太大,所以mysql-proxy启动报错

/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf 

在这里插入图片描述

我们给mysql-proxy.conf文件减小权限

chmod 600 /usr/local/mysql-proxy/conf/mysql-proxy.conf

然后再次启动mysql-proxy
在这里插入图片描述

检查mysql-proxy日志看节点是否添加成功

然后我们查看mysql-proxy的日志
cat /usr/local/mysql-proxy/log/mysql-proxy.log
检查我们的节点有没有加进来

在这里插入图片描述

可以看到我们的主从mysql都加进到proxy中了
在这里插入图片描述

授权用户进行测试

这时在server1上授权一个新的用户来进行读写
grant insert,update,select on . to kuankuan@’%’ identified by ‘Westos.789’;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后我们去真机上去访问,
真机没有安装mysql,如果没有,我们真机就安装mariadb
然后连接server3
在这里插入图片描述

使用真机查看server3,我们可以使用lsof服务,

在这里插入图片描述

yum whatprovides */lsof

在这里插入图片描述
在这里插入图片描述

yum install -y lsof-4.87-4.el7.x86_64

在这里插入图片描述
lsof命令可以监控端口
lsof -i:3306
在这里插入图片描述

可以看到proxy把请求转到server1上去了
我们在打开一个shell窗口,使用真机继续访问:
我们一共打开了三个真机窗口
使用相同的命令访问代理
只要看到server2出现,就说明我们的mysql已经开启读写分离了
说明kuankuan这个用户使用mysql时是读写分离的

在这里插入图片描述

我们使用第一个连接server1的窗口:
在这里插入图片描述

发现我们可以进行读和写操作
在server1:
在这里插入图片描述

在server2:
在这里插入图片描述

因为我们做了主从复制,所以这里会将数据复制过来
然后我们在server2上直接关掉slave
Server2:
在这里插入图片描述

再在真机的第一个窗口插入一个数据(命令会等待一会儿,因为我们之前做了半同步复制)
提示我们提交成功,但是该表里没有我们新加的数据:
在这里插入图片描述

然后我们在server1:
在这里插入图片描述

关闭从库的slave功能

Server2:
在这里插入图片描述

这就证明我们写是写在server1上的写,
我们在真机上可以写,但是我们读不到,

打开从库的slave功能

如果我们打开server的slave后,我们就又可以继续读了,
Server2:
在这里插入图片描述

真机:
在这里插入图片描述

我们访问的是代理,代理实现了读写分离,
mysql-proxy的端口也是3306,所以代理上不能开mysql
代理上不提供任何数据库服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值