天天看点

MySQL调优(十二)-基于mysql-proxy实现读写分离

一、读写分离简介

MySQL读写分离基本原理是让master数据库处理写操作,slave数据库处理读操作;master将写操作的变更同步到各个slave节点,从而提高系统性能。

MySQL读写分离能提高系统性能的原因在于:

1、物理服务器增加,机器处理能力提升。拿硬件换性能。

2、主从只负责各自的读和写,极大程度缓解X锁和S锁争用。

3、slave可以配置myiasm引擎,提升查询性能以及节约系统开销。

4、master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步。

5、slave可以单独设置一些参数来提升其读的性能。

6、增加冗余,提高可用性。

二、mysql-proxy简介

mysql-proxy是mysql官方提供的中间件产品,它可以实现读写分离、负载平衡、sql拦截与修改等功能;

简单来说mysql-proxy就是一个中间代理层,上游可接受若干个mysql-client,下游可连接若干个mysql-server,并且通过使用lua脚本,可以实现复杂的连接控制和过滤。任何使用mysql-client的上游无需修改任何代码,只需连接到mysql-proxy监听的端口即可对于client来说,MySQL Proxy是完全透明的。

MySQL调优(十二)-基于mysql-proxy实现读写分离

从图中可以看到,client的sql请求并不直接进入到master数据库或者slave数据库,而是进入到 proxy,然后proxy判断这条语句是写的语句(包括insert、update、delete)还是读语句(select),如果是写语句proxy将向master所在的服务器发出写请求,master处理写操作后同步至slave,如果是读语句的时候,proxy将向slave所在的服务器发出请求,slave处理读操作。

三、mysql-proxy读写分离实现

3.1、环境配置

角色 IP 节点名称
master 192.168.101.100 node1
slave 192.168.101.101 node2
proxy 192.168.101.102 node3

3.2、安装mysql-proxy

node3 上安装 mysql-proxy

# 安装 mysql-proxy
cd /usr/local/software
wget https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz -C /usr/local
mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit mysql-proxy

# 配置系统环境变量
export MYSQL_PROXY=/usr/local/mysql-proxy
export PATH=$MYSQL_PROXY/bin:$PATH
source /etc/profile
cd /usr/local/mysql-proxy/conf
vi mysql-proxy.conf
# 添加内容
[mysql-proxy]
user=root
proxy-address=192.168.101.102:4040
proxy-backend-addresses=192.168.101.100:3306
proxy-read-only-backend-addresses=192.168.101.101:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
log-level=debug
daemon=true
# 启动 mysql-proxy
mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
# 查看是否安装成功,打开日志文件
cd /usr/local/mysql-proxy/logs
tail -100 mysql-proxy.log
# 内容如下:表示安装成功
2019-10-11 21:49:41: (debug) max open file-descriptors = 1024
2019-10-11 21:49:41: (message) proxy listening on port 192.168.101.102:4040
2019-10-11 21:49:41: (message) added read/write backend: 192.168.101.100:3306
2019-10-11 21:49:41: (message) added read-only backend: 192.168.101.101:3306
2019-10-11 21:49:41: (debug) now running as user: root (0/0)
           

进行连接:

mysql的命令行会出现无法连接的情况,所以建议使用客户端

yum -y install mysql #如果没有mysql客户端的话执行此步
mysql -uroot -p123456 -h192.168.101.102 --port=4040
           

启动报错:

MySQL调优(十二)-基于mysql-proxy实现读写分离

原因:配置文件权限问题,解决方法:文件加上660权限

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

3.3、修改lua脚本

由于默认超过4个连接才会启动读写分离,需修改lua脚本

vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
           

把原来的4和8改为1和2,改为2个便于测试:

MySQL调优(十二)-基于mysql-proxy实现读写分离

3.4、测试读写分离

为了测试读写分离效果需关闭主从复制:node2上执行stop slave;

MySQL调优(十二)-基于mysql-proxy实现读写分离

连接proxy:

MySQL调优(十二)-基于mysql-proxy实现读写分离

插入测试数据:

在node1上查看,能看到上面插入的数据

MySQL调优(十二)-基于mysql-proxy实现读写分离

node2上查看不到【说明读写分离成功】

MySQL调优(十二)-基于mysql-proxy实现读写分离