Oracle Rac 的简单学习

发布时间 2023-09-26 15:01:26作者: 济南小老虎

Oracle Rac 的简单学习


Oracle RAC的概念

Oracle RAC (Real Application Clusters) 是 Oracle 数据库管理系统的一个功能,
它允许将数据库实例部署在多个节点上,实现高可用性和可伸缩性。
通过将数据库实例分散在不同的服务器上,Oracle RAC 提供了系统级别的容错能力,
即使在一个节点故障的情况下,数据库仍然可用。

Oracle RAC 使用共享存储架构,所有节点可以同时访问共享的数据库文件和资源。
这样,当某个节点发生故障时,数据库可以自动在其他节点上重新启动,并继续提供服务,从而保证了业务的连续性。
此外,通过动态分配负载和资源管理,Oracle RAC 还可以实现数据库的水平扩展,以适应不断增长的负载需求。

总的来说,Oracle RAC 是一种高可用性和可扩展性的数据库解决方案,它利用集群技术将数据库实例分散在多个节点上,提
供了容错和负载均衡能力,确保了数据库的可用性和性能。

需要注意 Oracle RAC 需要访问共享存储设备.
共享存储设备可以采用SAN等高端存储. 提供多路径访问, 多控制器, raid等多种方式保证存储的安全和可靠性. 

Oracle RAC的核心组件

Oracle Clusterware:Oracle Clusterware是Oracle集群环境的基础,它提供了群集管理、故障切换和负载均衡等核心功能,
使得多个数据库实例可以在同一群集中共存并协同工作。

ASM(Automatic Storage Management):ASM是一个简化的存储管理工具,用于管理数据库的数据文件、控制文件和日志文件。
它可以自动创建和管理磁盘组,并且可以跨多个节点进行访问,从而实现高可用性和可扩展性。

Oracle Net Services:Oracle Net Services是Oracle数据库的网络层,用于处理客户端和服务器之间的通信。
在RAC中,Net Services还提供了服务名解析、连接负载均衡和故障转移等功能。

共享存储:RAC中所有节点都可以访问相同的存储资源,包括数据文件、控制文件和日志文件等。这些资源可以通过网络存储或SAN(存储区域网络)等方式共享。

共享网络:在RAC中,所有节点都必须通过共享网络进行通信,以便进行群集管理、数据同步和负载均衡等功能。

多个实例:RAC允许在同一群集中运行多个实例,每个实例都可以处理用户请求并访问共享存储。
这些实例可以在群集中分布在不同的节点上,以实现负载均衡和故障转移等功能。

Oracle RAC的cache fusion

Oracle RAC Cache Fusion 是一种用于 Oracle Real Application Clusters (RAC) 的关键技术,
它在多个数据库实例之间实现了高效的共享内存访问和数据通信。

Cache Fusion
由于要解决多个节点的并发,所以引入了DLM(Distribute Lock Management)。
DLM在Oracle发展的不同时期,名字也不相同,
在OPS时期,叫做PCM;
在RAC时期叫做Cache Fusion。
在DLM 中,根据资源数量,活动密集程度,把资源分成两类:Cache Fusion和Non-Cache Fusion。
GRD(Global Resource Directory)
Cache Fusion要解决的首要问题是:数据块拷贝在集群节点间的状态分布图。RAC是通过GRD来实现的。

Cache Fusion是一种在共享存储架构中使用的技术,它通过在不同节点之间共享内存块来提高系统性能。
具体而言,Cache Fusion可以将一个节点上的缓存数据无需写回到磁盘而直接转移到另一个节点的缓存中,
以满足另一个节点需要访问相同数据的请求。这样可以避免频繁地访问磁盘造成的延迟,并且可以更快地响应用户请求,从而提高系统整体性能。

