Mysql-proxy实现mysql读写分离

Mysql-proxy简介

Mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等。
MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。
对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。

当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。

应用背景:在开发工作中,有时候会遇到某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

IP角色
172.25.60.10Mysql-proxy
172.25.60.11master
172.25.60.12slave

部署前先部署好主从架构,此处略

# 主从都创建proxy用户用于mysql-proxy使用
mysql> grant all on *.* to 'proxy'@'172.25.60.10' identified by '123456';
mysql> FLUSH PRIVILEGES;

部署mysql-proxy服务

1. 下载

一定要下载对应的版本:http://dev.mysql.com/downloads/mysql-proxy/

tar -xvf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
mv mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy

2. 配置mysql-proxy

  • 创建主配置文件
cd /usr/local/mysql-proxy
mkdir lua #创建脚本存放目录
mkdir logs #创建日志目录

cp share/doc/mysql-proxy/rw-splitting.lua ./lua #复制读写分离配置文件
cp share/doc/mysql-proxy/admin-sql.lua ./lua #复制管理脚本
vi /etc/mysql-proxy.conf
[mysql-proxy]
proxy-address=0.0.0.0:3306
proxy-backend-addresses=172.25.60.11:3306
proxy-read-only-backend-addresses=172.25.60.12:3306
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
plugins=proxy
log-level=debug
keepalive=true
daemon=true


参数说明:
[mysql-proxy]
proxy-address=0.0.0.0:3306	#监听本机中所有IP的端口。
proxy-backend-addresses=172.25.60.11:3306	#进行写的数据库server1
proxy-read-only-backend-addresses=172.25.60.12:3306	 #读库
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua  #指定读写分离配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua           #指定管理脚本
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid    #pid文件
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log    #生成日志文件
plugins=proxy    #proxy插件
log-level=debug    #日志等级为debug
keepalive=true     #心跳检测
daemon=true        #守护进程
  • 修改lua脚本实现读写分离
vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
min_idle_connections = 1,     #默认超过4个连接数时,才开始读写分离,改为1
max_idle_connections = 1,     #默认8,改为1

3. 启动mysql-proxy

  • 在启动前我们需要为配置文件加上660权限,没有修改权限,则会报错
chmod 660 /etc/mysql-proxy.conf
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.conf

4. 加入系统服务

cat <<EOF > /etc/systemd/system/mysql-proxy.service
[Unit]
Description=MySQL Proxy Server
After=network.target
 
[Service]
Type=simple
User=mysql-proxy
ExecStart=/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.conf
 
[Install]
WantedBy=multi-user.target
EOF


sudo systemctl daemon-reload
sudo systemctl start mysql-proxy
sudo systemctl enable mysql-proxy

总结

读写分离存在的弊端
因为架构是主从架构,那么久无法保证主备数据库没有延迟,如果有大批量的数据操作的话,那么备库可能出现较大的延迟,那么这时候的读操作就可能出现数据和主库不一致的情况。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

89无处不在oncall

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值