mysql使用mysql-proxy实现读写分离

一、主从分离的原理

1.简介

对于很多大型网站(pv值百万、千万)来说,在所处理的业务中,其中有70%的业务是查询(select)相关的业务操作(新闻网站,插入一条新闻。查询操作),剩下的则是写(insert、update、delete,只要能对MySQL的数据造成更改的操作都叫写操作)操作。在使用负载均衡集群之后,可以很大程度的提升网站的整体性能,但是最终的数据处理的压力还是会落到MySQL数据库上,所有很有必要使用一些技术来提升MySQL的负载能力。(读写分离)

写专门交给写服务器处理(一般网站来说写是比较少的 读写比 4:1) 那么需要把读的任务分配多台服务器来完成的架构,就叫做读写分离。

2. 实现方式

第一种: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

环境:

  • server1:master主机(172.25.1.1)
  • server2:slave主机(172.25.1.2)
  • server3:mysql-proxy调度机(172.25.1.3)
  • 真机:安装mariadb,用作测试
  • 软件:mysql-proxy ===>   点击下载

1.server3:

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使用mysql-proxy实现读写分离_第1张图片

显示上图红框的内容,即为开启成功

2.server1:

进行数据库授权

mysql> grant all on *.* to 'root'@'%' identified by 'Mysql1994.';

然后进行新建数据库操作,方便测试

三、测试

在server3上安装lsof,其可显示系统打开的文件

yum install lsof -y

在真机上打开第一个客户端

mysql使用mysql-proxy实现读写分离_第2张图片

使用losf命令查看连接

如上图,看上去连接的是mysql-proxy调度机(server3),但其实数据指向时server1

当在真机打开第二个客户端时,使用lsof查看连接

如上图,看上去连接的是mysql-proxy调度机(server3),但其实数据依旧指向时server1

当在真机打开第三个客户端时,使用lsof查看连接

mysql使用mysql-proxy实现读写分离_第3张图片

如上图,此次看上去连接的是mysql-proxy调度机(server3),但其实数据流向实际指向server2,但是server2是slave,不具备读写功能,而此时,我们试着往里面写入数据,如果可以成功写入,则证明是读写分离

1)读取

mysql使用mysql-proxy实现读写分离_第4张图片

2)写入

mysql使用mysql-proxy实现读写分离_第5张图片

在server1查看

mysql使用mysql-proxy实现读写分离_第6张图片

如上图,我们成功的进行了数据的写入操作,说明了我们读取数据是在server2(slave),而写入数据是通过server1(master),所以可以证明实现了读写分离

ok~

你可能感兴趣的:(redhat,linux,企业实践)