一、 Oracle
(一) Oracle 架构
Oracle Server包括数据库(Database)和实例(Instance)两大部分,两者相互独立。数据库由数据文件 、控制文件和日志文件组成,实例由内存池和后台进程组成,示意图如下:
一台Oracle Server可创建多个Database,不同的Database之间相互独立。每个Database有属于自己的全套相关文件,如:密码文件,参数文件,数据文件,控制文件和日志文件
Database由一系列物理文件(如二维表文件)组成。用户不能直接读取Database中的内容,必须通过Oracle instance才能读取,一个Instance只能连接一个Database,但是一个Database可以被多个Instance连接。
各功能组件说明如下:
1、用户连接进程
用户连接进程是连接用户和Oracle Instance的桥梁。包括:用户进程、服务进程和PGA
用户进程User Process
当一个Database User请求连接到Oracle Server时,Oracle Server创建的User Process。
Server Process服务进程
用于处理Database User和Oracle Server之间的连接。
程序全局区PGA
PGA:由Server Process分配,用于当前User Session的内存区,不同的用户拥有不同的PGA。PGA包含了Server Process数据和控制信息的内存区域。包括栈空间、 Session Info、 私有SQL区。
2、SGA(System Global Area)
SGA与Oracle性能息息相关,在Instance启动时被分配,关闭时被释放。主要包含如下几种数据结构:
数据库缓冲区(Database buffer cache)
oracle 执行SQL语句的区域。当进行数据更新或数据查询时,用户执行的SQL语句不会直接对磁盘上的数据文件进行更改操作,而是首先将数据文件复制到数据库缓冲区缓存,再更改或查询缓存中的副本。此外,被频繁访问的数据块会存在于数据库缓冲区缓存中。
日志缓冲区(Redo log Buffer)
用于短期存储redo log。
共享池(Shared Pool)
用于缓存所有频繁执行的代码和频繁访问的对象定义。共享池内有下列三种数据结构:
库缓冲(library cache):存储最近执行的代码
数据字典缓存(data dictionary cache):存储最近使用的对象定义
PL/SQL缓冲区(PL/SQL buffer):用于存储过程、函数、打包的过程、打包的函数、对象类型定义和触发器。
大型池(Large Buffer)
用于共享的服务器进程。
JAVA池(Java Buffer):
只有当应用程序需要在数据库中运行java存储程序时,才需要java池。
3、后台进程
后台进程主要用于数据库管理 ,是Oracle Instance和Oracle Database的联系纽带,分为核心进程和非核心进程。
1) 核心进程:
数据库写入进程(DBWn)
Server process连接Oracle后,通过数据库写进程(DBWn)将数据缓冲区中的“脏缓冲区” 的数据块写入到数据文件;
检查点进程(CKPT)
Checkpoint (CKPT)检查点进程主要用于更新数据文件头,更新控制文件和触发DBWn数据库写进程。
进程监视进程(PMON)
当后台进程执行失败后负责清理数据库缓存和闲置资源,是Oracle的自动维护机制。
系统监视进程(SMON)
用途如下:
当数据库实例崩溃时,用于数据库实例的自动恢复。
清除作废的排序临时段,回收整理碎片,合并空闲空间,释放临时段,维护闪回的时间点。
重做日志文件和日志写入进程
用于记录数据库的改变和记录数据库被改变之前的原始状态,当满足以下条件时,激活LGWR:
提交指令
日志缓冲区超过1/3
每三秒
每次DBWn执行之前
2) 非核心进程
归档进程(ARCn)
是可选的后台进程,当数据库处于ArchiveLog模式时,自动归档redo log,并保存数据库的所有修改记录。
SGA(System Global Area)和后台进程组成Instance。
4、存储结构
存储结构可从物理结构和逻辑结构两方面理解。
1) 物理结构
Database物理结构:是Database在操作系统中的文件集合,即:磁盘上的物理文件,主要由数据文件、控制文件、重做日志文件、归档日志文件、参数文件、口令文件组成。
数据文件、重做日志文件、控制文件、跟踪文件、警告文件属于数据库文件
Data Files
数据文件是数据的存储仓库,数据被使用时才被调入内存中的。
Redo Log Files
重做日志文件包含对数据库所做的更改操作记录,在Oracle发生故障时能够恢复数据。
Control Files
控制文件包含维护和验证数据库完整性的必要的信息。例如,控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件。
跟踪文件 (Trace Files)
在instance 中运行的每一个后台进程都有一个跟踪文件(trace file)与之相连。Trace file记载后台进程所遇到的重大事件的信息。
警告日志( Alert Log)
是一种特殊的跟踪文件,每个数据库都有一个跟踪文件,同步记载数据库的消息和错误。
参数文件、口令文件、归档文件属于非数据库文件。
Parameter File
实例参数文件,当启动oracle实例时,SGA结构会根据此参数文件的设置内存,后台进程会据此启动。
Password File
用户通过提交username/password来建立会话,Oracle根据存储在数据字典的用户定义对用户名和口令进行验证。
归档文件
是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
2) 逻辑结构
表空间
用于存储数据库对象的逻辑空间,是信息存储的最大逻辑单位,是一系列数据文件的集合。一个数据库可以由多个表空间组成,每个表空间包括多个段。
段:
是对象在数据库中占用的空间。段是区的集合
区:
是为数据一次性预留的一个较大的存储空间,区是块的集合
块:
ORACLE最基本的存储单位,在建立数据库的时候指定,并被映射到磁盘块。
3) 逻辑空间到物理空间的映射
(二) Oracle RDBMS的运行过程
1. User访问Oracle Server之前提交一个请求(包含了db_name、password、instance_name、username等信息);
2. Oracle Server接收到请求并通过Password File的验证后,分配SGA内存池,启动后台进程同时创建并启动实例;
3. 启动实例之后,User Process与Server Process建立Connect;
4. Server process和Oracle Instance建立Sesscion,随后接收用户请求,执行相关操作;
(三) 写SQL语句的执行过程
1. 用户执行SQL语句,Server process收到后,将SQL语句送到Instance,再将SQL语句载入数据库缓冲区。
2. Server Process通知Oracle Database将与SQL语句相关的数据块副本加载到缓冲区中。
3. 在数据库缓存区执行SQL语句,修改数据文件副本,形成“脏缓冲区”
4. CKPT检查到”脏缓冲区”,调用DBWn数据库写进程,
5. 在DBWn运行之前,先运行了LGWR,将数据文件的原始状态和数据库的改变记录到Redo Log Files
6. 运行DBWn,将“脏缓冲区的内容写入到数据文件”
7. 同时CKPT修改控制文件和数据文件头
8. SMON回收不必要的空闲资源
9. 返回结果给用户
(四) Oracle的高可用性架构
1. Oracle RAC(Real Application Clusters)
RAC 是 Oracle 数据库的一个群集解决方案,包括计算层和存储层。如下图所示:
1) 存储层——共享存储
Oracle RAC的核心是共享磁盘子系统,集群中所有节点必须能够访问所有数��������,����һ��据文件、重做日志文件、控制文件和参数文件,因此,这些文件必须存放在共享存储中。常用的共享存储方式有OCFS、OCFS2、RAW、NFS、ASM 等。说明如下:
OCFS(Oracle Cluster File System) 和 OCFS2 都是文件系统,和 NFS 一样,提供集群环境共享存储的文件系统。
RAW 裸设备也是一种存储方式。把共享存储映射到 RAW Device,Oracle在存储数据时,选择 RAW device存储即可。但相对于文件系统来说, RAW不直观,不便于管理,而且有数量的限制,现已被OCFS取代。
ASM 是一种数据库存储的方案,并不是 cluster 的方案,使用 ASM 时,还需使用OCFS/OCFS2 或RAW。
2) 计算层
计算层至少需要两台以上的服务器,在每台服务器上安装集群软件和Oracle的 RAC 组件,从逻辑结构上看,每个节点都有一个独立的实例,这些实例访问同一个数据库。节点之间通过集群软件的通信层(Communication Layer)进行通信,利用高速缓存合并技术,实现集群中各节点缓存的高速同步,使得集群中的每个实例,都保留了一份相同的数据库 cache。从而最大限度地低降低磁盘I/O。因此,RAC有如下特点:
每一个节点的实例都有自己的 SGA;
每一个节点的实例都有自己的后台进程
每一个节点的实力都有自己的 redo logs
每一个节点的实例都有自己的 undo 表空间
所有节点都共享一份 datafiles 和 controlfiles
2、Data Guard
在Data Gurad 环境中,至少有两个数据库,一个主库(Primary Database)处于Open 状态,另一个备库(Standby Database)处于standby状态。
备库又分物理库和逻辑库。物理库和主库完全一样,通过REDO应用来保持与主库的数据一致性,支持只读服务;逻辑库通过SQL应用,在备库端执行和主库同样的SQL语句,以此来保持与主库的数据一致,因此文件的物理结构(甚至数据的逻辑结构)都可以与主库不一致。逻辑库支持读写服务。
Data Guard适合多机房方案,实际部署时,主库部署在主机房,备库部署在其他机房。
二、 MySQL
(一) MySQL架构
1、连接器(Connectors)
MySQL向外提供的接口,如java,.net,php等语言可以通过该组件来操作SQL语句,实现与SQL的交互。
2、管理服务组件和工具组件(Management Service & Utilities)
提供对MySQL的集成管理,如备份(Backup),恢复(Recovery),安全管理(Security)等
3、连接池组件(Connection Pool)
负责监听对客户端向MySQL Server端的各种请求,接收请求,转发请求到目标模块。每个成功连接MySQL Server的客户请求都会被创建或分配一个线程,该线程负责客户端与MySQL Server端的通信,接收客户端发送的命令,传递服务端的结果信息等。
4、SQL接口组件(SQL Interface)
接收用户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、物理文件(File System)
实际存储MySQL数据库文件和一些日志文件等的系统,如Linux,Unix,Windows等。
(二) 一个查询流程图
(三) MySQL的高可用架构
因MySQL的开源属性,其高可用架构非常灵活,目前常用的主要有以下几种:
1、主从复制模式
这是MySQL自身提供的一种高可用解决方案,数据同步方法采用的是MySQL replication技术。为了达到更高的可用性,在实际的应用环境中,需要配合高可用集群软件keepalived来实现自动failover,否则,需要手工切换。
2、MHA(Master High Availability)
MHA是相对成熟的高可用解决方案,该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。搭建MHA时,要求一个集群必须最少有三台数据库服务器,一主二从(即一台master,一台备用master,另外一台slave)。
MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,或部署在一台slave节点上,MHA Node运行在每台MySQL服务器上。
运行时,MHA Manager会定时探测集群中的master节点,当master故障时,会自动将最新数据的slave提升为新的master,然后将其他所有slave重新指向新的master。整个故障转移过程对应用程序完全透明。整个切换过程如下:
从宕机崩溃的master保存二进制日志事件(binlog events);
识别含有最新更新的slave;
应用差异的中继日志(relay log)到其他的slave;
应用从master保存的二进制日志事件(binlog events);
提升一个slave为新的master;
使其他的slave连接新的master进行复制;