天天看點

11gR2新特性---gipc守護程序

在這篇文章中,我們會對11gR2 新的守護程序gipcd(資源名稱ora.gipcd)進行介紹,其中包括gipc的功能,啟動順序和一些基本的測試。 

我們知道,對于oracle叢集來說,叢集私網是非常重要的,無論是叢集的網絡心跳,節點間通信還是資料庫的cache fusion 都需要通過私網來實作。是以,我們會在很多的文檔中都看到oracle叢集的私網要穩定而且高速,要使用交換機,不能使用直連線(詳細的原因可以參考Note 220970.1:RAC: Frequently Asked Questions,本文不作過多的解釋)。如果可能的話,對叢集私網網卡配置備援/負載均衡,以確定叢集私網的穩定和高效。 但是,在10gR2 和11gR1的版本上,這需要借助第三方軟體來實作,例如:Linux bonding, AIX EtherChannel, HP-UX APA 等。大部分的網卡聚合軟體都會将多個網絡接口聚合成為一個邏輯接口(當然,不同的聚合軟體會有不同的實作方式,在這裡不做讨論)。在安裝和配置10g 和11.1 版本的叢集時,如果您對叢集私網的網絡接口進行了聚合(備援或負載均衡),隻需要将聚合後的網卡名稱和對應的subnet資訊告訴叢集,換句話說,網卡聚合對oracle叢集來說是透明的。但是,這也會給叢集帶來一些不穩定性,如果網卡聚合配置不正确,當被聚合的網卡之一出現問題時,叢集很可能認為私網出現問題而導緻很嚴重的問題,例如:節點重新開機,執行個體重新開機等。

正是由于以上的問題,從11gR2開始(具體點說,從11.2.0.2開始),oracle決定由叢集自己來管理私網網卡,叢集新特性gipc(Grid

IPC)被介紹,這個新特性以守護程序gipcd.bin的形式存在于叢集中,主要的功能有。

當叢集啟動時,發現叢集的私網網卡。當然,基于之前文章的介紹,叢集私網的資訊是從gpnp profile中獲得的。并對發現的私網接口進行檢查。

利用之前發現的私網網卡,發現叢集中的其他節點,并和其他節點的私網網卡建立聯系。

如果叢集配置了多塊私網網卡,當某個節點的某一個/幾個私網網卡出現問題時,離線有問題的私網,并通知其他節點。

當然,oracle依然支援使用第三方網卡聚合軟體對叢集私網進行備援/負載均衡配置,但是,這顯然不是個好主意。

另外,在和一些同僚和朋友探讨時也發現,很多朋友對gipc

和HAIP的概念和功能還不是很清楚,在這裡也做一些解釋。我們知道,叢集私網主要負責兩類資料的通信。第一種:叢集層面的資料通信,例如:ocssd.bin網絡心跳,crsd.bin之間的通信等;第二種:oracle RAC 通信,例如:ASM 執行個體間的通信,資料庫執行個體間的通信等。而且,第二種資料通信的工作負載要遠遠大于第一種。gipc,作為管理叢集私網的程序,它需要向叢集中的其他元件提供叢集的私網資訊,但是這程序并不負責傳遞具體的資訊,具體的資訊,仍然由對應的程序自己傳輸,當然,這主要針對第一種資料通信。正是由于gipc的出現,oracle 叢集具有了管理叢集私網的能力,而且第二種資訊工作負載又很大,同時叢集管理的主要資源就是資料庫,HAIP 應運而生,作為實作oracle RAC通信的高可用/負載均衡的實作方法,來完成叢集第二種資訊的傳遞。是以,很多時候,如果我們發現隻是HAIP出現問題時,受影響的會是資料庫執行個體和ASM執行個體,而叢集層面(也就是NM層面)的一緻性仍然能夠保證,而且叢集的成員也不會發生改變。對于HAIP,本文不作過多介紹,更多資訊,請參考之前的文章 “​​Redundant Interconnect

with Highly Available IP (HAIP) ​​​​簡介​​”。

接下來,我們通過叢集的一些日志對之前的内容進行一些驗證。

1.叢集啟動時的gipcd.log

2013-07-17

12:28:28.071: [ default][3041003216]gipcd START pid=22337 Oracle Grid IPC

Daemon

12:28:28.072: [ GIPCD][3041003216]

gipcdMain: gipcd Started <<<<<< gipcd守護程序被啟動了。

……

12:28:29.046: [ GPNP][3041003216]clsgpnp_getCachedProfileEx: [at clsgpnp.c:613] Result:

(26) CLSGPNP_NO_PROFILE. Can't get offline GPnP service profile: local gpnpd is

up and running. Use getProfile instead.

12:28:29.046: [ GPNP][3041003216]clsgpnp_getCachedProfileEx: [at clsgpnp.c:623] Result:

(26) CLSGPNP_NO_PROFILE. Failed to get offline GPnP service profile.

12:28:29.066: [ GPNP][3041003216]clsgpnpm_newWiredMsg: [at clsgpnpm.c:741] Msg-reply has

soap fault 10 (Operation returned Retry (error CLSGPNP_CALL_AGAIN)) [uri

"http://www.grid-pnp.org/2005/12/gpnp-errors#"] <<<< gipcd 嘗試通路gpnp profile但是沒有成功。由于log是在GI啟動時擷取的,這部分資訊可以忽略,因為原因是gpnpd還沒有成功啟動。

12:28:39.342: [ CLSINET][3023027088] # 0 Interface

'eth1',ip='192.168.254.30',mac='00-0c-29-a8-14-65',mask='255.255.255.0',net='192.168.254.0',use='cluster_interconnect'

12:28:39.342: [ CLSINET][3023027088] # 1 Interface

'eth2',ip='192.168.254.31',mac='00-0c-29-a8-14-6f',mask='255.255.255.0',net='192.168.254.0',use='cluster_interconnect'

<<<<< gipcd

發現了本地節點用于私網的網卡資訊,在這個叢集中有2塊網卡作為叢集的私網。

2013-07-17 12:28:39.344:

[GIPCHTHR][3025128336] gipchaWorkerUpdateInterface: created local bootstrap

interface for node 'single1', haName 'gipcd_ha_name', inf

'mcast://230.0.1.0:42424/192.168.254.30'

12:28:39.344: [GIPCHTHR][3025128336] gipchaWorkerUpdateInterface: created local

'192.168.254.30:46782'

12:28:39.345: [GIPCHTHR][3025128336] gipchaWorkerUpdateInterface: created local

bootstrap interface for node 'single1', haName 'gipcd_ha_name', inf

'mcast://230.0.1.0:42424/192.168.254.31'

'192.168.254.31:39332' <<<<<<< gipcd 用于叢集資料通信(就是我們之前提到的第一種資料通信)的endpoint 已經産生。

12:28:56.767: [GIPCHGEN][3023027088] gipchaNodeCreate: adding new node 0x9c107d8 { host 'single2', haName

'gipcd_ha_name', srcLuid 465fb26d-8b46eb95, dstLuid 00000000-00000000 numInf 0,

contigSeq 0, lastAck 0, lastValidAck 0, sendSeq [0 : 0], createTime 797327224,

flags 0x0 } <<<<< 遠端節點被發現。

12:28:58.415: [GIPCHTHR][3025128336] gipchaWorkerUpdateInterface: created

remote interface for node 'single2', haName 'gipcd_ha_name', inf

'udp://192.168.254.33:16663'

12:28:58.415: [GIPCHGEN][3025128336] gipchaWorkerAttachInterface: Interface

attached inf 0x9c0bb60

{ host 'single2', haName 'gipcd_ha_name', local 0xb4c4e590, ip '192.168.254.33:16663', subnet

'192.168.254.0', mask '255.255.255.0', numRef 0, numFail 0, flags 0x6 }

'udp://192.168.254.32:17578'

attached inf 0x9c0a900 { host 'single2', haName

'gipcd_ha_name', local 0xb4cb8eb8, ip '192.168.254.32:17578', subnet

'192.168.254.0', mask '255.255.255.0', numRef 0, numFail 0, flags 0x6 } <<<<<< gipcd 發現了遠端節點私網的網卡資訊。

12:29:36.120: [GIPCDMON][3027229584] gipcdMonitorSaveInfMetrics: inf[ 0] eth1 - rank 99, avgms 6.326531 [ 257 / 250 / 245 ]

12:29:36.120: [GIPCDMON][3027229584] gipcdMonitorSaveInfMetrics: inf[ 1] eth2 - rank 99, avgms 5.182186 [ 259 / 250 / 247 ] <<<<<gipcd 檢查本地私網網卡狀态。

 2. 當集���中的一個私網down掉時的gipcd.log。

13:23:20.346: [ CLSINET][3027229584] Returning NETDATA: 2 interfaces

13:23:20.346: [ CLSINET][3027229584] # 0 Interface

13:23:20.346: [ CLSINET][3027229584] # 1 Interface

2013-07-17 13:23:20.359:

