
Oracle RAC群集基础知识.docx
7页SMP(对称多处理)解决了单处理器系统达到其处理极限时出现的问题SMP就是在一个计算机内使用多个处理器CPU来提高处理能力(这些处理器共享内存)oSMP 计算机通过并行机制实现高性能,这种机制对处理多任务进行分割,然后在可用 CPU 上执 行,通过添加更多的CPU和内存实现高伸缩性SMP 与群集在基本体系结构方面具有相似性,但这两种体系结构在保持缓存一致性的级别 和延迟方面完全不同:SMP为缓存一致性,CPU多核心之间共享缓存,多颗CPU之间共享内存; 群集则使用缓存融合,节点中的CPU间共享内存,节点之间则使用缓存融合Oracle Exadata传统存储体系结构中的表扫描处理流程:1. 应用层(客户端)发出SQL查询,假设这是一条带有where条件的select语句2. 数据库内核查询数据字典,确定存储表数据的文件和扩展块3. 数据库内核发出I/O调用,从磁盘中读取所有的物理数据块4. 来自磁盘的物理数据块加载到数据库服务器的内存中(SGA中的缓存中)5. 数据库服务器读取内存缓冲区,根据where条件筛选满足条件的行6. 匹配的行被返回到客户端如果这些表比较小且有很好的索引,这种传统 SQL 处理过程会工作良好,但对于涉及多个 大型表的复杂业务查询来说,从磁盘读取所有数据并将他们传送到主机内存是一项高成本任 务,需要通过网络将大量原始数据传送到主机内存,此外不满足条件的记录在主机级别被丢 弃,这是一种效率极低的 I/O 操作。
Exadata智能扫描模型中,整个工作流程将不同,执行表扫描的查询被卸载到exadata存储 服务器上,只有满足条件的记录才会返回数据库服务器1. 应用层发出select查询2. 当数据库服务器检测 exadata 时,它构建一个表示这一 SQL 语句的 exadata 构造(称为 iDB命令),并将其发送到exadata存储服务器,iDB是一种基于无线带宽协议的数据传 送机制(低延迟,高带宽),在exadata存储服务器和数据库服务器之间通信使用3. Exadata对表执行“智能扫描”并直接在存储器上应用where条件以提取感兴趣的数据 行4. 结果集被直接传递到数据库实例,这个结果集就是查询结果,而不是满足条件的数据块, 它被直接发送到用户会话的“程序全局去PGA”,而不是缓存在SGA中5. 匹配行被返回客户端完全共享存储的体系结构所涉及的 I/O 通常用作普通文件或数据库的存储群集依赖于一个公共通道进行磁盘访问 所有节点对共享磁盘子系统拥有同等访问权限,因此必须使用一种同步机制来保证系统的一 致性(DLM)在一个完全共享存储的群集中,所有节点可同时读写共享存储,具有这一功能的群集采用一 个群集范围内的群集文件系统(CFS),并提供DLM,使节点能够协调对文件,记录和数据 库的共享及更新。
CFS 对群集中所有节点的磁盘数据提供相同的视图这意味着对于用户或应用程序来说,每 个节点上的环境看起来都是相同的完全共享存储的群集支持更高级别的系统可用性,如果一个节点发生故障,那么其他节点不 受影响,但是这种更高的可用性是有代价的:由于在使用DLM时会产生开销,另外共享硬 件中可能出现瓶颈,因此多少会降低这些系统的性能,完全共享的群集以较好的伸缩性来弥 补这一缺陷ASM群集文件系统(ACFS),广泛用于存储Oracle数据库中使用的数据库二进制文件,日志 文件和非数据文件Oracle并行服务器体系结构每个节点实例拥有自己的SGA和自己的redolog,数据文件,控制文件所有实例共用数据 文件和控制文件所有实例同时读写;但是, redolog 可以由任意实例读取,但只能由拥有它 的实例写入每个节点都有其自己的后台进程集合,另外还在每个实例上启动OPS特有的 进程,以处理跨实例通信,锁管理和数据块传送OPS体系结构(RAC在其上演变而来)OPS数据库组件:在Oracle 8i并行服务器数据库的每个实例上,都可以找到以下组件:1. 群集管理器,每个操作系统厂商提供不同的群集管理器(windows除外),其中包含节 点监控工具和故障检测机制2. 分布式锁管理器(DLM),包含死锁检测和资源控制3. 群集互联4. 共享磁盘阵列分布式锁管理(DLM)DLM是OPS和RAC栈的完整组成部分,早期Oracle依赖于OS来提供这一组件,它在全局 范围内协调资源,保持系统同步。
从Oracle OPS 7到11g的所有版本中,数据一致性和完整 性都由这个层维持的从8i往后,对DLM的所有引用都被关联到集成DLM(IDLM),与OPS 内核集成在一起在版本8之前,DLM API模块必须依靠OS进程来查看一个锁的状态(因为DLM功能由OS 提供),这一通信使用UNIX套接字和管道来完成在采用IDML时,所需数据位于每个实例 的 SGA 中,只需要使用锁存器或排队来执行序列化查询,还可能需要全局协调,其算法内 置于 Oracle 内核中在OPS 8i中,IDML经历了重大发展,更加稳定,IDLM拥有一个库,其中包含OPS数据库中 所有实例所拥有的全部锁和全局队列 IDML 的任务就是跟踪每个被指定给资源的锁对于 各个实例获取和释放锁的请求,其协调功能由DLM完成DLM运行所需的内存结构在共享 池之外分配锁资源,消息缓存区等都在每个实例的共享池中DLM 总是知道锁的当前拥有者或请求者以及被锁定的资源当锁不可用时, DLM 将锁请求 放入队列,并在锁资源变为可用时通知请求者 DLM 管理的一些资源是数据块和回滚段Oracle 资源按照各个实例与 DLM 锁关联在一起,这一关联过程使用复杂的哈希算法。
OPS 中的锁和队列功能与单实例RDBMS中相同,只不过OPS是从全局着眼DLM依赖于核心RDBMS内核提供锁定和队列服务,DLM在全局协调锁定,这是核心层没有 提供的服务,Oracle 8i OPS和Oracle RAC中的锁定以及队列内核服务于DLM功能保持分离Oracle并行服务器中的锁定概念在 OPS 数据库中,用户要对任意资源执行操作,必须事先申请一个锁,这同样适用于单实 例场景,DML中,资源就是任何可由用户访问的对象,锁就是客户端对资源发出的特定类 型或模式的操作请求OPS中有一个名为“并行缓存管理(PCM)”的概念,意思是在(一个实例的)每个数据缓 存区中都可以对数据块进行协调和维护,从而使用户查看或请求的数据绝对不会出现不一致 的情况对数据的访问使用PCM框架,利用带有全局协调块的数据块来控制PCM确保在 任意给定时刻,一个群集中只有一个实例可以修改一个锁,其他实例必须等待OPS中要么是PCM锁,要么是非PCM锁PCM锁几乎是独占的保护数据块,非PCM锁则 控制对数据文件,控制文件,数据字典等的访问PCM锁在OPS中是静态的,非PCM锁使 用特定参数init.ora设置动态设定。
PCM资源上的锁称为“锁元素”,非PCM锁称为“队列” DLM锁是在一个资源上获得的,通常被授予一个进程PCM锁与行锁相互独立运行PCM 锁与行锁的独立性一个实例可以放弃一个PCM锁,但确不影响整个PCM锁所覆盖数据块上的行级锁 行级锁在事务期间获得当一个实例要读取一个数据库资源(比如一个数据块)以进行更新 时,这个数据库资源获得一个PCM锁,在事务期间如果其他实例也需要这个数据块,那么 可以多次放弃和获取一个PCM锁行级锁相反,在提交或回滚对这些数据行的更改之前,事务是不会释放行级锁的oOracle使 用内部并发控制机制来隔离事务,在一个被修改的事务提交之前,其他事务看不到这个事务 被修改的信息行级锁并发控制机制独立于并行缓存管理:并发控制不需要获取PCM锁,PCM锁在运行时不依赖各个事务的提交或回滚IDLM锁模式与Oracle锁模式有些类似,但不相同在OPS中,锁可以是本地的,也可以是 全局的,具体取决于请求和操作的类型本地锁可以分为锁存器和队列,为本地实例上运行的操作获取这些锁共享池锁存器是本地 锁的一个简单示例,与是否存在OPS无关队列可是本地的,也可以是全局的他们在OPS 中担当全局角色,而在单实例中保持本地身份。
TX(事务)队列,控制文件队列(CF), DFS(分 布式文件系统)队列锁和DML/表锁都是OPS数据库中全局队列的示例相同队列在单实例数 据库是本地的,数据字典和库缓存锁在OPS中是全局的本地锁提供事务隔离或行级锁定实例锁在访问共享资源时保证缓存一致性GV$LOCK和 GV$LOCK_ELEMENT都是重要视图,提供了全局队列和实例锁的相关信息8i中,两个后台进程一锁管理器守护进程(LMD)和锁监控器(LMON)o每个实例自身拥 有这两个进程的集合DLM数据库存储相关资源,锁和进程的信息在9i中,DLM被重命 名为“全局缓存服务”(GCS)和“全局队列服务”(GES)DLM 锁兼容性矩阵 每个资源都由自己唯一资源名称进行识别,每个资源都可能有一个锁列表,其中列出当前被 赋予用户的锁该列表称为“Grant Q”,当一个锁由一种模式转换为另一种模式或者等待被 转换时,这个锁被放在资源的'Convert Q”上,对于每个锁,内存中都存在一种资源结构, 用来维持这个锁的拥有者和转换者的列表,每个拥有者,等待者,转换者都有一种锁结构每个节点都拥有它所管理资源集的目录信息,为了找到资源, DLM 使用哈希算法,根据资 源名称找出哪个节点中保存了这个资源的目录信息。
锁的获取与转换授予资源的锁位于Grant Q中,当一个进程获取一个资源的Grant Q上的锁时,该资源被上 锁,只有在此时,一个进程才以兼容模式拥有这个资源上的锁基于进程和组的锁定在DLM内存区域中分配锁结构时,请求进程的操作系统进程ID是这个锁的请求者的关键标 识符在 Oracle 中可以很容得将一个进程映射到一个会话,相关信息可在 v$session 中获得 但在特定的客户端中,如Oracle多线程服务器(MTS)或Oracle XA中,单个进程可以拥有 多个事务会话会在许多进程间迁移,构成一个事务这就可能无法识别这一事务及其出处因此,锁标识符的设计必须拥有一些基于会话的信息,在DLM发出锁定请求时,由客户端 提供其中的事务ID(XID)在使用基于群组的锁定时会用到群组特别是涉及MTS时,优先选择这种方式,当使用MTS 时,如果拥有锁,那么共享服务不能供其它会话使用从9i往后,不存在基于进程的锁定在 8i OPS 及其后续版本中,无论事务种类如何,都使用基于群组的锁定一个群组内的进 程在向Oracle申请任何事务锁之前使用XID来标识自身锁的主控对于关注某一给定资源的所有节点, DLM 中保存了这些节点上的锁信息。
DLM 指定一个节 点来管理一个资源的所有相关锁信息;这个节点称为“主控节点”锁的主控在所有节点之 间进行分布利用“进程间通信IPC”层,DLM的分布式组件允许它共享主控(管理)资源的负载因此, 一个用户可能在一个节点上锁定一个资源,但实际上是与另一个节点上的LMD进程进行通 信容错功能要求:无论有多少DLM实例发生故障,都不能丢失有关被锁资源的重要信息异步陷阱DLM进程(LMON,LMD)之间的跨实例通信是使用高速互联上的IPC层实现的为了传递锁 资源的状态,DLM使用了异步陷阱(AST),在操作系统处理程序进程中实现为中断对于 OPS或RAC来说,AST就是中断,AST可以是一个“阻塞AST”,也可以是一个“获取AST”当一个进程请求一个资源上的锁时, DLM 向当前对同一资源拥有锁的全部进程发出一个阻 塞异步陷阱(BAST),在。