在 Oracle RAC 环境中,每个节点上的数据库实例都具有自己的缓存(也称为 SGA),其中包含了数据库中常用的数据和索引。
当一个节点需要访问其他节点上的数据时,传统的分布式数据库模型可能需要通过网络进行数据通信,带来较大的延迟和性能损失。
而 Cache Fusion 技术则通过共享内存区域直接在节点之间交换数据,提供了低延迟、高性能的数据访问。

Oracle RAC Cache Fusion:Cache Fusion 是 Oracle RAC 中用于实现节点间高速共享内存访问和数据交换的关键技术。
它通过在共享内存中直接交换数据块,提供低延迟、高性能的数据访问方式。
Cache Fusion 技术使用高速的网络通信通道(如 InfiniBand 或以太网 RDMA)
将共享数据块在节点之间传递,实现了数据共享、数据一致性和并发性保证。

心跳线(Heartbeat Line):心跳线是 Oracle RAC 中用于节点间通信的专用网络链路。
它用于检测和维护节点之间的网络连接和健康状态。通过心跳线,各个节点可以相互发送心跳信号,
以确保彼此的可用性和协调一致性。心跳线的作用是监测节点的存活状态、故障检测和故障恢复,以及协调集群的资源管理和决策。

综上所述,Oracle RAC Cache Fusion 和心跳线是 Oracle RAC 架构中两个独立但相关的概念。
ache Fusion 用于实现共享内存访问和数据交换,提供高性能的数据共享和并发性保证;而心跳线用于节点间通信,
维持集群节点的连接状态和协调集群操作。它们共同构成了 Oracle RAC 技术中数据共享和高可用性的基础。

Cache Fusion的使用逻辑

全局缓存服务(GCS)
LMSn后台进程使用GCS在全局buffer cache中维护缓存的一致性,SGA中可以存在同一个数据块的多份拷贝(当前版本只有一个),
GCS对数据块的状态和位置进行跟踪,并通过内部连接将块传输到其他节点的实例中。

全局队列服务(GES)
和GCS类似,GES工作在块级别,管理集群中的全局队列。
根据经验,如果一个操作没有涉及在全局buffer cache中控制/移动数据块,那么很可能是经过了GES的处理。
全局队列服务负责所有的实例中的资源操作,比如对数据字典和库缓存的访问或事务的全局管理。它同样可以检测集群中的死锁。
它跟踪多个实例同时访问资源时Oracle队列机制的状态。全局队列服务监控(LMON)和全局队列服务后台进程(LMD)组成全局队列服务的一部分。
锁进程LCK0负责无缓存方式的访问,比如library和row cache请求。

总结:
DLM是rac的核心工作机制,把所有实例的SGA虚拟成一个大的SGA,可能看起来容易混,
简单总结下,因为rac资源是共享的,为了解决多个节点的并发,所以通过DLM(cache fusion)来控制,
而DLM是以数据块作为粒度单位进行协调,当要块转移是依赖于全局资源目录(GRD)模拟一个横跨集群内所有节点的全局SGA
而整个cache fusion是由GCS(负责数据库在实例间的传递)和GES(负责锁管理)组成的,这样就可以很容易的联系起来了.

Oracle RAC 相关等待事件

在Oracle RAC环境中,由于多个节点共享同一个数据库和存储资源,可能会导致资源冲突的问题。
具体而言,RAC中的资源冲突主要有以下几种类型:

Cache Fusion冲突:Cache Fusion是一种通过共享内存块来提高系统性能的技术,
    在实现过程中可能会出现不同节点之间的数据访问竞争,从而导致Cache Fusion冲突。

Latch冲突:Latch是一种轻量级的同步原语,在RAC环境中用于控制对共享数据结构的并发访问。
    当多个节点同时尝试获取同一个Latch时,就会出现Latch冲突。

Enqueue冲突:Enqueue是一种用于控制并发访问共享资源的机制,它可以避免数据的脏写或者竞争情况。
    当多个节点同时请求访问同一个Enqueue时,就会出现Enqueue冲突。

