Mysql server的系统架构

来源:互联网 发布:java如何开发网站 编辑:程序博客网 时间:2024/06/13 02:10

出处:《mysql性能优化》

1、  mysql server的逻辑模块组成

总的来说,mysql可以看成二层架构,第一层通常叫做SQL Layer,在MYSQL数据库系统处理底层数据之前的所有工作都在这一层完成,包括权限判断、sql解析、执行计划优化、query cache的处理等;第二层就是存储引擎层,通常叫做storage engine Layer,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。

MySql的架构示意图:


2、  SQL Layer的各模块介绍

1)      初始化模块

在MySql Server启动的时候对系统所做的初始化工作,包括各种buffer、cache的初始化和内存空间的申请,各种系统变量的初始化设定,各种存储引擎的初始化设置等。

2)      核心API

提供非常高效的底层优化实现,包括底层数据结构的实现、特殊算法的实现、字符串处理、数字处理等、小文件i/o,格式化输出,以及最重要的文件管理部分。

核心API的所有源代码都集中在mysys和strings文件夹下。

3)      网络交互模块

抽象出底层网络交互所使用的所有API,实现底层网络数据的接收与发送,以便其他各个模块调用及对这一块的维护。

源码在vio文件夹下。

4)      Client&Server交互协议模块

实现了客户端与mysql交互的所有协议,这些协议都是建立在现有的os和网络协议之上,如TCP/IP以及UNIX Socket

5)      用户模块

包括用户的登录连接权限控制和用户的授权管理。

6)      访问控制模块

根据用户模块中各用户获得的授权信息,以及数据库自身特有的各种约束,控制用户对数据的访问

用户模块和访问控制模块两者结合起来,构成了MySql整个数据库系统的权限安全管理的功能。

7)      连接管理、连接线程、线程管理

连接管理负责监听对Mysql server的各种请求,接收连接请求,转发所有连接请求到线程管理模块,每一个连接上Mysql server的客户端请求都会被分配(或创建)一个连接线程为其单独服务。

连接线程负责Mysql server与客户端的通信,接受客户端的命令请求,传递server端的结果信息等。

线程管理模块负责管理维护这些连接线程,包括线程的创建、线程的cache等。

8)      Query解析和转发模块

Mysql中习惯将所有Client端发给server端的命令都称为query,在mysql server里面,连接线程接收到客户端的一个query后,会直接将该query传递给query解析和转发模块,主要工作就是将query语句进行语义和语法的解析,然后按照不同的操作类型进行分类,然后做出针对性的转发。

9)      QueryCache模块

将客户端提交给Mysql的select类query请求的返回结果集cache到内存中,与该query的一个hash值做一个对应。该Query所取数据的基表发生任何数据的变化之后,mysql会自动使该query的cache失效。在读写比例非常高的应用系统中,query cache对性能的提高非常显著,对内存的消耗也非常大。

10)  Query优化器模块

根据客户端请求的query和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个query语句的结果。

11)  表变更管理模块

负责完成一些DML和DDL的query,如:update,delete,insert,create table,alter table等

12)  表维护模块

表的状态检查、错误修复、以及优化和分析

13)  系统状态管理模块

在客户端请求系统状态时将各种状态数据返回给用户,如:show status,show variables等

14)  表管理器

维护表的定义文件(*.frm)以及cache(各个表的结构信息),table级别的锁管理

15)  日志记录模块

系统级别的逻辑层的日志的记录,包括:error log,binary log,slow query log等

16)  复制模块

分为Master模块和Slave模块,

Master模块主要负责Replication环境中读取Master端的binary日志,以及与slave端的I/O线程交互等工作

Slave模块主要体现在两个线程上,一个是负责从Master请求和接受binary日志,并写入本地relay log中的I/O线程;另一个是负责从relay log中读取相关日志事件,然后解析成可以在slave端正确执行并得到和Master端完全相同的结果的命令再交给slave执行的SQL线程

17)  存储引擎接口模块

3、  各模块之间协同工作

初始化:执行启动Mysql命令之后,mysql的初始化模块从系统配置文件中读取系统参数和命令行参数,并按照参数初始化整个系统,如:申请并分配buffer,初始化全局变量,以及各种结构等。同时各个存储引擎也被启动,并进行各自的初始化工作。

当整个系统初始化结束后,有连接管理模块接手。

连接管理模块:启动处理客户端连接请求的监听程序,包括tcp/ip的网络监听,unix的socket。

当连接管理模块监听到客户端的连接请求(借助网络交互模块的相关功能),双方通过Client&Server交互协议模块所定义的协议寒暄之后,连接管理模块会将连接请求装法给线程管理模块,去请求一个连接线程。

线程管理模块:马上将控制交给连接线程模块,告诉连接线程模块,我这边有连接请求,需要建立连接。

连接线程模块:接到连接请求后,首先检查当前连接池中是否有被cache的空闲连接线程,如果有,就取出一个和客户端请求连接上,如果没有空闲的连接线程,则建立一个新的连接线程与客户端连接,中间需要用户模块进行授权检查,客户端请求通过授权检查后,才会将客户端请求与负责请求的连接线程连上。

客户端请求:mysql中客户端分两种:query和command。query需要调用Parser也就是Query解析和转发模块的解析才能够执行的请求;command不需要调用Parser就可以执行的请求。

如果打开Full Query Logging,以上两种都会记录日志,出于性能的考虑,一般不打开Full Query Logging。

Query解析器:query类型的请求,将控制权交给query解析器,首先分析是不是一个select类型的query:

如果是select类型的query,则调用查询缓存模块,让它检查该query在querycache中是否存在,如果有,则直接将cache中的数据返回给连接线程模块,然后通过客户端的连接的线程将数据传输给客户端。如果不是一个可以被cache的query类型,或者cache中没有该query的数据,那么将被继续传回query解析器,解析器将控制权交给Optimizer,即query优化器;如果是DML或者是DDL语句,交给变更管理模块;如果是一些更新统计信息、检测、修复和整理类的query则会交给表维护模块去处理,复制相关的query则转交给复制模块去进行相应的处理;请求状态的query则转交给状态收集报告模块。

当一条query或command处理完(成功或失败)之后,控制权都会交还给连接线程模块

以上各个模块处理过程中,各自的核心运算处理功能部分都会高度依赖整个Mysql的核心API模块,比如:内存管理、I/O、数字和字符串处理。

mysql server模块之间协同工作图:



0 0
原创粉丝点击