利用中间件mysql-proxy实现数据库的读写分离

Mysql读写分离

简介

mysql主从复制,一主多从模型下,为了缓解主服务器的读写压力,经常会让从服务器为用户的读操作,又因为从服务器不能提供写操作。所以:在主服务器上写操作,在从服务器只进行读操作,这种模型就成只为读写分离。
mysql读写分离的意义:
1:减轻mysql主服务器的访问压力
2:提高安全性

读写分离架构

利用中间件mysql-proxy实现数据库的读写分离_第1张图片

    Java web app:是客户端请求,会对数据库发起读写操作请求,具体是发送SQL指令
    Mysql Proxy:对读写操作请求的SQL指令进行路由,使得读写分离
    direct:一个负载分发引擎,对Mysql Proxy分发得读操作,按照一定得算法进行分发至后端得从服务器
    master:主服务器,主要接受用户的写操作,并且负责将二进制日志同步给从服务器
    slave-n:从服务器,主要负责用户的读操作(分担主服务器的读写压力),并且负责重放master的写操作,还能实现容灾能力,保证高可用(如果主服务器挂掉,slave顶上去)

中间件mysql-proxy

要实现数据库的读写分离,我们就需要在客户端与mysql服务端之间使用一个中间件(mysql-proxy),对用户的操作进行分析,对读写操作进行分离,而且由于从服务器(提供读服务)不止一个,又要提供一个负载均衡器来进行连接分发。当然,还可以提供一个memchace服务器来提供缓存服务。这里仅仅是添加了mysql-proxy。
mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server。
它使用mysql协议,任何使用mysql-client的上游无需修改任何代码,即可迁移至mysql-proxy上。
mysql-proxy最基本的用法,就是作为一个请求拦截,请求中转的中间层:
利用中间件mysql-proxy实现数据库的读写分离_第2张图片
进一步的,mysql-proxy可以分析与修改请求。拦截查询和修改结果,需要通过编写Lua脚本来完成。
mysql-proxy允许用户指定Lua脚本对请求进行拦截,对请求进行分析与修改,它还允许用户指定Lua脚本对服务器的返回结果进行修改,加入一些结果集或者去除一些结果集均可。
所以说,根本上,mysql-proxy是一个官方提供的框架,具备良好的扩展性,可以用来完成:
1:sql拦截与修改
2:性能分析与监控
3:读写分离
4:请求路由

Mysql读写分离配置

实验环境

操作系统:rhel6.5
数据库版本:mysql5.7
物理机:172.25.66.250 mysql客户端
server1:172.25.66.1 mysql主从复制master
server2:172.25.66.2 mysql主从复制slave
server3:172.25.66.3 mysql-proxy

搭建主从复制

利用server1与server2配置mysql主从复制,之前的博客有专门介绍过mysql主从复制的搭建,博客连接:mysql主从复制

配置中间件mysql-proxy

在server3中:
1:下载并解压proxy数据包,并将解压后的目录放在/usr/local下
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
利用中间件mysql-proxy实现数据库的读写分离_第3张图片
2:添加环境变量
vim /etc/profile
在最后一行添加:PATH= $PATH:/usr/local/mysql-proxy/bin
保存退出后,执行source /etc/profile 使之生效
在这里插入图片描述
在这里插入图片描述
3:修改lua脚本
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的
vim/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua

if not proxy.global.config.rwsplitthen
  proxy.global.config.rwsplit = {
  min_idle_connections = 1, #默认超过4个连接数时,才开始读写分离,改为1 测试需要
  max_idle_connections = 1, #默认8,改为1测试需要
  is_debug = false
  }
end

利用中间件mysql-proxy实现数据库的读写分离_第4张图片
4:启动mysql-proxy,可以将下面的参数写到mysql-proxy配置文件中,配置文件需要自己在/usr/local/mysql-proxy/conf目录下创建,conf目录也需要自己创建,本次实验我们直接使用命令行启用mysql-proxy
mysql-proxy --proxy-read-only-backend-addresses=172.25.66.2:3306 定义后端slave地址
–proxy-backend-addresses=172.25.66.1:3306 定义后端master地址
–proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua &(打入后台运行)
利用中间件mysql-proxy实现数据库的读写分离_第5张图片
5:查看是否启动成功,mysql-proxy端口号为4040
利用中间件mysql-proxy实现数据库的读写分离_第6张图片

测试Mysql读写分离

1:在Master上,创建一个允许远程登陆访问的管理员帐号
GRANT ALL ON . TO ‘proxy1’@‘172.25.66.%’ IDENTIFIED BY ‘Guodong+0306’;

FLUSH PRIVILEGES;
利用中间件mysql-proxy实现数据库的读写分离_第7张图片
2:在客户端172.25.66.250中通过中间件mysql-proxy远程登录数据库
mysql -uproxy1 -p’Guodong+0306’ -P4040 -h172.25.66.3
因为我们在上面设置过最大连接数超过1才发生读写分离,所以我们开启3个shell登录3次
利用中间件mysql-proxy实现数据库的读写分离_第8张图片
3:在server1与server2中下载lsof
yum install lsof -y
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
在server1中:lsof -i :3306,master只能允许客户端连接两次,两次以上的连接会直接连接到slave上
利用中间件mysql-proxy实现数据库的读写分离_第9张图片
在server2中:lsof -i :3306
利用中间件mysql-proxy实现数据库的读写分离_第10张图片
4:向数据库中写入数据:
利用中间件mysql-proxy实现数据库的读写分离_第11张图片
在master端可以看到数据的话说明写操作是在server1(master)上,在slave端可以看到数据并不能说明写操作是在server2(slave)端,因为server1和server2本来就是主从复制的关系….

你可能感兴趣的:(运维)