DLM(Distributed Lock Manager)冲突:DLM是RAC集群中的一个关键组件,用于管理全局锁和事务协调。
    当多个节点同时请求访问某个全局锁或者进行事务协调时,就会出现DLM冲突。

以上四种资源冲突都可能会影响到系统的性能和可用性,需要采取相应的措施来降低其发生的概率和影响程度。

Oracle RAC 相关等待事件

在 Oracle Real Application Clusters (RAC) 中,等待事件是指一个会话或进程正在等待某个资源的情况。
以下是一些常见的 Oracle RAC 相关等待事件:

Cache Fusion 相关事件:
Cache Fusion 是 Oracle RAC 中实现数据共享和一致性的关键机制。在这种情况下,可能会出现等待事件,如:
gc buffer busy、
gc cr block busy、
gc current block busy 
等,表示某个缓存区块正在被其他实例使用,导致等待。

enq: TX - row lock contention:
这个等待事件表示一个事务正在等待另一个事务释放一个锁,以便访问共享数据行。
这可能是由于并发事务对相同数据行进行修改而引起的。

enq: TX - allocate ITL entry:
这个等待事件表示一个事务正在等待为新数据行分配 ITL(Interested Transaction List)条目。
ITL 条目用于跟踪对数据行的并发访问。

enq: SQ - contention:这个等待事件表示对于共享的序列(sequence)正在发生争用。
可能的原因包括并发事务对序列进行访问或序列缓存的调整。

GC CR Grant 2-way 和 GC CR Grant 3-way:
这些等待事件表示分布式事务需要等待全局协调器(Global Coordinator)的授权才能继续操作。
在 RAC 环境中,分布式事务的提交需要协调多个实例。

gc buffer busy acquire

在 Oracle RAC 中,“gc buffer busy acquire” 是一种等待事件,
表示一个进程或会话正在请求并等待获取一个被其他实例持有的缓冲区(buffer)。

当一个会话需要读取或修改一个缓冲区时,如果该缓冲区正在其他实例中被占用,
当前会话就会出现 “gc buffer busy acquire” 等待事件。这种情况通常发生在高度并发的环境下,多个实例同时请求同一个缓冲区时。

要解决 “gc buffer busy acquire” 等待事件,可以考虑以下几个方面:

调整应用程序设计:尽量避免多个事务同时访问相同的缓冲区,可以通过调整应用程序的逻辑和访问模式来减少竞争。

分析和优化 SQL:评估正在执行的 SQL 语句对数据库缓冲区的访问模式,并尽可能优化 SQL 查询,减少对同一缓冲区的频繁访问。

调整 RAC 配置参数:根据实际负载和资源情况,合理地调整 RAC 相关的配置参数,如缓冲区大小、GC 相关参数、并行度等,以优化资源的使用和分配。

增加资源:如果系统出现频繁的 “gc buffer busy acquire” 等待事件,可能是由于资源不足引起的。
以考虑增加节点的处理能力、扩展共享池和缓冲区大小等来提升系统性能。

需要注意的是,解决 “gc buffer busy acquire” 等待事件是一个复杂的过程,需要结合实际情况进行分析和优化。
建议在进行任何配置更改之前,先进行全面的性能分析和测试,并在生产环境中小心地进行变更操作。

gc等待事件分类-沃趣科技

Response Times Based on Wait Events
大多数全局缓存等待事件在AWR报告或者动态性能视图的中显示时间占比较高并且可能存在它们作为顶级数据库时间消费者但是并不一定代表有问题。
如果用户响应时间增加并且等待很高比例的时间用于全局高速缓存(gc),这个时候需要我们确定原因。
大多数报告都包括细分事件按总时间的百分比排序。从ADDM报告开始是有用的,
报告分析常规收集的报告性能统计与其影响有关,并指向哪些对象和SQL对等待的时间贡献最大,
然后由AWR和Statspack提供更详细的报告。Oracle RAC最重要的等待事件包括以下类别:
Block-Related Wait Events
Message-Related Wait Events
Contention-Related Wait Events
Load-Related Wait Events

