mysql-proxy数据库中间件架构

一、mysql-proxy简介

mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server。

它使用mysql协议,任何使用mysql-client的上游无需修改任何代码,即可迁移至mysql-proxy上。

mysql-proxy最基本的用法,就是作为一个请求拦截,请求中转的中间层:

进一步的,mysql-proxy可以分析与修改请求。拦截查询和修改结果,需要通过编写Lua脚本来完成。

mysql-proxy允许用户指定Lua脚本对请求进行拦截,对请求进行分析与修改,它还允许用户指定Lua脚本对服务器的返回结果进行修改,加入一些结果集或者去除一些结果集均可。

所以说,根本上,mysql-proxy是一个官方提供的框架,具备良好的扩展性,可以用来完成:

  • sql拦截与修改
  • 性能分析与监控
  • 读写分离
  • 请求路由
  • ...

这个框架提供了6个hook点,能够让用户能够动态的介入到client与server中的通讯中去。

二、mysql-proxy架构与原理

如“简介”中所述,mysql-proxy向用户提供了6个hook点,让用户实现Lua脚本来完成各种功能,这些hook点是以函数的形式提供的,用户可以实现这些函数,在不同事件、不同操作发生时,做我们期望的事情。

connect_server()

mysql-client向proxy发起连接时,proxy会调用这个函数。用户可以实现该函数,来做一些负载均衡的事情,例如选择将要连向那个mysql-server。假设有多个mysql-server后端,而用户又没有实现这个函数,proxy默认采用轮询(round-robin)策略。

read_handshake()

mysql-server向proxy返回“初始握手信息”时,proxy会调用这个函数。用户可以实现这个函数,来做更多的权限验证工作。

read_auth()

mysql-client向proxy发送认证报文(user_name, password,database)时,proxy会调用这个函数。

read_auth_result()

mysql-server向proxy返回认证结果时,proxy会调用这个函数。

read_query()

认证完成后,mysql-client每次经过proxy向mysql-server发送query报文时,proxy会调用这个函数。用户如果要拦截请求,就可以模拟mysql-server直接返回了,当然用户亦可以实现各种策略,修改请求,路由请求等各种不同的业务逻辑。

read_query_result()

认证完成后,mysql-server每次经过proxy向mysql-client返回query结果时,proxy会调用这个函数。需要注意,如果用户没有显示实现read_query()函数,则read_query_result()函数是不会被调用的。用户可以在此处实现各种合并策略,或者对结果集进行修改。

下图是一个各hook函数的触发架构图,箭头方向表示触发时机:

可以发现,最重要的两个函数其实是read_query()和read_query_result(),各种sql的改写与结果集的改写逻辑,都是在这两个函数中实现的,更细节的query过程如下图:

三、mysql-proxy典型应用

案例一: sql时间统计分析

假设mysql-client提交的原sql为:

  1. XYZ;

proxy可以在read_query()里将其改写为:

  1. SELECT NOW();
  2. XYZ;
  3. SELECT NOW();

这样在返回结果集时,就可以在应用层对sql时间进行记录,以方便统计分析。

案例二:sql性能统计分析

假设mysql-client提交的原sql为:

  1. XYZ;

proxy可以在read_query()里将其改写为:

  1. XYZ;
  2. EXPLAIN XYZ;

这样在返回结果集时,就可以在应用层对sql性能进行记录,以方便统计分析。

需要强调的是,这两个案例,由于proxy在read_query()时对sql进行了改写,故在read_query_result()时,mysql-server其实返回了比原请求更多的信息,proxy一定要将多余的信息去掉,再返回mysql-client。多说一句,可以加入一个唯一ID,来对请求sql和返回结果进行配对。

案例三:读写分离

mysql-proxy启动时,通过参数即可配置后端mysql-server是主server还是read-only,无需修改任何代码:

  1. shell> mysql-proxy \
  2. --proxy-backend-addresses=10.0.1.2:3306 \
  3. --proxy-read-only-backend-addresses=10.0.1.3:3306

注意,这里的两个mysql-server为主从架构。

案例四:性能水平扩展

mysql-proxy启动时,通过参数配置多个后端,即可实现性能的水平扩展,无需修改任何代码:

  1. shell> mysql-proxy \
  2. --proxy-backend-addresses=10.0.1.2:3306 \
  3. --proxy-backend-addresses=10.0.1.3:3306

注意,这里的两个mysql-server为主主架构,如果不做特殊修改,负载均衡策略为round-robin。

四、mysql-proxy其他问题

提问:Lua脚本引入的额外开销有多大?

官网回答:Lua很快,对于大部分应用来说,额外开销很小,原始包(raw packet)开销大概在400微秒左右。

楼主:这,,,我不太相信。

提问:mysql-proxy和mysql-server可以部署在一台机器上么?

