MySQL5.5读写分离之mysql-proxy
通常一个网站在初期访问量都比较小,所以一般的小架构足以支撑。但是,当网站逐渐发展起来后,随之而来的是大量的访问,这时候最先出现的瓶颈就是数据库了。因为数据的写入读取操作(I/O)是集群中响应速度最慢的,所以在集群建设时就要规划好后端存储架构。
后端存储数据库架构普遍是主从复制,这样解决了数据备份问题。但是,由前端来的读写请求都要经过主库,量小没问题,当量大到超过主库的性能极限时,主库分分钟会宕机。
为了避免主库宕机这种灾难性事件的发生,读写分离的设计诞生了!把写的请求只交给主库,读的请求由主库和从库一起分摊,这样就大大减轻了主库的负担。
大部分公司会由开发部门在软件层面实现对数据库的读写分离,其次可以选择读写分离的中间件如:TDDL、amoeba、cobar、MySQL-proxy、Atlas、MyCat。
本次测试采用MySQL官方发布的MySQL-proxy。
官网下载地址(二进制包):https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
测试环境:
[root@SQL-M ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@SQL-M ~]# uname -r
2.6.32-642.el6.x86_64
MySQL-proxy IP:192.168.0.86
MySQL-master IP:192.168.0.88
MySQL-slave IP:192.168.0.90
前提:MySQL主库与从库已经实现主从复制。
实现主从复制请参考我的前一篇博文:http://yuyicong.blog.51cto.com/11274530/1919158
接下来的操作在proxy服务器上:
[root@SQL-proxy ~]# cd /usr/local/src/
[root@SQL-proxy src]# wget https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@SQL-proxy src]# ll -h
total 12M
-rw-r--r-- 1 root root 12M Aug 19 2014 mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@SQL-proxy src]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
[root@SQL-proxy src]# cd ..
[root@SQL-proxy local]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy-0.8.5
[root@SQL-proxy local]# ll -d mysql-proxy-0.8.5
drwxr-xr-x 8 7161 wheel 4096 Aug 19 2014 mysql-proxy-0.8.5 # 看到所属用户和组有问题
[root@SQL-proxy local]# chown -R root:root mysql-proxy-0.8.5/ # 改为root
[root@SQL-proxy local]# ln -s mysql-proxy-0.8.5/ mysql-proxy # 必备软连接
[root@SQL-proxy local]# cd mysql-proxy
[root@SQL-proxy mysql-proxy]# mkdir etc # 创建 lua 脚本存放目录
[root@SQL-proxy mysql-proxy]# mkdir logs # 创建日志目录
把实现读写分离的 lua 脚本复制到 etc 目录下
[root@SQL-proxy mysql-proxy]# cp share/doc/mysql-proxy/rw-splitting.lua etc/
[root@SQL-proxy mysql-proxy]# cp share/doc/mysql-proxy/admin-sql.lua etc/
创建启动参数文件,启动服务时命令行就不用老长老长的。
[root@SQL-proxy ~]# vim /etc/mysql-proxy.cnf
启动服务
[root@SQL-proxy ~]# /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
2017-04-24 16:40:19: (critical) mysql-proxy-cli.c:326: loading config from '/etc/mysql-proxy.cnf' failed: permissions of /etc/mysql-proxy.cnf aren't secure (0660 or stricter required)
2017-04-24 16:40:19: (message) Initiating shutdown, requested from mysql-proxy-cli.c:328
2017-04-24 16:40:19: (message) shutting down normally, exit code is: 1
!!看到无法启动,文件权限要改,因为文件里面有账号密码。
[root@SQL-proxy ~]# chmod 660 /etc/mysql-proxy.cnf # 改权限
[root@SQL-proxy ~]# ll /etc/mysql-proxy.cnf
-rw-rw---- 1 root root 432 Apr 24 16:31 /etc/mysql-proxy.cnf
[root@SQL-proxy ~]# /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf # 重新启动
[root@SQL-proxy ~]# netstat -lntup # 查看服务
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.0.86:3306 0.0.0.0:* LISTEN 3086/mysql-proxy
老是命令行敲一长串命令肯定不科学了,直接上服务管理脚本。
[root@SQL-proxy ~]# chmod +x /etc/init.d/mysql-proxy # 给执行权限
[root@SQL-proxy ~]# chkconfig mysql-proxy on # 可以加入开机启动
测试一下脚本:
以上MySQL-proxy服务器搭建完成,但是用于连接后端数据库的用户:proxy还需要在数据库端创建
数据库Master端:创建proxy用户,给增删改查权限
Slave端:此时已经与主库一致拥有了proxy用户,但是从库只能读(select),所以要对proxy回收权限。
测试读写分离
为了方便测试,修改 rw-splitting.lua 脚本里触发读写分离参数
数据库Master端
Slave端
模拟远程连接MySQL-proxy服务器进行读写操作
恢复 slave IO 线程
再次模拟远程连接MySQL-proxy服务器查 master 表
以上MySQL-proxy读写分离完成。
存在的问题:
当模拟前端连接MySQL-proxy服务器并进行数据库操作时,MySQL-proxy服务器端屏幕有信息输出,不知道为什么?
信息如下:
[root@SQL-proxy ~]# server default db: proxy
client default db: school
syncronizing
server default db: proxy
client default db: school
syncronizing
server default db: school
client default db: proxy
syncronizing
https://blog.51cto.com/yuyicong/1919799