MySQL架构1.逻辑模块组成总的来说,MySQL可以看做是一个两层架构,第一层通常称为SQL层,在MySQL数据库系统中的所有处理底层数据之前的工作都在这一层完成,包括权限判断、sql分析、执行计划优化、querycache处理等;第二层是存储引擎层,我们通常称之为存储引擎层,是由多个存储引擎组成的底层数据访问操作的实现部分。因此,MySQL的基本结构可以用下面这个最简单的结构示意图来表示,如图2-1所示:虽然从上图看MySQL的结构很简单,其实就是简单的两个部分,但实际上每一层都包含了很多自己的小模块,尤其是第一层的SQLLayer,结构比较复杂。下面分别对SQL层和存储引擎层做一个简单的分析。SQL层包含多个子模块,下面我将一一简单介绍一下:1、初始化模块,顾名思义,就是在MySQLServer启动时,对整个系统进行各种初始化操作,比如Initializationof各种缓冲区和缓存结构及内存空间的申请,各种系统变量的初始化设置,各种存储引擎的初始化设置等。2.核心API核心API模块主要是提供一些非常高效的底层操作函数的优化实现,包括各种底层数据结构的实现,特殊算法的实现,字符串处理,数字处理等,还有小文件I/O,格式化输出,最重要的内存管理。所有核心API模块的源码都集中在mysys和strings文件夹下,有兴趣的读者可以研究一下。3.网络交互模块底层网络交互模块抽象出底层网络交互使用的接口api,实现底层网络数据的收发,方便其他模块的调用和这部分的维护。所有源代码都在vio文件夹下。4、Client&Server交互协议模块任何一个C/S结构的软件系统都必须有自己独特的信息交换协议,MySQL也不例外。MySQL的Client&Server交互协议模块部分实现了客户端与MySQL交互过程中的所有协议。当然,这些协议都是基于现有的操作系??统和网络协议,例如TCP/IP和UnixSocket。5.用户模块用户模块实现的功能主要包括用户登录连接权限控制和用户权限管理。他就像是MySQL的看门人,决定是否对来访者“开门”。6、门禁模块让访客进门后可以为所欲为?为了安全起见,不能这么随便。这时门禁模块就需要实时监控客人的一举一动,对不同的客人给予不同的权限。访问控制模块实现的功能是根据用户模块中每个用户的授权信息和数据库本身特有的各种约束来控制用户对数据的访问。用户模块和访问控制模块的组合构成了整个MySQL数据库系统的权限安全管理功能。7、连接管理、连接线程和线程管理连接管理模块负责监听对MySQLServer的各种请求,接收连接请求,并将所有连接请求转发给线程管理模块。每个连接到MySQL服务器的客户端请求都将被分配(或创建)一个连接线程用于其单独的服务。连接线程的主要工作是负责MySQLServer与客户端的通信,接受来自客户端的命令请求,传递来自服务器的结果信息等。线程管理模块负责管理和维护这些连接线程。包括线程创建、线程缓存等。8.查询解析转发模块在MySQL中,我们习惯将客户端发送给服务器的所有命令都称为查询。在MySQLServer中,连接线程收到客户端的query后,会直接将query传递给负责的各种query分类,转发给相应的处理模块。该模块是查询解析转发模块。它的主要工作是对查询语句进行语义和语法分析,然后根据不同的操作类型进行分类,然后进行有针对性的转发。9.QueryCache模块QueryCache模块是MySQL中非常重要的一个模块。它的主要作用是将客户端向MySQL提交的Select类查询请求的返回结果集缓存到内存中,用查询的哈希值来做。一对应。Query取数据的基表发生任何数据变化后,MySQL会自动使该query的Cache失效。在读写比非常高的应用系统中,QueryCache可以显着提升性能。当然,它的内存消耗也是非常大的。10、查询优化器模块查询优化器,顾名思义,就是对客户端请求的查询进行优化。它根据客户端请求的查询语句和数据库中的一些统计信息,在一系列算法的基础上进行分析,得到一个***的策略,告诉后续程序如何获取这条查询语句的结果。11、表变更管理模块表变更管理模块主要负责完成一些DML和DDL查询,如update、delte、insert、createtable、a??ltertable等语句。12.表维护模块表状态检查、错误修复、优化分析都是表维护模块需要做的事情。13、系统状态管理模块系统状态管理模块负责在客户端请求系统状态时,向用户返回各种状态数据,如DBA常用的各种showstatus命令,showvariables命令等,得到的结果都是通过模块返回的this获得。14、表管理器模块从名字上很容易和上面的表修改和维护模块混淆,但是它的功能和修改和维护模块是完全不同的。大家知道,每一个MySQL表都有一个表定义文件,即*.frm文件。表管理器的主要工作就是维护这些文件和一个缓存,缓存的主要内容是每个表的结构信息。此外,它还维护表级别的锁管理。15.日志记录模块日志记录模块主要负责整个系统层面逻辑层的日志记录,包括错误日志、二进制日志、慢查询日志等16.复制模块复制模块可以分为两部分,主模块和从模块。Master模块主要负责在Replication环境中读取Master端的二进制日志,并与Slave端的I/O线程进行交互。Slave模块比Master模块做的多一点,主要体现在系统中的两个线程上。一个是I/O线程,负责向Master请求和接收二进制日志,并写入本地中继日志。另一个负责从中继日志中读取相关的日志事件,然后解析成在Slave端可以正确执行并得到与Master端完全一样的结果的命令,然后交给SQL线程进行处理奴隶执行。17、存储引擎接口模块存储引擎接口模块可以说是MySQL数据库中最具特色的一点。在众多的数据库产品中,基本上只有MySQL能够实现其底层数据存储引擎的插件化管理。这个模块其实只是一个抽象类,但也正是因为它成功抽象了各种数据处理,才成就了今天MySQL可插拔存储引擎的特性。2.各模块的工作了解了MySQL的各个模块之后,我们来看看MySQL的各个模块是如何协同工作的。接下来我们分析整个过程,启动MySQL,连接客户端,请求查询,获取返回结果,最后退出。当我们执行启动MySQL的命令时,MySQL初始化模块从系统配置文件中读取系统参数和命令行参数,并根据参数对整个系统进行初始化,比如申请和分配缓冲区,初始化全局变量,以及各种结构等。同时,各个存储引擎也被启动,进行自己的初始化工作。整个系统初始化完成后,由连接管理模块接管。连接管理模块会启动处理客户端连接请求的监听器,包括tcp/ip网络监听和unixsocket。至此,MySQLServer基本启动完毕,准备接受客户端请求。当连接管理模块监听到来自客户端的连接请求时(借助于网络交互模块的相关功能),双方通过Client&Server交互协议模块定义的协议“问候”几句后,连接管理模块将连接请求转发给线程管理模块,请求连接线程。线程管理模块会立即将控制权交给连接线程模块,并告诉连接线程模块:现在我这边有连接请求,需要建立连接,请尽快处理。连接线程模块收到连接请求后,会先检查当前连接线程池中是否有缓存的空闲连接线程。如果有,它会取出一个并连接到客户端请求。如果没有空闲的连接线程,它会创建一个。一个新的连接线程与客户端请求连接。当然,连接线程模块在收到连接请求后并不会立即拿出一个连接线程与客户端连接,而是先调用用户模块进行授权校验。只有在客户端请求通过授权检查后,才会将客户端请求连接到负责该请求的连接线程。在MySQL中,客户端请求分为两种:一种是query,需要调用Parser执行,即Query解析转发模块的解析;另一种是command,不需要调用Parserrequest就可以直接执行。如果在我们的初始配置中开启了FullQueryLogging功能,Query解析转发模块会调用日志模块将请求记录到日志中。无论是Query类型的请求还是命令类型的请求,都会被记录到日志中。所以出于性能考虑,一般很少开启FullQueryLogging功能。当客户端请求与连接线程“交换码(互通协议)”连接后,连接线程开始处理客户端请求发送的各种命令(或查询),并接受相关请求。它将接收到的查询语句传递给查询解析转发模块。Query解析器首先对Query进行基本的语义和语法解析,然后根据不同的命令类型,有的会直接处理,有的会分发给其他模块处理。如果是Query类型的请求,控制权会交给Query解析器。Query解析器首先分析是否是select类型的query,如果是,则调用querycache模块检查query是否已经存在于querycache中。如果是,则直接将缓存中的数据返回给连接线程模块,再通过连接客户端的线程将数据传给客户端。如果不是可以缓存的查询类型,或者缓存中没有该查询的数据,则将该查询返回给查询解析器进行相应的处理,再通过查询分发给相关的处理模块分销商。如果解析器解析出来的结果是一个没有被缓存的select语句,控制权就会交给Optimizer,也就是Query优化器模块。如果是DML或DDL语句,则交给表变更管理模块处理。如果是一些更新统计信息,检测,修复,排序查询会交给表维护模块处理,复制相关的查询会交给复制模块做相应的处理,状态查询的查询会交给表维护模块处理到状态收集和报告模块。实际上,表更改管理模块根据相应的处理请求,由插入处理器、删除处理器、更新处理器、创建处理器、更改处理器等小模块负责不同的DML和DDL。各模块收到Query解析分发模块分发的请求后,首先会通过访问控制模块检查连接的用户是否有访问目标表和目标字段的权限。如果有,就会调用表管理模块请求对应的表。并获取相应的锁。表管理模块会先检查该表是否已经存在于表缓存中。如果已经打开,则直接进行锁相关的处理。如果不在缓存中,则需要打开表文件获取锁,然后将打开的表交给表变更管理模块。表变更管理模块“获取”到打开的表后,会根据表的相关元信息判断表的存储引擎类型等相关信息。根据表的存储引擎类型,向存储引擎接口模块提交请求,调用相应的存储引擎实现模块,进行相应的处理。但是,对于表变更管理模块来说,只有存储引擎接口模块提供的一系列“标准”接口是可见的,底层存储引擎实现模块的具体实现对表变更管理模块是透明的。他只需要调用相应的接口并指定表类型,接口模块就会根据表类型调用正确的存储引擎进行相应的处理。当查询或命令处理完成(成功或失败)时,控制权将返回到连接线程模块。如果处理成功,处理结果(可能是一个Result集,也可能是成功或失败的标识)会通过连接线程反馈给客户端。如果在处理过程中出现错误,也会向客户端发送相应的错误信息,然后连接线程模块会进行相应的清理工作,并继续等待后续的请求,重复上述过程,或者完成客户端断开连接请求。如果在上述过程中,相关模块更改了数据库中的数据,而MySQL开启了binlog功能,相应的处理模块也会调用日志处理模块,将相应的更改语句以更新的形式记录到相关参数中指定二进制日志文件中的事件。在上述各个模块的处理过程中,各自的核心计算处理功能都会高度依赖于整个MySQL核心API模块,比如内存管理、文件I/O、数字和字符串处理等。了解了整个处理流程后,我们可以画出以上模块的关系图,如图2-2所示:下面是官方文档中的一张图:Oracle架构介绍-基础知识在学习oracle的过程中,架构是最重要的是,掌握得越深越好。实际工作中遇到棘手的问题,其实都可以归结到架构上来解释,那么我们就按照下图来理解一下oracle的架构吧。1.Summarize方便我们根据图来记忆。该图由三部分组成。左边的UserProcess、ServerProcess、PGA可以看作是客户端,上层实例(Instance)和下层数据库(Database)以及参数文件(parameterfile)、密码文件(passwordfile)和归档日志文件(archivedlogfiles)构成了OracleServer,所以整个图可以理解为C/S架构。OracleServer由两个实体组成:实例(instance)和数据库(database)。这两个实体是独立的,但联系在一起。在数据库创建过程中,先创建实例,然后才创建数据库。在典型的单实例环境中,一个实例和一个数据库是一对一的关系,一个实例连接一个数据库,一个实例和一个数据库也可以是多对一的关系,即,不同计算机上的多个实例打开一个共享磁盘系统。一个公共数据库。这种多对一关系称为真正应用集群(RAC)。RAC极大地提高了数据库的性能、容错性和可扩展性(可能会消耗更多的存储空间),是oracle网格(grid)概念的重要组成部分。2、client端在client端的作用就是如何从client端创建一个server进程来与数据库进行交互。2.1用户进程当用户运行一个应用程序并与一个Oracle数据库进程(例如:sql/plus)进行交互时,oracle创建一个用户进程来运行该用户的应用程序。2.2服务器进程ServerProcess用于处理连接到实例的用户进程(UserProcess)提交的请求。当应用程序与Oracle服务器运行在同一台机器上时,一些用户进程(UserProcess)可以与ServerProcess合并为同一个进程,即使系统开销有所减少。从逻辑上讲,用户进程必须通过一个ServerProcess与Oracle进行通信。(只是有时某些UserProcess和ServerProcess在同一台机器上时会合并。)2.3PGAPGA(ProgramGlobalArea)程序全局区是Oracle服务器进程为当前用户会话分配的一块内存区域用户进程连接到数据库并创建会话。这个区域是私人的。为每个用户连接Oracle数据库预留的内存在进程创建时分配,进程结束后释放。它只能被一个进程使用。参数:PGA_AGGREGATE_TARGET指定PGA可选文件的总大小。3.1数据文件内容:1)用户数据:用户表,可调整DML语句;2)数据字典数据:数据字典表记录DB结构,只读不可修改,DDL语句调整3)真实文件功能:读取数据特点:1)至少包含一个SYSTEM表空间和DDL语言2)各种表空间数据字典信息3)我的数据存放在表空间中,具体表现为多个数据文件的形式。3.2控制文件内容:1)DB基本信息:DBID2)DB结构信息3)上次同步的SCN信息3.1)同步:将内存区databasebuffercache中的脏数据写入磁盘3.2)SCN:(系统变更号)、时间轴、生命线4)当前日志序号5)RMAN备份信息功能:1)记录数据库的基本信息2)记录内存中的一些信息特征:1)大小一般不变(固定部分,可变部分)2)3.3Redologfiles内容:按时间顺序记录DB中的变化(redoentry条目),数据块变化时会产生redo。功能:提供数据可恢复性特点:1)大小不同2)顺序写入3)容量有限,循环覆盖4)至少两组日志,日志成员冗余5)提供恢复手段3.4参数文件内容:1)记录那些自定义的DB参数2)参数默认值3)pfile:需要重启实例和spfile功能:定义数据库实例的属性特点:两类参数的特点3.5密码文件内容:密码theprivilegeduser功能:用于特权用户登录的认证特点:1)操作系统,密码以认证方式登录数据库2)以超高或特权身份登录数据库实例启动数据库,跳过数据字典的校验3)O7:Oracle7版本,允许普通身份登录3.6Archivedlogfiles内容:redolog(重做日志)history功能:1)Savelogsforlongtimeforrecovery2)保证redologs不丢失特点:1)Number=当前lognumber-12)Size<=onlinelogfilesize3)Naming需要唯一:序号,RAC节点号4)离线文件可以通过操作系统命令进行管理4.Instance实例由存储结构和进程组成,只暂时存在于RAM和CPU中。4.1SGA内存结构包括两部分1)SystemGlobal(SGA):在实例启动时分配,是Oracle实例的基本组成部分。2)ProgramGlobal(PGA):在服务器进程生成时分配。4.1.1SharedPool用于存储:1)最近执行的SQL语句2)最近使用的数据定义由两个性能相关的部分组成:1)库缓存2)数据字典缓存大小由参数SHARED_POOL_SIZE决定4.1.1.1库Cache1.1)存储最近使用的SQL和PL/SQL语句的信息(软解析,缓存一次和多次)1.2)共享常用语句1.3)管理时遵循LRU规则1.4)包括两部分1.4.1)SharedSQLarea1.4.2)SharedPL/SQLarea1.5)大小由SharedPool的大小决定4.1.1.2DataDictionaryCache2.1)最近使用的定义存储在数据库中2.2)包括数据文件,表,indexes,columns,Users,permissions,andotherdatabaseobjects2.3)在分析阶段,服务器进程查找数据字典,验证对象的名称以及是否合法访问2.4)对于查询和DML语句,如果数据字典信息tion在缓存中可以提高响应时间2.5)大小由SharedPool的大小决定4.1.2DatabaseBufferCache1)存储从数据文件中获取的数据块的图像2)获取时可以大大提高性能和更新数据3)管理上遵循LRU规则4)参数DB_BLOCK_SIZE其块大小5)包括以下独立子缓存:DB_CACHE_SIZEDB_KEEP_CACHE_SIZEDB_RECYCLE_CACHE_SIZE6)可以动态调整大小4.1.3RedoLogBuffer1)记录所有数据库块变化2)主要目的是为了恢复3)大小由参数LOG_BUFFER决定(不可动态调整)决定4.1.4LargePool1)是系统全局区的可选部分2)用于:2.1)RMAN备份和恢复操作2.2)I/0parallelprocesses2.3)sharedserversessionmemory(UGA)3)大小由参数LARGE_POOL_SIZE决定4)大小可以动态改变4.1.5JavaPool1)Javaco分析mands2)如果要安装使用Java3)大小由参数JAVA_POOL_SIZE决定,如果粒度为4M,默认为24M,粒度为16M,默认大小为32M4.1.6StreamsPoolStream-相关数据存储在流池中,提高缓存效果。目前oracle相对弱化,利用OracleGoldenGate(OGG)完善高级复制功能。4.2进程结构Oracle有以下进程:1)用户进程:用户连接数据时产生2)服务器进程:连接Oracle实例,用户建立会话时产生3)后台进程:Oracle实例启动时产生4)维护物理和内存的连接4.1)必要的后台进程:DBWn,PMON,CKPT,LGWR,SMON4.2)可选的后台进程:ARCn,CJQn,Jnnn,RECO,MMAN,MMON,Snnn,Dnnn,Pnnn4.2.1PMONPMON(进程监控进程):1)清除失败进程1.1)回滚事务1.2)释放锁1.3)释放其他资源1.4)重启死掉的dispatcher1.5)动态注册监听器4.2.2SMONSMON(系统检测进程)功能:1)实例恢复:1.1)前滚所有重做日志的变化1.2)打开数据库供用户访问1.3)回滚未提交的事务2)释放临时表空间(deallocated)4.2.3DBWRDBWn(数据库写进程)写条件tions:1)发生检查点2)脏缓存达到限制(1/4已满)3)没有空闲缓存4)发生超时5)RACping请求(8i)6)表空间离线7)表空间是只读的8)热备表空间开始动作9)表被删除或截断到1M4)每三秒5)DBWn进程写入前4.2.5CKPTCKPT(检查点进程)作用:1)向DBWn发出信号2)更新数据文件header3)更新控制文件4.2.6ARCnARCn(archiveprocess):1)可选的后台进程2)启用归档时自动归档重做日志文件执照。PostgreSQL数据库是一个免费的开源对象关系数据库,几乎可以在各种平台上运行。它是一种基于关系数据库和SQL的数据库,扩展了抽象数据类型,因而具有面向对象的特点。PostgreSQL数据库由五部分组成:连接管理系统(系统控制器)、编译执行系统、存储管理系统、事务系统和系统表。组成及关系如图2-3所示。图PostgreSQL架构连接管理系统接受外部对系统的操作请求,对操作请求进行预处理和分发,起到系统逻辑控制的作用;编译执行系统由查询编译器和查询执行器组成,完成对数据库中的操作请求的解析、处理和转换,最终实现对物理存储介质中数据的操作;存储管理系统由索引管理器、内存管理器和外存管理器组成,负责存储和管理物理数据,为编译和查询系统提供支持;transactions系统由事务管理器、日志管理器、并发控制、锁管理器组成。日志管理器和事务管理器完成对操作请求处理的事务一致性支持,锁管理器和并发控制为并发访问数据提供一致性。支持;系统表是PostgreSQL数据库的元数据管理中心,包括数据库对象信息和数据库管理控制信息。系统表管理元数据信息,将PostgreSQL数据库的各个模块有机地联系起来,形成一个高效的数据管理系统[1]。
