本文将以MySQL5.7为例结合企业版本为大家介绍MySQL数据库服务器架构。当然数据库架构里面的内容比较多,这里主要是对一些核心插件做一些介绍。
本文将以MySQL5.7为例结合企业版本为大家介绍MySQL数据库服务器架构。当然数据库架构里面的内容比较多,这里主要是对一些核心插件做一些介绍。
整体架构如下图所示:
我们的这篇文章就基于上图进行展开讨论。如上图所示,黄色区块代表的是社区版和企业版都有的功能,而红色区块表示的是只有企业版里才有的功能,椭圆和圆柱体表示的是该功能是插件形态,而方形(圆角方形)表示的是其他一些功能 。该图的版本基础MySQL5.7.20制作,其中包含了防火墙和审计功能等一些企业版新特性的介绍。
如上图所示,MySQL服务器最顶端是各种各样的连接器和连接API,用于应用程序能够连接到MySQL。我们常用的mysql client使用的是C语言开发的API,在上图中我们也是可以体现出来。除此之外当然还有很多其他的连接器,这里没有标注出来,如果有兴趣可以参考官方文档即可。
中间那块比较大的深色区域代表的是服务器端,该区域最上层是连接处理器(connection handing),连接处理器有两种方式,第一种是最原始的方式,每个连接创建一个线程,这种方式下当收到请求后会简单的为每个连接创建一个线程,这个也是社区版的连接方式。另一种就是高大上的线程池方式,线程池是企业版里的插件, 这种方式可以通过线程的重用来控制线程的总数,大大减少了重复创建线程的开销,线程池非常适合于数据库大量查询但是单个查询都非常快的场景,使用线程池大大提高数据库查询的扩展性和性能。
据官方数据,在高并发的场景下,使用连接池将有60倍读写性能提升和18倍的只读性能提升。
具体请参阅官方文档章节:https://www.mysql.com/products/enterprise/scalability.html
60x Better Scalability: Read/Write
18x Better Scalability: Read Only
上面介绍了连接处理器,在连接处理器处理完线程之后,会发送到连接控制器插件(也就是权限认证)。在这里会对连接进行权限和密码的验证,如果你多次使用错误密码连接数据库,那么连接控制器就会杀掉这个连接。对连接控制器的插件介绍请参考官方文档章节:https://dev.mysql.com/doc/refman/5.7/en/connection-control-plugin.html
如果权限认证通过,并且你开启了查询缓存,并且是select语句的话,那么将会到达查询缓存(Query Cache,通常被叫做QC),QC对于大部分情况比较鸡肋,并且开销比较大,线上环境不建议开启,该功能在8.0.3及之后版本被官方废除了。
经过QC,然后到达了查询重写插件(Query Rewrite Plugin,简称QR),QR是5.7.6之后添加的一个可选插件,详细介绍请参考官方介绍:https://dev.mysql.com/doc/refman/5.7/en/rewriter-query-rewrite-plugin.htmlDBA根据查询的性能数据报告指定哪些查询开启重写。例如我们可以将SELECT。该功能允许 130 更改为 SELECT * FROM world.City WHERE ID = 130,对于其他的ID也可以使用此规则,那么我们可以在MySQL添加如下规则(使用该规则的前提的查询重写插件已经被正确安装):
INSERT INTO query_rewrite.rewrite_rules (pattern, replacement) VALUES ('SELECT ?', 'SELECT * FROM world.City WHERE ID = ?'); CALL query_rewrite.flush_rewrite_rules();
经过上面的各个环节,实际查询语句将会到达SQL解析器(如果查询在查询缓存中匹配,将不会到这一步)。 在解析器处理了查询之后,数据库将会知道查询哪个表,将有哪些字段,哪些数据被查询,这意味着也可以验证用户是否被允许使用这些对象。
解析器解析SQL之后,如果MySQL Enterprise Firewall已经安装并启用,它将被调用。 防火墙将查询的SQL样本与白名单进行比较,查询是否在白名单中。 如果查询不在白名单中,则可以记录或阻止(取决于配置)。
最后一个插件是MySQL企业审计插件。 在MySQL 5.7.20和更高版本中,除了记录访问之外,审计日志还可以用来阻止对数据库或表的访问。该插件会检查访问是否被允许。
经过上述插件后,SQL到达查询优化器,在优化器会进行SQL的内部优化,例如SQL内部调整重新,成本规则计算,索引选择等等。经过优化器处理之后,最终交给执行器进行SQL执行,并将结果发送给客户端。
登录后可发表评论