对于很多大型网站(pv值百万、千万)来说,在所处理的业务中,其中有70%的业务是查询(select)相关的业务操作(新闻网站,插入一条新闻。查询操作),剩下的则是写(insert、update、delete,只要能对MySQL的数据造成更改的操作都叫写操作)操作。在使用负载均衡集群之后,可以很大程度的提升网站的整体性能,但是最终的数据处理的压力还是会落到MySQL数据库上,所有很有必要使用一些技术来提升MySQL的负载能力。(读写分离)
写专门交给写服务器处理(一般网站来说写是比较少的 读写比 4:1) 那么需要把读的任务分配多台服务器来完成的架构,就叫做读写分离。
第一种:php程序上自己做逻辑判断,写php代码的时候,自己在程序上做逻辑判读写匹配。select、insert、update、delete做正则匹配,根据结果选择写服务器(主服务器)。如果是select操作则选择读服务器(从服务器器) mysql_connect('读写的区分')
第二种:MySQL- Proxy是实现"读写分离(Read/Write Splitting)"的一个软件(MySQL官方提供 ,也叫中间件),基本的原理是让主数据库处理写操作(insert、update、delete),而从数据库处理查询操作(select)。而数据库的一致性则通过主从复制来实现。所以说主从复制是读写分离的基础。
注意:MySQL-proxy它能实现读写语句的区分主要依靠的是内部一个lua脚本(能实现读写语句的判断)。
注意:如果只在主服务器(写服务器)上完成数据的写操作话;这个时候从服务器上没有执行写操作,是没有数据的。这个时候需要使用另外一个技术来实现主从服务器的数据一致性,这个技术叫做 主从复制技术。所以说主从复制是读写分离的基础。
在进行下面操作之前一定要配置好主从复制(gtid模式的主从复制),如何配置主从复制,详情查看下面的文章
https://blog.csdn.net/weixin_40543283/article/details/87911286
环境:
1)这里我使用lftp的方式将mysql-proxy的包下载到了server3,首先进行解压
tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
cd /usr/local/mysql-proxy/
mkdir conf logs ##新建存放设置和日志的文件夹
2)配置环境变量
vim ~/.bash_profile ##修改第10行为
PATH=$PATH:$HOME/bin:/usr/local/mysql-proxy/bin
source ~/.bash_profile ##立即生效
3)然后修改mysql-proxy设置
vim /usr/local/mysql-proxyconf/mysql-proxy.conf ##内容如下
[mysql-proxy]
user=root //运行mysql-proxy进程的用户
proxy-address=0.0.0.0:3306 //监听本机所有地址的3306端口
proxy-backend-addresses=172.25.1.1:3306 //backend主 注意addresses
proxy-read-only-backend-addresses=172.25.1.2:3306 //backend从
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua//lua脚本地址
log-file=/usr/local/mysql-proxy/logs/mysql-proxy //proxy日志路径
log-level=debug //日志级别
daemon=true //打入后台
keepalive=true //在mysql-proxy崩溃时尝试重启
提升权限
chmod 660 conf/mysql-proxy.conf
4)修改lua脚本设置
38 if not proxy.global.config.rwsplit then
39 proxy.global.config.rwsplit = {
40 min_idle_connections = 1,
41 max_idle_connections = 2, ##最大链接两个, 超过则会读写分离
42 is_debug = false
43 }
修改了两个参数,最小连接数和最大连接数,修改后,mysql-proxy的调度机制就变成了,如果连接的客户端,超过两台,就会执行读写分离策略
5)然后启动mysql-server
cd /usr/local/mysql-proxy
mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
显示上图红框的内容,即为开启成功
进行数据库授权
mysql> grant all on *.* to 'root'@'%' identified by 'Mysql1994.';
然后进行新建数据库操作,方便测试
在server3上安装lsof,其可显示系统打开的文件
yum install lsof -y
在真机上打开第一个客户端
使用losf命令查看连接
如上图,看上去连接的是mysql-proxy调度机(server3),但其实数据指向时server1
当在真机打开第二个客户端时,使用lsof查看连接
如上图,看上去连接的是mysql-proxy调度机(server3),但其实数据依旧指向时server1
当在真机打开第三个客户端时,使用lsof查看连接
如上图,此次看上去连接的是mysql-proxy调度机(server3),但其实数据流向实际指向server2,但是server2是slave,不具备读写功能,而此时,我们试着往里面写入数据,如果可以成功写入,则证明是读写分离的
1)读取
2)写入
在server1查看
如上图,我们成功的进行了数据的写入操作,说明了我们读取数据是在server2(slave),而写入数据是通过server1(master),所以可以证明实现了读写分离