Mysql系统架构

Mysql的系统架构可以简单的分成两个层次

(1)sql Layer

(2)Storage Engine Layer

对于Mysql我们知道他支持多种存储引擎,常见的哟MyISAM,InnoDB等等

我们来简单看一下Sql Layer中都有那些模块,先简单的介绍一下各个模块,再通过一个流程图来简单说明一下mysql系统架构下各个模块是如何协同工作的

1.初始化模块
buffer,cache,系统变量
 
2.核心api
数据结构,特殊算法,str处理,数字处理,文件I/O,格式化输出,MEM cntl
 
3.网络交互模块
底层网络交互模块抽象出网络底层数据的发送和接收所需要的api,被其他模块调用
 
4.Client&Server交互协议模块
客户端与Mysql所特有的信息交互协议,建立在os和网络协议上。
 
5.用户模块,访问控制模块
mysql的大门,用户登录连接权限控制,用户授权管理
mysql,根据用户授权模块用户的权限信息,控制用户对数据的访问。
共同组成mysql的权限管理,实现安全访问
 
6.连接管理,连接线程,线程管理
监听Mysql Server的各种请求,将接受到的连接请求转发到线程管理模块。每一个连接到mysql server的客户端请求都会被分配一个连接线程为其单独服务。连接线程负责mysql与客户端的同学,接受客户端的命令请求,传递server端的结果,线程管理维护这些连接线程,包括线程的创建,线程的缓存。
 
7.query解析和query转发
对发来的query执行语法分析和语义分析,对query进行分类,根据query的类型,转发到不同的处理模块
 
8.query Cache模块
cache Select类结果
 
9.query优化
 
10.表变更管理模块
负责DML和DDL,数据操作语言,数据定义语言
update ,delete ,insert ,create table,alter table等
 
11.表维护模块
 表状态检测,查错
 
12.系统状态管理
常用show status命令
 
13.表管理器
主要工作维护 *.frm这些表定义文件,区别于表维护模块
 
14.日志记录
erro log,slow query log,binary log
 
15.复制模块
 
16.存储引擎接口模块
mysql支持引擎的可拔插,这样根据不同的需要,我们就可以选用不同的存储引擎
下面附图
我们来根据这个图简单描述一下各个模块式如何配合工作的。
      首先mysql启动,初始化模块初始化各种buffeer,各种cache,读取系统的环境变量,命令参数,完成系统的初始化。与此同时应用的存储引擎启动。到此为止,系统初始化完成,这时候转交给连接管理模块,连接管理模块启动网络监听。现在Mysql启动完成。
      当连接管理模块接受到连接请求的时候,将连接请求全部转发给连接线程模块。连接线程模块首先从线程池中看有没有空闲的线程,有的话取出一个和客户端发来的请求连接上,如果没有就建立一条新线程来响应。当然在有连接请求发来的时候,并不会直接就分配线程去响应,需要用户模块进行权限检查,如果授权通过,则才能进行线程的连接。
      在连接上了以后,客户端发来的请求分为两种,一种是Command,一种是Query。对于Command直接执行即可,对于Query就显得复杂的多。
连接的成功的过程是,客户端请求和连接线程互通协议,OK以后,连接线程就开始处理各种客户端发来的命令或query。对于query,首先由query解析器分析query。首先判断query是否是一个SELECT类的query,如果是,则先查询缓存模块,查询该条query对于的query cache(也就是他的查询结果)是否存在,如果存在,直接取cache返回,如果不存在,则由query解析器继续处理query,将他转发给查询优化器,通过特定的算法,进行优化。如果是DML或者DDL语句(CRUD等操作)则交给表变更管理模块,如果是统计,检测修复,整理类的query,,则将交给表维护模块去处理,如果是复制相关的操作,则交给复制模块,如果是请求状态的query,则交给状态模块。
     对于DML或DDL语句的处理,表变更处理器将根据query的具体内容,分别交给insert处理单元,update处理单元,delete处理单元,create处理单元。
     各模块受到命令解析器模块分发过来的请求之后,首先通过访问控制模块验证权限,是否可以访问某数据库,某表,某字段,是否可以进行crud的操作等等,如果用户拥有这个权限,则请求对应的表,并进行对应的加锁操作。
     请求到对应的表之后,表管理模块首先先查table cahe,如果已经打开则直接进行锁相关处理,否则必须打开表文件获取锁,然后将打开的表交给表变更管理模块。
     表变更管理模块获取打开的表之后,就会更具表的meta信息,判断存储引擎,通过存储引擎借口调用指定的存储引擎进行处理。
 
上面就是各模块协调工作的基本过程,整个过程以来与核心的api模块。
 
 
 
 
 
 
 
 
 
posted @ 2013-03-01 10:46  RichardHu  阅读(303)  评论(0编辑  收藏  举报