暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

高质量的MySQL服务

IT那活儿 2021-03-16
2194

一、何谓高质量的MySQL服务

伴随互联网的高速发展,对业务系统的能力要求也越来越高,做为底层提供数据服务的MySQL数据库更是如此;基本的MySQL集群模式虽提供了高可用、高并发的服务能力,但突然的高并发,或流量并没被业务架构层层过滤,最终过载的流量流向数据库,这时MySQL的服务能力就会降低,甚至雪崩。

高质量的MySQL服务就是时时提供高可用、高效、高稳定的能力,杜绝雪崩产生。

二、服务高质量实现

本文采用限流、超时SQL拦截的手段来保证MySQL服务的高质量,但MySQL数据库本身或现有集群模式并没提供这种能力。因此需设计一个数据库中间件来提供这种能力,事前杜绝这些隐患,保证后端MySQL服务的高质量。下图为数据库中间件产品的主要功用模块,简单说明以下几个:

1)SQL解析器:对客户端发来的sql语句进行解析处理,以便进行sql的路由操作。

2)SQL拦截器:对耗时超过阀值的SQL进行拦截,直接返回错误,不再路由至后端MySQL数据库。

3)SQL路由器:对解析后的sql语句,依据读写分隔、分片配置信息,转发至相应后端MySQL节点。

4)限流器:限制后端MySQL节点的QPS能力,降低突增流量带来的影响。

    2.1 限流

限流的方式有很多种,以下为目前常见的限流方式:

  • 通过限制单位时间段内调用量来限流

  • 通过限制系统的并发调用程度来限流

  • 使用漏桶(Leaky Bucket)算法来进行限流

  • 使用令牌桶(Token Bucket)算法来进行限流

    令牌桶算法

本产品采用令牌桶算法进行业务的限流,下面简单介绍下令牌桶算法

1)以固定频率往桶中添加令牌,如果桶满,则丢弃

2)请求到来时,从桶中取N个令牌

3)如果桶中现有令牌数>=N,则执行请求,并销毁N个令牌

4)如果桶中现有令牌数<N,则请求直接返回或等待

    程序实现逻辑

首先程序实现一个令牌桶算法模块,以MySQL最大QPS为频率向桶中添加令牌,以后每个数据库请求都需访问该模块,以判读该请求是否可以执行。

1)初始化N个令牌桶

后端有多少MySQL节点,则初始化多少个令牌桶,并与节点绑定。以相应节点最大QPS为频率,即1/QPS秒向桶中添加一个令牌

2)令牌请求

客户端请求的SQL经过解析后,由SQL路由器转发至某一个后端MySQL节点时,请求相应令牌桶中的令牌,请求满足,则执行相应SQL

3)令牌不足

如果请求不满足,则把SQL放入相应节点队列中等待,直到有令牌满足或队列满时直接返回错误。

    2.2 超时SQL拦截

超时SQL拦截的意思是,耗时的SQL语句直接返回错误,不再路由转发至后端节点;当某类sql运行时长超过阀值,并达到一定次数后,记录下该类sql的id,下次再有这类sql请求时,中间件直接拦截并返回错误。

程序实现这种逻辑的方法有很多种,比如使用map结构,以sql的id做为key,或者以数组方式记录下超时sql的id,但这类方式占用内存较高,并且效率很低;再比如使用redis数据库,以sql_id做为key来缓存这些数据,虽说redis效率比较高,但每次sql请求都要访问一次,总体来说效率还是比较低的。

本产品以降低内存使用、提高效率为目的,采用的是位图算法。

    位图算法(bitmap)

在一个结构中,用一个比特位来描述一个数据的状态,这种结构就称为位图。位图实际上是哈希表的一种变形,它的主要使用场景为:

  • 大数据滤重

  • 大数据查询、定位

  • 大数据排序

它的主要优点为:

  • 节省内存

  • 位操作,效率更快

程序实现逻辑

程序实现一个位图模块,主要有设置(set)、查询(get)、清除(clear)sqlid等方法。

1)初始化位图模块

初始化一个容量为2^20的byte数组为bitmap,占用内存128K,可记录百万类SQL

2)SQL请求过滤

每个SQL请求到来时,生成该类sql的数字标识符id,用该id与bitmap进行位与运算,如果为0,则执行sql,否则直接返回。

3)SQL请求超时

如果sql运行时长超过阀值,并达到固定次数后,用该sqlid 与bitmap进行位或运算,以达到在bitmap中记录的目录。

4)超时SQL入库

超时sql异步入库,以达到后期优化处理的目的。

 三、 总  结 

本文以限流、超时SQL拦截两个手段来达到提高MySQL服务质量的目的。限流是为了拦截突增流量,保证Mysql服务的稳定;超时SQL拦截是为了提高MySQL服务效率,减低MySQL服务器资源使用率。

END

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论