首页 > Linux操作系统 > Linux操作系统 > 通过真正应用集群利用并行操作
如何在 RAC 环境中使用并行操作,以利用您的集群体系结构中的所有服务器硬件
自从 7.1 版本第一次引入并行操作后,通过 Oracle Database 来使用该特性已为大家所熟悉。在传统的基于 UNIX 的对称多处理器 (SMP) 体系结构上并行执行 SQL 语句的能力大大提高了服务器的利用率,并加快了大型的资源密集型操作的执行速度。在真正应用集群 (RAC) 体系结构中,并行 SMP 部署等价于使用集群中所有可用的服务器。
在本文中,我将概述通过 RAC 来使用并行操作,以利用向外伸缩的集群体系结构。
并行目标和选项
并行的目标是利用数据库平台体系结构的所有可用的资源,以加快总体的处理速度。这些资源包括内存、处理器和 I/O。
可以在任意向上伸缩或单系统 SMP 映象环境中执行的并行操作也同样可以在向外伸缩的 RAC 集群环境中执行。这些操作包括:
可以使用标准 SQL 提示来执行上述列表中的操作 1 到 4,或通过在对象级的 INIT.ORA 参数设置并行度来执行,这个参数可以用来将并行操作限制在特定节点上。因而,对于更大的 RAC 体系结构(超过两台服务器),可以将特定的服务器分配给指定的组以限制或启用操作。
使用模式
对于通过 RAC 进行的并行执行,存在许多使用模式。它们是:
INIT.ORA 参数
存在一些与参数控制相关的标准参数,这些参数配置服务器级的并行进程。RAC 环境的唯一变化是集群中的每一个服务器支持这些进程中的单独的一组。不过,可以在所有例程上全局设置这些参数也可以在特定的例程级上设置这些参数。
在表 1 列出了两个常见的并行参数。
| 参数名 | 类型 | 说明 |
| parallel_max_servers | 整型 | 每个节点的最大并行进程数 |
| parallel_min_servers | 整型 | 每个节点的最大服务器进程数 |
表 2 中列出了一个 RAC 特有的参数。
| 参数名 | 类型 | 说明 |
| instance_groups | 字符串 | 定义逻辑组,以实现对特定服务器的处理 |
RAC 体系结构示例
对于本文中列出的示例,我们将利用一个运行在 Red Hat Advanced Server 2.1 下的一个两节点的 RAC 体系结构。图 1 包含了测试环境的一个示意图。
如何在 RAC 环境中使用并行操作,以利用您的集群体系结构中的所有服务器硬件
自从 7.1 版本第一次引入并行操作后,通过 Oracle Database 来使用该特性已为大家所熟悉。在传统的基于 UNIX 的对称多处理器 (SMP) 体系结构上并行执行 SQL 语句的能力大大提高了服务器的利用率,并加快了大型的资源密集型操作的执行速度。在真正应用集群 (RAC) 体系结构中,并行 SMP 部署等价于使用集群中所有可用的服务器。
在本文中,我将概述通过 RAC 来使用并行操作,以利用向外伸缩的集群体系结构。
并行目标和选项
并行的目标是利用数据库平台体系结构的所有可用的资源,以加快总体的处理速度。这些资源包括内存、处理器和 I/O。
可以在任意向上伸缩或单系统 SMP 映象环境中执行的并行操作也同样可以在向外伸缩的 RAC 集群环境中执行。这些操作包括:
查询(基于全表扫描)
Create Tabel As 特性
索引构建
分区表上的 DML 操作(插入、更新、删除)
数据加载
可以使用标准 SQL 提示来执行上述列表中的操作 1 到 4,或通过在对象级的 INIT.ORA 参数设置并行度来执行,这个参数可以用来将并行操作限制在特定节点上。因而,对于更大的 RAC 体系结构(超过两台服务器),可以将特定的服务器分配给指定的组以限制或启用操作。
使用模式
对于通过 RAC 进行的并行执行,存在许多使用模式。它们是:
大数据集的并行查询的标准用法。在这种情况下,可以定义并行度来利用整个集群的所有可用资源。
使用受限的并行查询。这种情况将处理限制在集群中的特定节点上。因而可以对节点进行逻辑分组,以使用特定的操作类型。
并行索引构建/重建。在需要大规模索引构建的情况下,可以利用并行化来使集群节点资源的利用率最大化。与查询的情况类似,通过对服务器逻辑分组,可以限制这些操作。
INIT.ORA 参数
存在一些与参数控制相关的标准参数,这些参数配置服务器级的并行进程。RAC 环境的唯一变化是集群中的每一个服务器支持这些进程中的单独的一组。不过,可以在所有例程上全局设置这些参数也可以在特定的例程级上设置这些参数。
在表 1 列出了两个常见的并行参数。
参数名 类型 说明
parallel_max_servers 整型 每个节点的最大并行进程数
parallel_min_servers 整型 每个节点的最大服务器进程数
表 1:常见的并行 INIT.ORA 参数
表 2 中列出了一个 RAC 特有的参数。
参数名 类型 说明
instance_groups 字符串 定义逻辑组,以实现对特定服务器的处理
表 2:RAC 特有的并行 INIT.ORA 参数
RAC 体系结构示例
对于本文中列出的示例,我们将利用一个运行在 Red Hat Advanced Server 2.1 下的一个两节点的 RAC 体系结构。图 1 包含了测试环境的一个示意图。
![]() |
用于查看并行统计数据的 V$ 表
存在许多用于查看并行操作统计数据的表。最有用的两个表在表 3 中列出。以下的表名称以 GV$ 标识符为前缀。对于 RAC 实施,存在一组额外的全局视图,这些视图包含了一个额外的列,用于例程标识符。除了这一列之外,其余的列与相同名称的 V$ 结构相同。
视图名称 说明
GV$PQ_SYSSTAT 全部 RAC 配置的所有与并行相关的统计数据
GV$PQ_SESSTAT 按会话 ID 提供的会话特有的并行统计数据
表 3:与并行操作 V$ 相关的表
并行设置和基准
测试的基本 INIT.ORA 参数定义如下。注意 "*" 号定义参数为跨所有 RAC 例程的全局参数。
*.parallel_max_servers=5
*.parallel_min_servers=2
以下列表显示 SALES1 和 SALES2 例程都在数据库启动时启动了两个并行的后台进程。
UID PID PPID C STIME TTY TIME CMD
oracle 28216 1 0 11:07 ?00:00:00 ora_p000_SALES1
oracle 28218 1 0 11:07 ?00:00:00 ora_p001_SALES1
oracle 620 1 0 11:09 ?00:00:00 ora_p000_SALES2
oracle 622 1 0 11:09 ?00:00:00 ora_p001_SALES2
GV$PQ_SYSTAT 表的一个查询显示 Oracle 内核中的并行进程的基本状态。
select inst_id,statistic,value
from gv$pq_sysstat
where value > 0
order by 1, 2;
INST_ID STATISTIC VALUE
-------- -------------------------------- ---------
1 Servers Busy 1
Servers Idle 1
Servers Highwater 1
Server Sessions 1
2 Servers Busy 1
Servers Idle 1
Servers Highwater 1
Server Sessions 1
并行查询测试示例
在这一部分中,我们将查看本文之前提到的通过两个节点的 RAC 体系结构来使用并行查询的方法。需要执行两种类型的测试:
一种不受限制的测试,其中查询将在两个 RAC 节点上运行
一种受限制的测试,其中查询将限制在单个 RAC 节点上。
测试案例 1:不受限制的测试。在不受限制的测试中,通过并行提示,利用标准 SQL 来运行简单的查询。和任何查询一样,要利用并行操作,语句中必须包含全表扫描。
select /*+ full(c_stock) parallel(c_stock,6) */ sum(s_quantity) odcnt
from c_stock
/
根据并行提示(请求六个并行工作线程),在每个服务器节点上启动了三个进程。
UID PID PPID C STIME TTY TIME CMD
oracle 13878 1 0 14:17 ?00:00:03 ora_p000_SALES1
oracle 13880 1 0 14:17 ?00:00:03 ora_p001_SALES1
oracle 13940 1 1 14:23 ?00:00:02 ora_p002_SALES1
oracle 18601 1 0 14:20 ?00:00:01 ora_p000_SALES2
oracle 18603 1 0 14:20 ?00:00:01 ora_p001_SALES2
oracle 18652 1 3 14:28 ?00:00:01 ora_p002_SALES2
来自 GV$PQ_SYSTAT 的统计数据显示了在一个额外的服务器上启动的每一个例程。
INST_ID STATISTIC VALUE
---------- ------------------------------ ----------
1 DFO Trees 5
Distr Msgs Recv'd 49
Distr Msgs Sent 49
Local Msgs Recv'd 110
Local Msgs Sent 101
Queries Initiated 5
Server Sessions 9
Servers Busy 1
Servers Highwater 3
Servers Idle 1
Servers Shutdown 1
Servers Started 1
Sessions Active 1
2 Distr Msgs Recv'd 12
Distr Msgs Sent 6
Server Sessions 6
Servers Busy 1
Servers Highwater 3
Servers Idle 1
Servers Shutdown 1
Servers Started 1
测试案例 2:受限制的测试。为了将并行处理限制在特定的集群节点上,应用了例程组来创建逻辑服务器组。控制是通过 INIT.ORA 的参数 INSTANCE_GROUPS 进行的。INSTANCE_GROUPS 是一个与 RAC 相关的参数,并只在并行模式中指定。与运行期参数 PARALLEL_INSTANCE_GROUP 结合使用,它允许将并行查询操作限制在有限数量的例程上。
对于本部分中的测试,将利用下面指定的 INSTANCE_GROUPS。
# Init.ora Parameter Setting for Parallel Options
SALES1.INSTANCE_GROUPS='marketing'
SALES2.INSTANCE_GROUPS='finance'
在查询执行之前修改以下会话,以分配给 FINANCE 组。即使查询是在 SALES1 节点上启动,根据 INSTANCE_GROUP 设置,所有的处理将在 SALES2 上执行。
alter session set parallel_instance_group = 'finance';
select /*+ full(c_stock) parallel(c_stock,6) */ sum(s_quantity) odcnt
from c_stock
/
注意在进程列表中,所有请求的并行工作线程实际上都只在 SALES2 节点上运行,因为 SALES1 上的进程没有使用 CPU 时间。
UID PID PPID C STIME TTY TIME CMD
oracle 29994 1 0 14:13 ?00:00:00 ora_p000_SALES1
oracle 29996 1 0 14:13 ?00:00:00 ora_p001_SALES1
oracle 2631 1 0 14:51 ?00:00:01 ora_p000_SALES2
oracle 2633 1 0 14:51 ?00:00:01 ora_p001_SALES2
oracle 2676 1 4 14:57 ?00:00:01 ora_p002_SALES2
oracle 2678 1 3 14:57 ?00:00:01 ora_p003_SALES2
oracle 2680 1 4 14:57 ?00:00:01 ora_p004_SALES2
GV$PQ_SYSTAT 表的一个查询还显示在第二个 SALES2 例程上启动了额外的三个服务器。为什么只是三个服务器而不是四个?记住 INIT.ORA 参数 parallel_max_servers 的设置。该参数的值是 5,因而只往原来的 2 个服务器中增加了额外的 3 个服务器。
INST_ID STATISTIC VALUE
---------- ------------------------------ ----------
1 DFO Trees 3
Distr Msgs Recv'd 74
Distr Msgs Sent 74
Local Msgs Recv'd 2
Local Msgs Sent 1
Queries Initiated 3
Server Sessions 1
Servers Busy 1
Servers Highwater 1
Servers Idle 1
Sessions Active 2
2 Distr Msgs Recv'd 22
Distr Msgs Sent 11
Server Sessions 11
Servers Busy 6
Servers Highwater 6
Servers Started 3
在上面的例子中,利用 FINANCE 例程组,查询被限制在 SALES2 节点上。下面的 INIT.ORA 示例允许 FINANCE 例程组立即在 SALES1 和 SALES2 节点上运行。注意必须为各个组显式地输入 INIT.ORA 参数 INSTANCE_GROUPS。
# Init.ora Parameter Setting for Parallel Options
SALES1.instance_groups='marketing'
SALES1.instance_groups='finance'
SALES2.instance_groups='finance'
Create Table As 特性
为表对象创建拷贝时,Oracle 中的 Create Table As (CTAS) 特性极其有用。对于大型表,可以用和前面的并行查询示例中所用的相同方式并行地执行操作。下面的 SQL 语句是利用并行选项使用 CTAS 的一个例子。也可以使用例程组来将处理限制在特定的节点上。因此,根据 INSTANCE_GROUPS 参数,查询的运行将只在 SALES1 节点上执行。
alter session set parallel_instance_group = 'marketing';
create table c_district_backup parallel (degree 3)
as
select *
from c_district
/
索引构建
为大型表执行索引创建或重建是又一种资源密集型的操作,在其中使用并行操作可以大大提高性能。index create 语句要求操作的并行度为 6。与之前的例子类似,这个操作还可以利用 INSTANCE_GROUPS 参数来将操作限制在特定的节点上。
alter session set parallel_instance_group = 'marketing';
create unique index C_STOCK_I1 on C_STOCK (s_i_id, s_w_id)
tablespace stock_indx
parallel (degree 6)
/
要考虑的性能因素
并行操作的缺点是极度消耗服务器资源。最容易监控的服务器资源是 CPU 使用率。如果正常的 CPU 使用率相当高,那么不推荐部署大量的并行进程。超过 CPU 的总数也将导致性能下降。
数据布局是另一个需考虑的直接因素。如果目前存在 I/O 瓶颈,那么使用并行操作可能加剧这种状况。请确保并行目标对象的数据文件分布在适当数量的磁盘主轴上。
结论
在 RAC 环境中使用并行操作提供了利用属于集群体系结构的所有服务器硬件的灵活性。利用例程组,数据库管理员能够根据应用需求或服务水平协议进一步控制这些资源的分配。
INSTANCE_GROUPS指出了本实例属于的GROUP的名字。这个参数可以指定多个值,用“,”分开。也就是说一个实例可以属于多个实例组。实例组通过名字来区分
PARALLEL_INSTANCE_GROUP是并行查询使用的组的名字,如果这个参数是空的,那么说明PQ可以使用数据库的所有实例。如果指定了某个名字,那么说明PQ只能在指定的INSTANCE GROUP里进行。
PARALLEL_INSTANCE_GROUP参数是可以在会话级动态修改的,因此通过调整这个参数,可以控制并行查询的范围。
文章出自:http://www.oracle.com/technology/global/cn/pub/articles/conlon_rac.html
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11134237/viewspace-665821/ ,如需转载,请注明出处,否则将追究法律责任。