一、Oracle(一)Oracle架构OracleServer包括数据库(Database)和实例(Instance)两部分,两者相互独立。数据库由数据文件、控制文件和日志文件组成。实例由内存池和后台进程组成。示意图如下:一台OracleServer可以创建多个Database,不同的Database之间相互独立。每个数据库都有自己的一组相关文件,例如:密码文件、参数文件、数据文件、控制文件和日志文件。数据库由一系列物理文件(如二维表文件)组成。用户不能直接读取数据库中的内容,必须通过Oracle实例来读取。一个Instance只能连接一个Database,但一个Database可以连接多个Instance。各功能组件描述如下:1.用户连接过程用户连接过程是连接用户和OracleInstance的桥梁。包括:用户进程、服务进程和PGA用户进程UserProcess当一个DatabaseUser请求连接到OracleServer时,由OracleServer创建的UserProcess。ServerProcess服务进程用于处理DatabaseUser和OracleServer之间的连接。ProgramglobalareaPGAPGA:由ServerProcess分配,用于当前UserSession的内存区域,不同的用户有不同的PGA。PGA包含了ServerProcess数据和控制信息的内存区域。包括栈空间、SessionInfo、私有SQL区。2、SGA(SystemGlobalArea)SGA与Oracle性能密切相关。Instance启动时分配,关闭时释放。它主要包括以下数据结构:数据库缓冲区缓存(Databasebuffercache)oracle执行SQL语句的区域。在进行数据更新或数据查询时,用户执行的SQL语句不会直接更改磁盘上的数据文件,而是先将数据文件复制到数据库缓冲区缓存中,然后再更改或查询缓存中的副本。此外,频繁访问的数据块将存在于数据库缓冲区缓存中。日志缓冲区(RedologBuffer)用于短期存储重做日志。共享池用于缓存所有经常执行的代码和经常访问的对象定义。共享池中有以下三种数据结构:库缓存(librarycache):存储最近执行的代码数据字典缓存(datadictionarycache):存储最近使用的对象定义PL/SQL缓冲区(PL/SQLbuffer):使用存储过程、函数、打包过程、打包函数、对象类型定义和触发器。一个大池(LargeBuffer)用于共享服务器进程。JAVA池(JavaBuffer):只有当应用程序需要运行数据库中的java存储过程时才需要java池。3.后台进程后台进程主要用于数据库管理,是OracleInstance和OracleDatabase之间的纽带。分为核心进程和非核心进程。1)核心进程:数据库写进程(DBWn)Server进程连接Oracle后,通过数据库写进程(DBWn)将数据缓冲区中“脏缓冲区”的数据块写入数据文件;检查点进程(CKPT)检查点(CKPT)检查点进程主要用于更新数据文件头、更新控制文件和触发DBWn数据库写进程。进程监控进程(PMON)负责在后台进程执行失败时清理数据库缓存和空闲资源。它是Oracle的自动维护机制。系统监控进程(SMON)的作用是:当数据库实例崩溃时,用于数据库实例的自动恢复。清除过时排序临时段,回收整理,合并空闲空间,释放临时段,维护闪回时间点。重做日志文件和日志写入过程用于记录数据库的变化和数据库变化前的原始状态。当满足以下条件时,LGWR被激活:commitlogbufferexceeds1/3everythreesecondsandeveryDBWnexecutionBefore2)非核心进程归档进程(ARCn)是一个可选的后台进程。当数据库处于ArchiveLog模式时,自动归档重做日志,保存数据库的所有修改记录。SGA(SystemGlobalArea)和后台进程组成Instance。4.存储结构存储结构可以从物理结构和逻辑结构两个方面来理解。1)物理结构数据库物理结构:是操作系统中数据库中文件的集合,即:磁盘上的物理文件,主要由数据文件、控制文件、重做日志文件、归档日志文件、参数文件组成和密码文件。数据文件、重做日志文件、控制文件、跟踪文件和警告文件都属于数据库文件数据文件数据文件是数据存储仓库,使用时将数据调入内存。重做日志文件重做日志文件包含对数据库所做更改的记录,当Oracle发生故障时可以恢复数据。控制文件控制文件包含维护和验证数据库完整性的必要信息。例如,控制文件用于标识数据文件和重做日志文件,而一个数据库至少需要一个控制文件。跟踪文件(TraceFiles)每个运行在实例中的后台进程都有一个与之相连的跟踪文件(tracefile)。Trace文件记录后台进程遇到的重大事件的信息。警报日志(AlertLog)是一个特殊的跟踪文件,每个数据库都有一个跟踪文件,同步记录数据库的消息和错误。参数文件、密码文件和存档文件是非数据库文件。ParameterFile实例参数文件,当oracle实例启动时,SGA结构会根据参数文件设置内存,后台进程也会随之启动。PasswordFile用户通过提交用户名/密码建立会话,Oracle根据存储在数据字典中的用户定义验证用户名和密码。存档文件是重做日志文件的脱机副本,可能是从介质故障中恢复所必需的。2)逻辑结构表空间是用来存储数据库对象的逻辑空间,是信息存储的最大逻辑单元,是一系列数据文件的集合。一个数据库可以包含多个表空间,每个表空间又包含多个段。段:是一个对象在数据库中占用的空间。段是区域的集合:一次为数据保留的大的存储空间,块是块的集合:ORACLE最基本的存储单元,在创建数据库时指定,映射到磁盘块。3)逻辑空间到物理空间的映射(2)OracleRDBMS运行过程1.用户在访问OracleServer前提交一个请求(包括db_name、password、instance_name、username等信息);2、OracleServer收到请求,通过密码文件验证后,分配SGA内存池,启动后台进程,同时创建并启动实例;3、实例启动后,UserProcess和ServerProcess建立Connect;4、Server进程与OracleInstance建立Session,然后接收用户请求,执行相关操作;(三)编写SQL语句的执行过程1、用户执行SQL语句,Server进程收到SQL语句后将SQL语句发送给Instance,然后将SQL语句加载到数据库缓冲区中。2.ServerProcess通知OracleDatabase将与SQL语句相关的数据块的副本加载到缓冲区中。3、执行数据库缓冲区中的SQL语句,修改数据文件的副本,形成“脏缓冲区”4、CKPT检查“脏缓冲区”,调用DBWn数据库写进程,5、运行DBWn之前,先运行LGWR,将数据文件的原始状态和数据库的变化记录到RedoLogFiles6。运行DBWn,将“脏缓冲区内容写入数据文件”7.同时,CKPT修改控制文件和数据文件header8。SMON回收不必要的Idle资源9.返回结果给用户(4)Oracle的高可用架构1.OracleRAC(RealApplicationClusters)RAC是Oracle数据库的集群解决方案,包括计算层和存储层。如下图所示:1)存储层——共享存储OracleRAC的核心是共享磁盘子系统。集群中的所有节点必须能够访问所有数据文件、重做日志文件、控制文件和参数文件。因此,这些文件必须存储在共享存储中。常用的共享存储方式有OCFS、OCFS2、RAW、NFS、ASM等,说明如下:OCFS(OracleClusterFileSystem)和OCFS2都是文件系统,和NFS一样,提供文件系统进行共享存储在集群环境中。RAW裸设备也是一种存储方式。将sharedstorage映射到RAWDevice,Oracle存储数据时,选择RAWdevicestorage。但相对于文件系统,RAW不直观,不易管理,数量有限,已被OCFS取代。ASM是一种数据库存储解决方案,而不是集群解决方案。使用ASM时,需要使用OCFS/OCFS2或RAW。2)计算层计算层至少需要两台服务器,每台服务器上安装集群软件和OracleRAC组件。从逻辑结构上看,每个节点都有一个独立的实例,这些实例访问同一个数据库。节点间通过集群软件的通信层进行通信,利用缓存合并技术实现集群内各节点缓存的高速同步,使集群内各实例保留相同的数据库缓存。从而最小化磁盘I/O。因此,RAC具有以下特点:每个节点实例都有自己的SGA;每个节点实例都有自己的后台进程,每个节点的强度都有自己的重做日志,每个节点实例都有自己的undo表空间中的所有节点共享一份datafiles和controlfiles2,DataGuard在DataGuard环境中,有至少有两个数据库,一个主数据库(PrimaryDatabase)处于Open状态,另一个备用数据库(StandbyDatabase)处于Standby状态。备库分为物理库和逻辑库。物理库与主库完全相同。REDO应用用于与主库保持数据一致性,支持只读服务;逻辑库通过SQL应用程序执行与主库相同的SQL语句,以维护同一个主库中的数据一致,因此文件的物理结构(甚至数据的逻辑结构)可以与主图书馆。逻辑库支持读写服务。DataGuard适用于多机房解决方案。实际部署时,主库部署在主机房,备库部署在其他机房。二、MySQL(一)MySQL架构1、连接器(Connectors)MySQL提供的接口,如java、.net、php等语言,可以通过该组件操作SQL语句,实现与SQL的交互。2、管理服务组件和工具组件(ManagementService&Utilities)提供对MySQL的集成管理,如备份(Backup)、恢复(Recovery)、安全管理(Security)等3、连接池组件(ConnectionPool)负责监听客户端向MySQLServer发送各种请求,接收请求,并将请求转发给目标模块。每个成功连接到MySQLServer的客户端请求都会创建或分配一个线程,负责客户端和MySQLServer的通信,接收客户端发送的命令,传递服务器的结果信息等。4.SQL接口组件(SQLInterface)接收用户SQL命令,如DML、DDL和存储过程,并将最终结果返回给用户。5、查询分析器组件(Parser)首先分析SQL命令语法的合法性,并尝试将SQL命令分解为数据结构。如果分解失败,会提示SQL语句不合理。6、优化器组件(Optimizer)按照标准流程对SQL命令进行优化分析。7.Caches&Buffers(缓存和缓冲区)缓存和缓冲组件8.MySQL存储引擎MySQL属于关系型数据库,关系型数据库的存储是以表的形式。表的创建、数据存储、检索、更新等都是由MySQL存储引擎完成的。由于MySQL的开源特性,允许第三方基于MySQL框架开发适合自己业务需求的存储引擎。因此,MySQL支持多种类型的存储引擎,可以分为官方存储引擎和第三方存储引擎。目前MySQL的存储引擎有MyISAM、InnoDB、NDB、Archive、Federated、Memory、Merge、Parter、Community、Custom等,其中比较常用的存储引擎有InnoDB、MyISAM和Momery。9、实际存储MySQL数据库文件和一些日志文件的物理文件(FileSystem)系统,如Linux、Unix、Windows等(2)一张查询流程图(3)MySQL的高可用架构由于开源MySQL的本质,其高可用架构非常灵活。目前常用的有以下几种:1.主从复制模式这是MySQL自备的一种高可用方案,数据同步方式采用了MySQL复制技术。为了达到更高的可用性,在实际应用环境中,需要配合高可用集群软件keepalived实现自动故障转移,否则需要手动切换。2、MHA(MasterHighAvailability)MHA是一种比较成熟的高可用解决方案。软件由两部分组成:MHAManager(管理节点)和MHANode(数据节点)。在搭建MHA时,要求一个集群至少要有三台数据库服务器,一主二从(即一台主备一台主从)。MHAManager可以部署在一台独立的机器上管理多个主从集群,也可以部署在一个从节点上,MHANode运行在每台MySQL服务器上。运行时,MHAManager会定时检测集群中的master节点。当master出现故障时,它会自动将拥有最新数据的slave提升为新的master,然后将所有其他slave重定向到新的master。整个故障转移过程对应用程序是完全透明的。整个切换过程如下:从崩溃的master上保存二进制日志事件(binlogevents);识别具有最新更新的从站;将差分中继日志(relaylog)应用到其他slave;应用从主服务器保存的二进制日志事件(binlogevents);将slave升级为新的master;让其他slave连接到新的master进行复制;3、MGR(MySQLGroupReplication)MGR是MySQL推荐的另一种高可用架构,用于组间复制数据同步是基于Paxos协议。当客户端发起更新事务时,首先在本地执行事务,执行完成后,再发起事务的提交操作。在实际提交之前,需要将生成的复制写集广播并复制给其他成员。如果冲突检测成功,则该组决定事务可以提交,其他成员可以申请,否则回滚。组复制可以运行在两种模式下:在单主模式下,组复制具有自动选主的功能。每次只有一个Server成员接受更新,其他成员只提供读服务。多主模式下,所有Server成员可以同时接受更新,没有主从之分,成员角色完全平等。三、PostgreSQL(一)PostgreSQL的体系结构PostgreSQL采用C/S模式提供服务。客户端和服务器可以在不同的主机上通过TCP/IP连接到网络。架构如下:1.主进程Postgres(常驻进程)主进程是Postgres,是PostgreSQL启动时启动的第一个进程。在启动时,它执行恢复、初始化共享内存并启动后台进程。当客户端发起连接请求时,postgres会生成一个子进程,同时创建一个后端进程。它是整个数据库实例的主控进程,负责启动和关闭数据库实例。2.Postgres(subprocess),子进程Postgres接受前端请求,查找数据库,最后返回结果。如果是更新数据库的请求,会先记录日志(PostgreSQL称为WAL日志),方便宕机重启时的数据恢复。此外,日志会定期归档保存,以备需要时进行数据恢复。3.后台进程(BackgroundProcess)Syslogger(系统日志)进程将错误信息写入log日志。BgWriter(后台)进程定期将脏内存块写入文件。Checkpointer在检查点发生时将脏内存块写入数据文件。WalWrite(预写日志)进程将WAL(WriteAheadLog预写日志)缓存写入WAL文件。当PgArch(归档)进程处于归档模式时,将WAL文件复制到特定路径。WAL日志会被回收,PgArch会在归档前备份WAL日志。通过PITY(PointinTimeRecovery)技术,在对数据库进行一次全量备份后,该技术会通过归档的方式备份备份时间点之后的WAL日志,使用数据库的全量备份加上后面产生的WAL日志。将数据库向前推送到完全备份后的任意时间点。AutoVacuum(自动清理)进程用于在启用自动清理时生成autovacuum工作进程。autovacuum进程的作用是在需要时自动对充气台进行真空吸尘。在PostgreSQL数据库中,对表进行DELETE操作后,并不会立即删除旧数据,更新数据时,不会更新旧数据,而是会生成一行新数据。旧数据只被标记为已删除,只有当没有其他并发事务读取旧数据时,它们才会被清除。此清理工作由AutoVacuum进程完成。PgStat(统计信息收集)进程用于收集数据库统计信息。4、共享内存和本地内存示意图如下:共享内存PostgreSQL启动后,会生成一块共享内存作为数据块缓冲区,提高读写性能。WAL日志缓冲区和Clog缓冲区也存在于共享内存中。此外,进程、锁、全局统计等全局信息也存储在共享内存中。数据缓冲区通过BgWrite进程定时向数据文件写入数据。WAL缓冲区通过WALWrite进程写入WAL文件,并通过PgArch定时归档。localmemory和non-globalstorage中写入archivelog的数据存储在localmemory中,主要包括:temporarybuffer:用于临时表。默认为8MBwork_mem:用于排序、位图索引、散列链接和合并链接操作。默认值为4MB。.maintenance_work_mem:用于vacuum和索引创建操作。默认值为64MB。(二)数据结构1.数据库相关概念:PostgreSQL由一系列数据库组成。一组PostgreSQL程序称为数据库集群。执行initdb()命令时,将创建template0、template1和postgres数据库。template0和template1数据库是创建用户数据库时使用的模板数据库,它们包含系统元数据表。initdb()完成后,template0和template1数据库中的表立即相同。但是template1数据库可以根据用户需要创建对象。用户数据库是通过克隆template1数据库创建的;2、表空间相关概念:在initdb()之后,创建pg_default和pg_global表空间。如果在创建表时没有指定具体的表空间,则表默认存放在pg_default表空间中。用于管理整个数据库集群的表默认存储在pg_global表空间中。pg_default表空间的物理位置是$PGDATAbase目录。pg_global表空间的物理位置是$PGDATAglobal目录。一个表空间可以同时被多个数据库使用。此时,每个数据库都会在表空间路径下创建一个新的子路径。创建用户表空间会在$PGDATApg_tblspc目录下创建一个软连接,连接到表空间指定的目录位置。3、表相关概念:每张表有3个数据文件:一个文件用于存储数据(文件名是表的OID);一个文件用于管理表的空闲空间(文件名为OID_fsm)。一个文件用于管理表的块是否可见(文件名为OID_vm)。索引没有_vm文件,只有OID和OID_fsm两个文件(3)后端进程的处理流程,接收前端发来的query(SQL文本),并进行解析。将SQL文本(简单文本)转换为解析器树。解析组合树后,将其替换为查询树。这时会访问数据库,检查表是否存在,如果存在,则将表名转换为OID。该处理称为分析处理(Analyze)。因为PostgreSQL也是通过改写查询语句来实现视图(view)和规则(rule)的,所以必要的时候,这个阶段会改写查询语句。解析查询树后,可以生成计划树。按照执行计划中的步骤完成查询的目的。执行结果返回给前端。返回步骤1并重复。4.国内关系数据库国内关系数据库很多。这里我们以GaussDBT为例(一)GaussDBT架构1.内存结构内存结构分为4个部分,如下图:Listener:包括TCPLSNR和IPCLSNR,用于监听用户的连接requestAgentPool:代理连接池SGA:LogBuffer:全局日志缓冲区,缓存重做日志DataBuffer:全局数据页缓冲区,用于缓存表索引等数据SQLCache:全局执行计划缓冲区SortArea:全局排序/物化缓冲区DictionaryCache:全局数据字典(元数据)缓冲区Largepool,大池,存放较大的SQLSessionPool,全局Session池,用于存放Session后台进程LOGW:日志写入线程,负责将日志缓冲区中的日志写入磁盘。CKPT:负责刷新脏页(DirtyPage)到磁盘,保证WAL,更新ControlFile。SMON:负责监控系统的状态,如检测死锁、修复异常会话等。JOBS:应用定制的后台任务调度。LOGR:日志复制,用于HA和GR。ARCH:用于日志文件归档。2.存储结构数据以文件的形式存储。主要有三种文件:DATAFILE,数据文件,用来存放各种数据。单个数据库最多可以有1024个数据文件,每个数据文件最大可达8T(undo除外,最大可达32G)LOGFILE,日志文件,用来存放重做日志,可以重复使用,至少3组,每个redolog文件一般推荐5-20个GCONTROLFILE,控制文件,用于数据库名称,数据文件位置等信息,在数据库启动到mount阶段会检查。(2)GaussDBT的关键技术在提交事务时,必须先刷新Redolog。脏页数据flush后,可以通过redolog进行回收。如果在刷入数据前断电,则需要在上电后重做Redo,以保持数据的一致性。脏页队列:脏页按照时间顺序组成一个链表,即脏页队列,Checkpoint按照队列的先后顺序分组进行刷盘;Checkpoint任务调度:Checkpoint后台服务线程传递定时、脏页量、RedoLog满,三种策略中的一种会满足Trigger刷新操作;Redo任务调度:Redo后台服务线程在满足定时、RedoBuffer容量、事务提交其中之一时,会触发RedoLogBuffer刷新操作;mirrorpage机制:flush时间比较长,为了避免I/OBlocking,Checkpoint通过一个mirroredpagecache完成flush。MVCC机制用于提高事务并发性。(3)GaussDBT的高可用部署模式1、单机和主备部署模式2、分布式部署模式(4)一个典型的分布式部署架构的组件描述如下:OM(OperationManager):Operationand维修管理模块。提供集群日常运维和配置管理的管理接口和工具。CM(ClusterManager):集群管理模块。管理和监控分布式系统中各功能单元和物理资源的运行情况,保证整个系统的稳定运行。CN(CoordinatorNode):协调调度节点。负责接收应用程序的访问请求,并将执行结果返回给客户端;负责分解任务并调度任务分片在各个DN上并行执行。在一个集群中,有多个CN,CN之间的角色是平等的。DN(Datanode):数据节点。负责存储业务数据,执行数据查询任务,并将执行结果返回给CN。在一个集群中,有多个DN。每个DN支持多个存储备机。GTS(GlobalTimeServer):全球时间服务器。用于强一致性场景,为每个节点提供逻辑时钟。5、主流关系型数据库特点分析