1. Block-Related Wait Events
与块相关的等待事件统计信息表明已收到的块经过作为2次或3次消息传递的结果,
即块是从任何一个发送的资源master需要1次消息和1次块传输,或者被转发到第三个节点,需要2条消息和1个块传输。

gc current block 2-way
gc current block 3-way
gc cr block 2-way
gc cr block 3-way

2. Message-Related Wait Events
与消息相关的等待事件统计信息表明没有收到任何阻塞,因为它在任何实例中都没有缓存。
表示的是一个全局授权,使其能够实现请求实例从磁盘读取块或修改它。
如果这些事件消耗的时间很长,那么可以假设SQL导致很多磁盘I/O(在cr授权的情况下)或者说工作负载会插入大量数据,
并且需要经常查找和格式化新块。

gc current grant 2-way
gc cr grant 2-way

3. Contention-Related Wait Events
与争用相关的等待事件统计信息表明请求的块被另一个节点上的会话持有,并且所做的更改尚未结束因此不能马上发送传递。
一个块产生busy等待也可能会发生在本地,当一个会话启动了一个缓存融合操作,同节点上的另一个会话正在尝试读取或修改相同的数据。
高服务时间可能会加剧在全局高速缓存中传递块的争用,大部分情况下busy类的等待事件表明用户对同一数据的频繁并发读写访问。
gc current block busy and gc cr block busy等待事件表明发出请求的本地实例没有立即收到当前或一致性读取块。
这些事件名称中的busy一词表示发送该块在远程实例上被延迟发送了。例如,如果Oracle数据库尚未为块的更改写入redo。
与block busy等待事件相比,gc buffer busy等待事件表Oracle数据库无法立即授予对存储在本地的缓存的访问权限。
这是因为缓冲区上的全局操作正在等待且操作尚未完成。换句话说,缓冲区正忙,所有其他尝试访问本地缓冲区的进程必须等待完成。
gc buffer busy也同样意味着多次访问本地块的请求。Oracle数据库必须排队这些请求。Oracle数据库需要处理的时间长度队列取决于块的剩余服务时间。
服务时间受:网络延迟时间,远程和本地实例处理时间,以及等待队列的时间。平均等待时间和总等待时间都应该被考虑进去,这些特定的等待对系统有巨大的影响。

gc current block busy
gc cr block busy
gc buffer busy acquire/release

4. Load-Related Wait Events
与负载相关的等待事件表明在处理中发生了延迟GCS,这通常是由高负载,CPU饱和,负载平衡,新节点的添加删除。
对于上面提到的事件,等待时间包含整个节点从会话开始等待启动块请求之后到请求的块被返回。

gc current block congested
gc cr block congested

Rac环境下减少 Row lock Contention的方式与方法

大佬给出的解决方案:
应用层面:

1、约束通常是为了保证数据完整性,在并发场景下,应充分考虑事务进行的逻辑顺序,避免多个会话事务交叉进行,触发约束冲突在事务级别发生竞争;
2、要提高并发效率,应当尽可能拆分大事务为小事务,提高 tx enqueue 锁的获取释放速度;
3、如果要使用悲观锁(for update),应尽可能减少锁定的行范围;

数据库层面:

1、在 dml 频繁的表上建立适当的索引,提高 SQL 执行的效率,减少 tx enqueue 锁持有的时间;避免全表扫描这种,容易造成 IO 开销巨大,热块竞争,会话堆积的访问方式。
2、在 dml 频繁的表上不应使用位图索引;
3、对于 dml 频繁的表,不应使用 IOT 表,物化视图等;
4、RAC 环境下,对于批量的 dml 操作,尽可能固定在单一节点,尽量降低网络开销、集群竞争、一致性块获取和日志刷盘等带来的影响。

