mysql可以在服务器中识别出一下模块:
- 服务器初始化模块
服务器初始化模块负责在启动时完成服务器初始化,大部分代码可在文件sql/mysqld.cc中找到。
- 连接管理器
连接管理器侦听来自客户端的连接,然后将请求派发给线程管理器。该模块实际上只是sql/mysqld.cc中的一个函数:handl_connections_sockets()。不过,由于在服务器运行中发挥了重要作用,值得将它归类为独立的模块。大量的#ifdef指令会再把网络代码移植到不同操作系统中时带来困难。
随着时间的推移,代码逐渐演变,开始能实现不同操作系统的网络系统调用的功能。人们不断尝试进行新的移植,而不同操作系统供应商将新特性引入产品的新版本中,未来可能有必要进行新的修改。
- 线程管理器
线程管理器负责跟踪线程,确保分配线程,以处理来自客户端的连接。
- 连接线程
连接线程是在一个已建立的连接上处理客户端请求的工作核心
- 用户验证模块
用户验证模块验证所连接的用户,并对包含改用户层权限信息的结构和变量进行初始化。
- 访问控制模块
访问控制模块检验客户端用户是否具有足够的权限来执行所有请求的操作。
- 解析器
解析器负责解析查询并生成解析树。
- 命令调度器
命令调度器负责将请求转发给知道如何处理这些请求的较低层次模块。
- 查询高速缓存模块
查询高速缓存模块高速缓存查询结果,并在可能的时候通过提交高速缓存结果尝试短路查询的执行。
- 优化器
优化器负责创建回答查询的最佳策略,并执行该策略,向客户端提交结果。它可能是MySQL代码中最复杂的模块。
- 表管理器
表管理器负责创建,读取和修改表定义文件、维护表描述高速缓存,以及管理表锁。
- 表修改模块
表修改模块负责诸如创建、删除、重名名、移除、更行或插入之类的操作
- 表维护模块
表维护模块负责表维护操作,诸如检查、修理、备份、恢复、优化及解析
- 状态报告模块
状态报告模块负责回答关于服务配置设置、性能追踪变量、表结构信息、复制进度、表高速缓存状况等的回答。改模块处理以SHOW开始查询。
- 抽象存储引擎接口(表处理器)
本模块实际上是一个名为handler的抽象类和一个名为handlerton的结构。
- 存储引擎实现(myISAM,InnoDB,MEMORY,Berkeley DB)
每个存储引擎都通过扩展情面提过的handler类提供了一个操作标准接口。派生类的方法定义了特定存储引擎低层次调用方法的标准接口操作。
- 日志记录模块
日志记录模块负责维护较高层次的日志。一个存储引擎可能会为了本身的目的而额外维护自己的低层次日志,但日志记录模块却与此无关,存储引擎自己会负责完成。这里的逻辑日志包括二进制更新日志、命令日志以及缓慢查询日志
- 主复制服务器模块
主复制服务器模块负责事项主服务器上的复制功能。该模块最常用的功能就是根据请求不断向服务器发送复制日志事件
- 从复制服务器模块
从复制服务器模块负责实现从服务器的复制功能。从服务器的任务是从主服务器处检索跟新,并将这些更新应用再从服务器上。
- 客户端/服务器协议API
MySQL客户端/服务器通信协议为协议栈中的操作系统协议(TCP/IP或本地套接字)之首。这一模块实现在整个服务器中使用的API、以创建、读取、解释和发送协议包。
- 低层次网络I/O API
低层次网络I/O API提供了低层次网络I/O和SSL会话的抽象。代码在vio/目录下。本模块中的所有函数名称均以vio_开头
- 核心API
核心API是MySQL的瑞士军刀。它提供了用于可移植的文件I/O、内存管理、字符串操作、文件系统导航、格式化打印、丰富的数据结构和算法集,以及大量其他功能。只要出现问题,核心API模块中总有办法解决;如果没有现成的办法,则可以通过编程解决。
核心模块间的交互:
当通过命令行启动服务器时,初始化模块接过控制权。它解析配置文件和命令参数、分配全局存储缓冲区,加载访问控制表,以及执行大量其他初始化任务。一旦完成初始化任务,初始化模块就将控制权交给连接管理器,连接管理器开始侦听来自回路的客户端的连接。
当客户端连接到数据库服务器时,连接管理器执行大量低层次网络协议任务,然后将控制权传递给线程管理器,线程管理器随后提供一个线程,用于处理连接线程。连接线程既可以重新创建,也可以从线程高速缓存中提取并被调用。一旦连接线程得到控制权,它首先调用用户验证模块,连接用户的证书经过验证后,客户端这时则可以发出请求。
连接线程将请求数据传递给命令调度器。某些请求(在MySQL代码术语中称为“命令”)可以直接被命令调度器接纳,而一些更复杂的请求则被转发给其他模块。一个典型的命令可以请求服务器运行查询、更改主动数据库、报告状态、发送复制更新的连续转储、关闭连接或执行一个其他操作。
MySQL服务器术语中有两种类型的客户端请求:查询和命令。查询是必须通过解析器的请求,而命令则是无需调用解析器即可执行的请求。我们将在MySQL内核结构的上下文中使用查询这个术语,即不仅select在我们的术语中可以成为查询,DELETE或者INSERT也可以称为查询。我们所说的查询有时被称为SQL语句
如果启用了全查询日志记录,命令调度器将在调度前要求日志模块将查询或者命令记录在纯文本日志中。因此,在全日志记录配置中,所有的查询都将被记录,即使是由于语法错误而绝不会执行并立即返回一个错误的查询也不例外
命令调度器通过查询高速缓存模块将查询发送给解析器。查询高速缓存模块检查查询是否是可高速缓存的类型,同时检查是否存在一个仍然有效的,以前计算得出的高速缓存结果。如果找到,则在该点执行短路、高速缓存结果被返回给用户,连接线程接受控制权,这是准备处理另一个命令。如果查询高速缓存模块报告没有找到目标,则查询被发送给解析器,由解析器根据查询类型决定如果传送控制权。
它们将从以上位置继续操作可以识别的模块分别是:优化器、表修改模块、表维护模块、复制模块及状态报告模块。选择查询被发送给优化器;更新、插入、删除以及表创建和表纲要变更的查询发送给相应的表修改模块;检查、维修、更新键统计或整理表(碎片)的查询发送给表维护模块;与复制有关的查询发送给复制模块;状态请求发送给状态报告模块。同时还有大量表修改模块:删除模块、创建模块、更新模块、插入模块及更改模块。
这时,每个将收到来自解析器的控制(权)的模块都将参与查询的表列表传递给访问控制模块,传递成功后在传递给表管理器,表管理器打开各个表,取出所需要的锁。这时表操作模块准备继续执行其特定任务,将向抽象存储引擎模块发出大量请求,要求执行各种低层次操作,如插入或者更行记录、根据键值检查记录,或执行表层次上的操作,如果修复表或更新索引统计。
抽象存储引擎模块将通过对象多态自动地将调用转换为特定存储引擎模块的相应方法。换句话说,在处理存储引擎对象的时候,调用端会认为自己在处理一个抽象的对象,而实际上该对象属于某种特定类型,即与给定表类型相对应的存储引擎对象。接口方法为虚拟方法,它产生了透明的效果调用端不需要了解存储引擎对象的确切对象类型,就能调用正确的方法。
在处理查询或者命令的时候,相应的模块可能会将已经得出的部分结果集发送给客户端,也可能发送警告或出错信息。如果发送了出错信息,客户端和服务器都会理解为查询或者命令已失败,并会采取相应的措施。客户端将不再接受给定查询的任何结果集、警告或者出错信息数据,而且在发出出错信息后,服务器失踪将控制权传送给连接线程。请注意,出于实现的稳定性和可移植的考虑,MySQL也不例外,因此在出现故障时,要检查所有层次上的调用,并同时适当的转移控制。
如果低层次模块以某种方法修改了数据,并且启用了二进制更新日志,则模块将负责要求日志记录模块把更新事件记录到二进制更新日志中,有时人们将其称为复制日志,当MySQL开发人员和高级用户则称其为binlog。
一旦任务完成,执行流程就返回连接连接线程,改线程将执行必要的清空,并等待来自客户端的下一个查询或命令。回话会继续进行,直到客户端发出Quit命令。
除了与常规客户端交互,服务器可能还要收取来自从复制服务器的命令,不断读取其二进制更新日志。这类命令将有主复制服务器模块处理。
如果将服务器配置为从服务器 ,则初始化模块将调用从服务器模块,改模块随后启动两个线程,即SQL线程和I/O线程。它们负责将主服务器上发生的更新传送到从服务器上。同一台服务器即可以配置为主服务器,也可以配置为从服务器。
与客户端的网络通信通过客户端/服务器协议模块进行,改模块负责以合适的格式打包数据,然后根据连接设置进行压缩。接下来客户端/服务器协议模块使用低层次网络I/O模块,该模块负责跨平台可移植方式在套接字层上发送和接受数据。如果选项设置恰当,该模块还可以使用OpenSSL库调用,负责对数据加密。
在执行各自任务的时候,服务器的核心组件极度依赖核心API。核心API提供了丰富的功能集,包括文件I/O,内存管理,字符串操作,各种数据结构和算法的实现以及许多其他有用的功能。MySQL开发人员最好避免直接调用libc, 而要使用核心API来实现调用,这有利于以后移植到新的系统平台及代码优化。