oracle RAC環境分散式計算(prallel能力)設定 --轉載

denglt發表於2011-10-27

在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=……一下,然後只限制這些程式跨節點並行。

 

PARALLEL_INSTANCE_GROUP是並行查詢使用的組的名字,如果這個引數是空的,那麼說明PQ可以使用資料庫的所有例項。如果指定了某個名字,那麼說明PQ只能在指定的INSTANCE GROUP裡進行。

PARALLEL_INSTANCE_GROUP引數是可以在會話級動態修改的,因此通過調整這個引數,可以控制並行查詢的範圍。這個特性對於雙節點RAC和多節點RAC都十分有用。

要注意的是在不同的ORACLE版本中,這2個引數的設定是不同的,因此要了解詳細的資訊,請參考相關手冊。比如在很多版本中,如果設定了一個不存在的GOUP,那麼該SQL會使用序列方式執行,而不使用PQ,在有些版本中,錯誤的PARALLEL_INSTANCE_GROUP會報錯。

通過真正應用叢集利用並行操作
作者:Kevin Conlon

如何在 RAC 環境中使用並行操作,以利用您的叢集體系結構中的所有伺服器硬體

<!--use same subhed/sub-subhed treatment as previously--&gt自從 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 --&gt

用於檢視並行統計資料的 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 體系結構來使用並行查詢的方法。需要執行兩種型別的測試:

 

  1. 一種不受限制的測試,其中查詢將在兩個 RAC 節點上執行
  2. 一種受限制的測試,其中查詢將限制在單個 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 環境中使用並行操作提供了利用屬於叢集體系結構的所有伺服器硬體的靈活性。利用例程組,資料庫管理員能夠根據應用需求或服務水平協議進一步控制這些資源的分配。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/195110/viewspace-709781/,如需轉載,請註明出處,否則將追究法律責任。

相關文章