在RAC中,我们可以通过设置跨节点并行,将并行操作分布到RAC中的不同节点同时进行,以便发挥整个RAC环境的最大运算能力。在RAC中设置跨节点并行主要是通过设置parallel_instance_group和instance_groups这两个参数进行的。
instance_groups这个参数主要是设置该节点实例是否属于某一个实例组,这个实例组的命名可以根据你的需要随便命名,而没有严格的限制。每个节点可以设置多个不同的实例组名,实例组名用逗号隔开,比如:instance_groups=crm,erp,oltp。这样只要其他节点的instance_groups参数中有设置成一个一样的名字,就表示这个节点也属于这个实例组。比如在一个4节点RAC的环境中,A节点的instance_groups设置为(crm,erp,oltp),B节点设置为(crm,oltp),C节点设置为(crm,erp),D节点设置为(crm,erp,oltp),那么就有A、B、C、D这4个节点共同组成crm这个实例组,A、C、D这3个节点组成erp这个实例组,A、B、D这3个节点组成oltp这个实例组。
parallel_instance_group设置的值为instance_groups里面设置的值,表明这个节点上面进行的并行操作可以跨越哪些实例组。回到上面的例子,假如A节点的parallel_instance_group设置为crm,由于crm这个实例组的成员是A、B、C、D四个节点都有,那么A节点上的并行操作就可以跨越所有的4个节点。如果A节点的parallel_instance_group设置为erp,那么A节点并行操作就可以跨越A、C、D这3个节点。如果一个节点的parallel_instance_group设置的参数在instance_groups中没有设置,那么这个节点的并行操作将只会在本节点进行,假如B节点的parallel_instance_group设置为erp,那么它上面的并行操作将不会跨节点进行。
默认情况下这两个参数都为空,那么并行操作默认将会是跨节点并行的。当然并不是设置了这两个值就一定会发生跨节点并行,是由优化器和RAC的负载均衡机制共同决定一个并行操作是否跨节点并行,需要跨越实例组中的哪几个节点并行还是实例组的所有节点并行,每个节点分配多少个并行进程工作。由于跨节点并行还有内部互联通信的开销,因此并不一定就会比单节点并行会快多少,只有那些很大的并行操作可能才需要到跨节点并行。这个可以根据测试再进行变更。在我们运行的实际案例中,由于跨节点并行的机制比较复杂,有时候会触发一些BUG,甚至并行度为DEFAULT的表在进行跨节点并行DML时一个并行进程死掉导致整个节点宕机。推荐的做法是系统级别的parallel_instance_group这个参数不要设置,不同的程序在部署之前做好测试工作,看是否需要跨节点并行。由于parallel_instance_group是可以在会话级别设置的,可以修改一些需要跨节点并行的程序在执行之前先执行alter session set parallel_instance_group=……一下,然后只限制这些程序跨节点并行。
通过真正应用集群利用并行操作
作者:Kevin Conlon
如何在 RAC 环境中使用并行操作,以利用您的集群体系结构中的所有服务器硬件
<!--use same subhed/sub-subhed treatment as previously-->自从 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 包含了测试环境的一个示意图。
![]() |
<!-- Generated by Simple Tags 1.2.4 - http://wordpress.org/extend/plugins/simple-tags -->
用于查看并行统计数据的 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 环境中使用并行操作提供了利用属于集群体系结构的所有服务器硬件的灵活性。利用例程组,数据库管理员能够根据应用需求或服务水平协议进一步控制这些资源的分配。
http://www.oracle.com/technology/global/cn/pub/articles/conlon_rac.html
http://rdc.taobao.com/blog/dba/html/217_rac-span-paralle.html