一、读写分离简介
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是完全透明的。
从图中可以看到,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
启动报错:
原因:配置文件权限问题,解决方法:文件加上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个便于测试:
3.4、测试读写分离
为了测试读写分离效果需关闭主从复制:node2上执行stop slave;
stop slave;
连接proxy:
插入测试数据:
INSERT INTO `lsq`.`test2` (`id`, `name`)VALUES('8', '8');
在node1上查看,能看到上面插入的数据
node2上查看不到【说明读写分离成功】