【Oracle 12c Flex Cluster專題 】— Leaf Node的故障遷移

沃趣科技發表於2017-07-21
沃趣科技  周天鵬(譯

Oracle 在12c中使用hub-and-spoken技術實現了Flex Cluster的功能(即RAC叢集中的每個節點不再需要既執行ASM例項又執行DB例項,各節點可以扮演不同的角色)。相比12c以前的版本,該功能使叢集規模的擴大和縮減變得更加靠譜。原因如下:

  • 叢集中各節點間網路的互相干擾變得更少。

  • 關鍵的叢集元件爭用更少,如OCR, VOTING DISK。

一個Flex Cluster中可以包含兩類節點,分別是hub node和leaf node。

Hub Node

  • 這種節點幾乎完全等價於12c以前版本的傳統RAC節點,在12c中這種節點就是叢集的核心(為什麼說是核心呢?因為後面會介紹12c flex cluster中的非核心節點——leaf node)。

  • 每個hub node之間透過私網連線,而且需要配置ssh對等性。

  • 每個節點需要訪問共享儲存,因為ocr voting都依賴於共享儲存。

  • hub node上既執行ASM例項又執行db例項。

  • 每個flex cluster至少一個hub node最多64個hub node。

Leaf Node


  • 相比hub node , leaf node對於叢集來說不是那麼核心,與叢集耦合度很低,而且leaf node之間不需要互聯。

  • 每個leaf node透過一個hub node連線叢集並獲取資料。

  • 雖然leaf node不要求直接訪問共享儲存,但最好還是連上共享儲存,因為說不準未來哪天就要把這個leaf node轉為hub node使用。

     (這裡譯者補充下:雖然leaf node啟動叢集件是不依賴共享儲存的,但當leaf node以只讀開啟了某資料庫時,也就是這個leaf node上執行著資料庫例項時,這個leaf node就變成了reader node,官方明確說了reader node是必須連線共享儲存的。官方連線:)

  • 他們上面執行著輕量版的叢集件。

  • leaf node上面不能執行ASM例項,也不能在上面建庫,因為上面執行的例項開啟方式只能是隻讀的。

  • leaf node上可執行多種應用,例如中介軟體、EBS、IDM等,leaf node上的應用會在leaf node掛掉後自動切換到其他leaf node。

  • 一個flex cluster中可包含0個或多個leaf node。

  • leaf node和hub node擁有相同的公網和私網。

即使flex cluster中沒有一個leaf node, hub node也可以正常的像傳統rac節點一樣工作。但如果flex cluster中只有leaf node沒有一個hub node是萬萬不可的,因為leaf node需要透過hub node上的asm例項獲取資料。

當叢集件啟動在leaf node上時,leaf node就會根據GNS資訊查詢所有hub node,然後選擇其中一個hub node來獲取資料(配置GNS是使用leaf node的重要前提)。一個hub node同時可能被0個或多個leaf node連線,而一個leaf node同時只能連線一個hub node。hub node和leaf node之間也會交換心跳資訊,只有這樣leaf node才能加入叢集並作為叢集的一部分。

標準叢集可無痛轉換為flex cluster,但flex cluster無法轉為標準叢集,除非你重新配置(約等於重灌)。

當作為叢集的一部分的某hub node掛了,將發生什麼?

當發生如下情況時,hub node會被從叢集中移除:

  •  被驅逐

  •  伺服器關機

  •  手動停止Oracle叢集件

這種情況發生時,連線著這個hub node的leaf node會自動挑一個活著的hub node來作為資料來源。 這篇文章中,我會論證: 

  • 如何確定leaf node連的是那個hub node? 

  • 當leaf node連線的hub node掛了後,這個leaf node如何進行故障遷移?

現狀:

為了更好的闡述,我搭建瞭如下結構的12.1.0.2c的flex cluster:

  • hub node

  • host01 

  • host02

  • host03 

  • leaf node 

  • host04 

  • host05

論證:

確定hub node host01和leaf node host04是活著的:

[root@host01 log]# crsctl get node role status -all
Node 'host01' active role is 'hub'
Node 'host04' active role is 'leaf'

因為當前host01是叢集中唯一活著的hub node,所以host04一定連的是host01。而且,host04的警告日誌中也可以證明這個事實:

這時啟動host02和host05:

[root@host01 log]# crsctl get node role status -all
Node 'host01' active role is 'hub'
Node 'host02' active role is 'hub'
Node 'host04' active role is 'leaf'
Node 'host05' active role is 'leaf'

為了確定host05連得是那個hub node,我們看下ocssdrim程式的trace檔案: 

[root@host05 trace]#export ORACLE_BASE=/u01/app/grid
[root@host05 ~]# cat  $ORACLE_BASE/diag/crs/host05/crs/trace/ocssdrim.trc |grep 'Sending a ping msg to' | tail -1
2016-05-04 11:12:01.008283 :    CSSD:1086187840: clssbnmc_PeriodicPing_CB: Sending a ping msg to host host01, number 1, using handle (0x14055d0) last msg to hub at 4294948750, connection timeout at 11454, current time 4294951260]]

我們可以看到host05連得也是host01。

讓我們停掉host01上的叢集件,來確定所有leaf node都能故障切換到叢集中其他存活的hub node,在這裡就是host02:

[root@host01 log]# crsctl stop crs
[root@host02 ~]# crsctl get node role status -all
Node 'host02' active role is 'hub'
Node 'host04' active role is 'leaf'
Node 'host05' active role is 'leaf'

確定host04切到了host02:

[root@host04 ~]# cat  $ORACLE_BASE/diag/crs/host04/crs/trace/ocssdrim.trc |grep 'Destroying connection' | tail -1
2016-05-04 11:17:31.932770 :    CSSD:1085761856: clssbnmConnDestroy: Destroying connection object (0x1061200) for host host01

[root@host04 ~]# cat  $ORACLE_BASE/diag/crs/host04/crs/trace/ocssdrim.trc |grep 'Sending a ping msg to' | tail -1
2016-05-04 11:18:21.860771 :    CSSD:1085761856: clssbnmc_PeriodicPing_CB: Sending a ping msg to host host02, number 2, using handle (0x17e2fe0) last msg to hub at 1404044, connection timeout at 1434044, current time 1405324

確定host05切到了host02:

[root@host05 ~]# cat  $ORACLE_BASE/diag/crs/host05/crs/trace/ocssdrim.trc |grep 'Destroying connection' | tail -1
2016-05-04 11:17:31.873993 :    CSSD:1086187840: clssbnmConnDestroy: Destroying connection object (0x16979f0) for host host01

[root@host05 ~]# cat  $ORACLE_BASE/diag/crs/host05/crs/trace/ocssdrim.trc |grep 'Sending a ping msg to' | tail -1
2016-05-04 11:17:36.751628 :    CSSD:1086187840: clssbnmc_PeriodicPing_CB: Sending a ping msg to host host02, number 2, using handle (0x10950b0) last msg to hub at 318184, connection timeout at 348184, current time 319664

總  結

  • 12c引入的flex cluster有兩種節點,hub node和leaf node。

  • 鑑於hub node可以訪問共享儲存,leaf node不直接訪問共享儲存,而是透過某個hub node連入叢集。

  • 當leaf node上的叢集件啟動時,leaf node自動使用GNS來發現所有hub node,然後透過其中一個hub node連入叢集。

  • 如果hub node掛了,那麼透過這個hub node訪問叢集的leaf node會自動切換至某存活的hub node繼續訪問叢集。


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

相關文章