[GIPCDMON][3027229584] gipcdMonitorSaveInfMetrics: inf[ 0] eth1 - rank 99, avgms 1.560694 [ 171 / 173 / 173 ]

13:23:20.359: [GIPCDMON][3027229584] gipcdMonitorSaveInfMetrics: inf[ 1] eth2 - rank 99, avgms 1.802326 [ 172 / 172 / 172 ] <<<<<<<< gipcd 仍然在進行私網檢查。

+++使用指令“ifconfig eth1 down”禁用叢集中的一個私網網卡。

13:23:44.397: [ CLSINET][3027229584] # 0 Interface

13:23:44.397: [GIPCDMON][3027229584] gipcdMonitorUpdate: interface went down -

[ ip 192.168.254.30, subnet 192.168.254.0, mask 255.255.255.0 ]

13:23:44.397: [GIPCDMON][3027229584] gipcdMonitorUpdate: msg sent to client

thread (([update(ip: 192.168.254.30, mask: 255.255.255.0, subnet

192.168.254.0), state(gipcdadapterstateDown)]))

<<<<<<<< gipcd 發現私網eth1 down掉,同時向它的客戶(例如:ocssd.bin)發送消息。

13:23:44.426: [GIPCHGEN][3025128336] gipchaInterfaceDisable: disabling

interface 0xb4c4e590

{ host '', haName 'gipcd_ha_name', local (nil), ip '192.168.254.30', subnet

'192.168.254.0', mask '255.255.255.0', numRef 0, numFail 1, flags 0x1cd }

13:23:44.428: [GIPCHGEN][3025128336] gipchaInterfaceDisable: disabling

interface 0x9c0bb60

'192.168.254.0', mask '255.255.255.0', numRef 0, numFail 0, flags 0x86 }

13:23:44.428: [GIPCHALO][3025128336] gipchaLowerCleanInterfaces: performing

cleanup of disabled interface 0x9c0bb60

'192.168.254.0', mask '255.255.255.0', numRef 0, numFail 0, flags 0xa6 } <<<<<<<<gipcd 開始清理本地私網eth1 的資訊,同時也清理掉與之對應的遠端節點私網的資訊。

13:24:08.747: [GIPCDMON][3027229584] gipcdMonitorSaveInfMetrics: inf[ 0] eth2 - rank 99, avgms 1.955307 [ 204 / 181 / 179 ] <<<<<<<gipcd 繼續檢查正常的私網網卡。

注意:在整個過程中,我們還會看到叢集的一緻性仍然能夠保證,不會出現節點離開叢集的現象。而且,我們還會看到原來運作在eth1上的HAIP,會failover到eth2 上,與此同時,資料庫和ASM執行個體一切正常。

3. 當網卡eht1恢複後。

++ 使用指令”ifconfig eth1 up”恢複網卡eth1

13:36:31.260: [GIPCDMON][3027229584] gipcdMonitorUpdate: New Interface found -

13:36:31.260: [GIPCDMON][3027229584] gipcdMonitorUpdate: msg sent to client

192.168.254.0), state(gipcdadapterstateUp)])) <<<<< gpicd 發現了新的私網網卡。

2013-07-17 13:36:31.471:

13:36:31.471: [GIPCHTHR][3025128336] gipchaWorkerUpdateInterface: created local

'192.168.254.30:55548' <<<<<< 本地的通信endpoint被建立。

13:37:11.493: [ CLSINET][3027229584] Returning NETDATA: 2 interfaces

13:37:11.493: [ CLSINET][3027229584] # 0 Interface

13:37:11.493: [ CLSINET][3027229584] # 1 Interface

13:37:11.510: [GIPCDMON][3027229584] gipcdMonitorSaveInfMetrics: inf[ 0] eth2 - rank 99, avgms 6.141304 [ 307 / 184 / 184 ] <<<<<<<<

<<<<<<<< gipcd進行私網檢查。

注意:在整個過程中,我們還會看到叢集的一緻性仍然能夠保證,不會出現節點離開叢集的現象。而且,我們還會看到之前failover到eth2上的HAIP,會重新回到eth1 上,與此同時,資料庫和ASM執行個體一切正常。

最後,我們需要強調的是,gipcd 雖然能夠管理叢集的私網,但是,如果私網網卡本身,或者節點間私網鍊路(或者性能)存在問題,gipcd仍然無法正常工作。另外,如果您在使用HAIP的同時,仍在使用了第三方的網卡聚合軟體(例如:Linux bonding,etherchannel等),最好使用最新版本的軟體,并且確定配置正确。