官网回答:proxy单独部署也可以,和mysql部署在同一台机器上也可以。相比mysql而言,proxy不怎么占CPU和内存,其性能损耗可以忽略不计。

楼主:这,,,性能损耗可以忽略,这我也不太信。

提问:proxy可以处理SSL连接么?proxy不会获取和保存我的明文密码吧?

官网回答:作为中间人,不能处理加密信息。不会获取密码,也获取不到。mysql协议不允许密码以明文传输,传输的都是加密后的密文。

提问:在Lua脚本里可以使用LuaSocket,连缓存,连其他服务么?

官网回答:理论上可以。但是,大哥,你确定要这样做么,强烈不建议这样。

时间: 2024-08-03 05:43:46

mysql-proxy数据库中间件架构的相关文章

Mysql实现数据库主从复制、主主复制、半同步复制

--------------Mysql实现数据库主从复制架构---------------- 一.环境准备: centos系统服务器2台.一台用户做Mysql主服务器,一台用于做Mysql从服务器,配置好yum源.防火墙关闭.各节点时钟服务同步.各节点之间可以通过主机名互相通信 192.168.41.145   master 192.168.41.137  slave 二.准备步骤: 1.iptables -F && setenforce 清空防火墙策略,关闭selinux 2.①vim

分布式MySQL数据库TDSQL架构分析

摘要:腾讯计费平台部为了解决基于内存的NoSQL解决方式HOLD平台在应对多种业务接入时的不足.结合团队在MySQL领域多年应用和优化经验,终于在MySQL存储引擎基础上,打造一套分布式SQL系统TDSQL.本文是对该系统架构分析. 腾讯计费平台部托管着公司90%以上的虚拟账户.如QB.Q点.包月服务.游戏的二级账户等,为了保证能顺畅支撑公司各大业务的实时在线交易.而且在各种灾难场景下数据是一致而且可用的,对系统的可用性.一致性切换要求很高,因此计费团队历来都很重视高一致性存储系统的建设. 到眼

mysql数据库中间件研究

随着互联网的发展,数据量的不断增大. 单台实例已经远远无法满足业务的需要. 对数据库分库分表的需求不断的增加随之而来的就是数据库中间件的开发. 一. 单台实例主要面临下面几个问题: 1.  数据量太大单台机器无法承载 2.  数据查询效率太低,单表数据达到一定的量业务性能就无法满足 3.  数据库优化上的瓶颈 4. 数据安全的问题,大量数据放置在一台机器如果数据出问题回复周期会特别长,对业务影响太大. 随之而来的就是需要分库分表 但是分库分表就四个字做起来可真没有这么简单. 二. 分库分表面临的

MySQL 数据库主从复制架构

前文<MySQL 数据库事务与复制>分析了 MySQL 复制过程中如何保证 binlog 和事务数据之间的一致性,本文进一步分析引入从库后需要保证主从的数据一致性需要考虑哪些方面. 原生复制架构 MySQL 的原生复制架构原理如上图所示.从库的 I/O Thread 线程负责不断读取主库的 binlog 日志文件并写入本地的 Relay log 临时缓存.从库的 SQL Thread 线程则不断读取 Relay log 重放事件入库.整个过程看起来是比较简单清晰的,但其中有几个点对主从数据一致

Mysql主从数据库架构的复制原理及配置详解

1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收

项目实战7—Mysql实现企业级数据库主从复制架构实战

Mysql实现企业级数据库主从复制架构实战 环境背景:公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公司业务中断,损失100万,老王做出深刻反省,公司也因此对于数据库的性能和可靠性提出更高要求. 要求对数据库进行改造,使其承载力进行提升,故障修复时间减少,有没有能实现的方案呢? Mysql实现数据库主从复制实战架构及其原理 1.实验架构及其原理 数据库高可用架构分为 主从:一主一从,一主多从,一主从

Mysql实现企业级数据库主从复制架构实战

Mysql实现企业级数据库主从复制架构实战

Jmeter测试mysql数据库中间件mycat

背景 因为博主所负责测试的项目需要数据库有较大的吞吐量,在最近进行了升级,更新了一个数据库中间件 - - mycat.查询了一些资料,了解到这是阿里的一个开源项目,基于mysql,是针对磁盘的读与写,理论上读写速度上会略小于mysql. 与组长沟通后,决定在功能测试完成后,对升级后的mycat进行性能压测. 环境准备 1.下载Jmeter 可以访问下面的地址进行下载,建议下载zip版本的,因为zip是一个绿色版本,无需安装,解压后即可使用, Jmeter下载地址 2.下载mysql数据库的驱动包

使用mysql proxy对数据库进行读写分离

服务器安排如下: 192.168.100.128 主 192.168.100.129 从 192.168.100.130 mysql-proxy 1.在100.130中下载安装mysql-proxy tar -zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz cp mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy 2.配置环境变量 LUA_PATH="/usr/local/m