关于Oracle RAC的并行度处理. 
参数为:
alter session set parallel_force_local=true;
也可以给整个系统增加参数设置
alter system set parallel_force_local=true;

注意 parallel 并发执行SQL是oracle的一个特性. 使用本地并发执行仅是不使用多个Oracle RAC节点的资源 避免GC CR等的争用, 并行度还是存在的

默认并行度
单实例 = PARALLEL_THREADS_PER_CPU x CPU_COUNT
RAC = PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT

需要注意 这里的并发度与表和索引支持的事务并发度是两个概念.

Oracle10g 之后 单个block 默认都支持 255个事务. 
11g 之后修改 系统级的并行度的修改SQL为:
ALTER SYSTEM SET parallel_degree_limit = 16;

其他部分

awr的报告需要仔细注意一下:

RAC Statistics-Interconnect Stats

如果两个节点的 延迟比较高. 那么就会出现表严重的 gc 相关的等地事件, 会导致系统反应变慢. 

RAC的终极进化

Oracle RAC的终极进化其实是 Oracle的exadata. 

Oracle Exadata 可以看作是 Oracle RAC(Real Application Clusters)的终极进化形态。
Oracle RAC 是一种基于共享存储的集群解决方案,允许多个物理服务器共享同一个数据库实例,提供高可用性和扩展性。

而 Oracle Exadata 是一种专为数据仓库和在线事务处理(OLTP)工作负载设计的高性能存储服务器。
它整合了存储、计算和网络的功能,以及专用的硬件加速器和优化软件,以实现高效的数据处理和查询。

Oracle Exadata 融合了 Oracle Database 技术和硬件优化,提供了卓越的性能和可扩展性,特别适用于大型企业和对性能要求极高的应用。
它通过使用 InfiniBand 网络连接多个存储服务器和数据库服务器,实现了高速的数据传输和协同处理。

在 Oracle Exadata 中,数据库的查询和分析可以在存储服务器上进行,并利用存储服务器上的智能存储索引和压缩功能来提高性能。
此外,Exadata 还具备自动化管理功能,可以智能地分配资源、优化查询和负载平衡,以提供最佳的性能和可靠性。

总而言之,Oracle Exadata 在 Oracle RAC 的基础上,进一步集成了存储和计算资源,
提供了针对数据仓库和 OLTP 工作负载优化的强大解决方案,旨在满足高性能和可扩展性的企业需求。

Oracle Exadata 中,有谓词过滤(Predicate Filtering)和下推(Predicate Pushdown)的优化技术,
旨在在存储服务器上执行过滤操作,从而减轻数据库服务器的负担。

谓词过滤是指将查询的条件(谓词)应用于存储服务器上的数据,以过滤出满足条件的数据行。
这可以减少数据库服务器从存储服务器读取的数据量,提高查询性能。

下推是指将查询的谓词推送到存储服务器上,以在存储服务器上执行过滤操作。
这样可以减少数据库服务器传输的数据量,并将过滤操作分摊到存储服务器上进行,从而提高整体查询性能。

Oracle Exadata 利用存储服务器上的智能存储索引和压缩功能,通过谓词过滤和下推,
可以在存储服务器上过滤和压缩数据,只将满足查询条件的结果返回给数据库服务器。
这种方式避免了在数据库服务器上处理大量的未过滤数据,减少了数据传输的成本和响应时间。

谓词过滤和下推是 Oracle Exadata 的核心优化功能之一,可以提高查询性能、减少数据传输和存储开销,
特别适用于大规模的数据仓库和分析工作负载。

需要注意的是,谓词过滤和下推的效果受多个因素影响,包括查询的复杂性、数据分布情况、存储索引的选择和数据压缩策略等。
对于特定的查询优化,建议根据具体的场景和需求,通过综合考虑数据库设计、统计信息、索引和存储设置等因素,进行合理的配置和调整。