2022年1月25日 星期二

8. 管理 Grid Infrastructure

  • Grid Infrastructure 基礎操作 ----------

管理 Grid Infrastructure 最常使用的是 crsctl 與 srvctl 這兩個命令。 crsctl 主要是用來管理所有註冊在 Cluster Ware 上的 Resource 以及啟動與關閉 Cluster ,例如:

$ crsctl check crs

  (檢查 cluster 的總體狀態)

$ crsctl stat res –t

  (檢查 cluster 所有 Resource 的狀態)

# crsctl stop crs

# crsctl start crs

  (啟動與關閉 cluster , 需使用 root)

# crsctl disable crs

# crsctl enable crs

  (停用或啟用 cluster , enable 的狀態下在 server 開機時自動啟動 crs , disable 則不會)

$ crsctl query css votedisk

  (查詢 voting disk)

$ crsctl query crs activeversion

  (查詢目前 crs 使用的版本)

$ crsctl stat res ora.asm –f

  (查詢 ora.asm 這個 Resource 的詳細資訊)

$ crsctl status res -w "TYPE = ora.database.type" –t

  (僅列出與 Database 相關的 Resource)


其餘的所有命令可以使用 crsctl –h 來查詢。早期用來檢查 crs 的狀態可以使用 crs_stat –t ,不過這個命令在 Oracle 12c 之後已經不能使用,統一由 crsctl stat res –t 取代之。


srvctl 是用來管理與 Oracle 相關的 Resource ,也就是在 Cluster 裡面以 ora. 開頭的 Resource ,例如:

$ srvctl config scan

  (查詢 scan 的設定)

$ srvctl stop database –d orcl

$ srvctl start database –d orcl

  (啟動與關閉 orcl 這個資料庫)

$ srvctl stop instance –d orcl –i orcl1

$ srvctl start instance –d orcl –i orcl1

  (啟動與關閉節點一的 orcl1 這個 Instance)

$ srvctl config database -d orcl

  (查詢 orcl 這個資料庫在 Cluster 上面的設定)


其餘的詳細命令也可以使用 srvctl –h 來查詢。


除此之外, Cluster Verification Utility (CVU) 是一個用來檢查 Cluster 設定的一項工具,主要檢查各節點的設定是否有符合 Cluster 的需求,如果在安裝過程有檢查上的疏漏,不仿用 CVU 再來檢查一次。在 Grid Infrastructure 安裝完成之後,可以使用 cluvfy 命令來執行 CVU ,而在安裝軟體之下也提供了 runcluvfy.sh ,可以於安裝前先進行一次系統檢查:

$ cluvfy stage -post hwos -n oragrid1,oragrid2 –verbose

  (檢查 oragrid1 與 oragrid2 這兩個節點的設定)


Grid Infrastructure 的 log 包括 alert log 、 crs log 、 css log …等,在早期都存放在 $GRID_HOME/log ,到了 Oracle 12c 之後,這些 log 與 trace 都統一存放到 ADR ($ORACLE_BASE/diag) 底下了。


要查詢目前 Cluster 的所有節點成員,可使用 olsnodes 指令查詢:

# olsnodes -n –p


  • 管理 OCR 與 Voting Disk ----------

ocrcheck 與 ocrconfig 這兩個命令是用來檢查與管理 OCR ,在 Oracle 11gR2 之後,多了一個 OLR (Oracle Local Registry) 的概念, OLR 是用來紀錄本地資源的信息與配置,例如 Home 目錄位置、版本資訊、 OCR 資訊…等,每個節點都會有一份自己的 OLR ,在 OHASD 啟動時會來讀取 OLR 以獲得相關設定,因此 OLR 的重要性不亞於 OCR ,使用 ocrcheck 可以檢查 OLR 與 OCR 的狀態:

# ocrcheck –local (檢查 OLR)

$ ocrcheck (檢查 OCR)


OCR 的位置資訊除了可以使用 ocrcheck 檢查外,預設也會於 /etc/oracle/ocr.loc (Linux 平台) 這個檔案中記錄。


ocrconfig 可以用來新增、刪除、備份與還原 OCR , OCR 預設會備份在 $GRID_HOME/cdata 這個目錄底下:

# ocrconfig –manualbackup  (手動備份 OCR)

# ocrconfig –local –manualbackup (手動備份 OLR)

# ocrconfig –showbackup (查詢 OCR 的備份)

# ocrconfig –local –showbackup (查詢 OLR 的備份)

# ocrconfig –restore backup_20220110_173300.ocr (還原 OCR)

# ocrconfig –add +DATA2

# ocrconfig –delete +DATA1

  (新增與刪除 OCR)


Voting Disk 自 Oracle 11gR2 之後與 OCR 一同備份,無需單獨額外備份與還原,若有損毀則在 OCR 還原之後重新再 add Voting Disk 即可, Voting Disk 使用的是 crsctl 進行管理:

# crsctl query css votedisk 

(查詢 voting disk)

# crsctl replace votedisk +DATA2 

(新增或搬移 voting disk , 只有存放在 ASM 裡面才使用 replace)

# crsctl add css votedisk /ocrvote/votedisk3

# crsctl delete css votedisk /ocrvote/votedisk1

  (新增或刪除 voting disk , 只有不存放在 ASM 的路徑才使用 add 與 delete)


  • 管理網路設定 ----------

oifcfg 指令可以用來查詢以及變更 Grid Infrastructure 的網路設定,首先使用 oifcfg 查詢當前網路設定:

$ oifcfg iflist  (列出目前主機上所有的網卡與相對應的網段資訊)

$ oifcfg getif  (列出 Grid Infrastructure 所使用的網卡以及網段資訊)


除了查詢網路設定外, oifcfg 也可以用來變更內外網段與網卡,例如將對內的 Private 網段由網卡 eth2 、 網段 10.0.0.0 變更為網卡 eth3 、 網段 10.0.1.0 :

$ oifcfg setif -global eth3/10.0.1.0:cluster_interconnect

  (先設定新的網卡與網段)

$ oifcfg getif (確認新的設定)

# crsctl disable crs

# crsctl stop crs

  (停止 crs 服務)

--- 進行實體機器的網路變更 ---

# crsctl start crs

# crsctl enable crs

  (實體網路變更後啟動 crs)

$ oifcfg delif -global eth2/10.0.0.0  (刪除舊的網卡與網段)


同樣的使用 oifcfg 來變更對外 Public 網段,例如由 eth0 、 192.168.49.0 網段變更為 eth1 、 192.168.50.0 :

$ srvctl stop vip –n oragrid1

$ srvctl stop scan

  (首先停止與對外網段 IP 相關服務)

$ oifcfg setif –global eth1/192.168.50.0:public

  (設定新網卡與網段)

--- 進行實體機器的網路變更 ---

$ oifcfg delif –global eth0/192.168.49.0

  (刪除舊網卡)


針對 Public IP 的網段變更, VIP 與 SCAN 也需要作出相對應的變更,首先進行 vip 的變更:

$ srvctl config vip –n oragrid1

$ srvctl stop vip –n oragrid1

  (確認目前 vip 設定與停止服務)

# srvctl modify nodeapps –n oragrid1 –A 192.168.50.111/255.255.255.0/eth1

  (使用 root 更改 vip 設定)

# srvctl config vip –n oragrid1

# srvctl start vip –n oragrid1

  (確認及啟動 vip)


VIP 如果只有變更 IP ,例如由 192.168.49.111 變更為 192.168.49.211 ,這種情況不需要進行 modify 的步驟,只需更新 /etc/hosts 然後將 vip 重新啟動即可,只有再變更網卡名稱或是 IP 網段時才需要進行上述 vip modify 的步驟。


SCAN 的部分需於 DNS 上面先更改所對應的 IP ,然後再更新 SCAN 的設定:

$ srvctl stop scan_listener

$ srvctl stop scan

 (停止 scan listener 與 scan)

# srvctl modify scan –n oragrid-scan

 (使用 root 更新 scan 設定)

$ srvctl modify scan_listener –u

$ srvctl start scan_listener

 (更新 scan listener 設定與啟動 scan listener)

$ srvctl config scan

$ srvctl config scan_listener

 (確認變更後的設定)


  • 新增與刪除節點 ----------

新增節點總共有三個部分需要新增, Grid Infrastructure 、 Database Home 與 Database Instance 。假設目前 Cluster 節點成員為 oragrid1 與 oragrid2 ,現在要將一台新的 Server oragrid3 加入此 Cluster 當中,首先 oragrid3 必須先做好安裝前系統環境的前置準備作業,然後使用 cluvfy 進行加入節點前的檢查:

[grid@oragrid1]$ cluvfy stage –post hwos –n oragrid3

[grid@oragrid1]$ cluvfy comp peer –refnode oragrid1 –n oragrid3 -orainv oinstall -osdba dba –verbose

  (從 oragrid1 發動,檢查 oragrid3 作業系統配置以及與 oragrid1 進行交叉比對)

[grid@oragrid1]$ cluvfy stage –pre nodeadd –n oragrid3

  (進行 add node 前檢查)


檢查完畢之後,就可以從 $GRID_HOME/oui/bin 目錄底下執行 addNode.sh 進行節點的新增:

[grid@oragrid1]$ ./addnode.sh -silent  -ignorePrereq

"CLUSTER_NEW_NODES={oragrid3}"  "CLUSTER_NEW_VIRTUAL_HOSTNAMES={oragrid3-vip}"  "CLUSTER_NEW_NODE_ROLES={HUB}"

  (新增節點 oragrid3, 參數 "CLUSTER_NEW_NODE_ROLES" 是 Oracle 12c 版本之後所需要加的)

[grid@oragrid1]$ cluvfy stage -post nodeadd -n oragrid3 –verbose

  (新增結束後進行檢查)


再 Cluster 新節點加入後,接下來再把 Database Home 新增過去,於 $ORACLE_HOME/oui/bin 底下執行 addNode.sh 將 Database Home 加入到新節點 : (Oracle 12c 之後 addNode.sh 在 $ORACLE_HOME/addnode)

[oracle@oragrid1]$ ./ addNode.sh -silent "CLUSTER_NEW_NODES={oragrid3}"


最後再新增 Database Instance :

[oracle@oragrid1]$ dbca -silent -addInstance -gdbName orcl -nodeList oragrid3          -instanceName orcl3 -sysDBAUserName sys -sysDBAPassword welcome1


至此完成一個完整的節點新增。


刪除節點則是將步驟反過來,由 Database Instance 、 Database Home , Grid Infrastructure 依序刪除。首先刪除 Database Instance :

[oracle@oragrid1]$ dbca -silent -deleteInstance -gdbName orcl -nodeList oragrid3          -instanceName orcl3 -sysDBAUserName sys -sysDBAPassword welcome1

  (刪除 Database Instance)

[grid@oragrid1]$ srvctl disable listener -l LISTENER -n oragrid3

[grid@oragrid1]$ srvctl stop listener -l LISTENER -n oragrid3

  (停止與刪除節點 oragrid3 的 Listener)


再來刪除 Database Home :

於 oragrid3 執行:

$ $ORACLE_HOME/oui/runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={oragrid3}" -local


於 oragrid1 與 oragrid2 執行:

$ $ORACLE_HOME/oui/runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={oragrid1,oragrid2}" -local


更新完節點成員後,即可把 oragrid3 的 ORACLE_HOME 刪除:

[oracle@oragrid3]$ $ORACLE_HOME/deinstall/deinstall -local


最後將 oragrid3 移出 Cluster 成員:

於 oragrid3 執行:

首先將 oragrid3 排除於 css 之外

# $GRID_HOME/bin/crsctl unpin css –n oragrid3


將 oragrid3 的 crs deconfig

# $GRID_HOME/crs/install/rootcrs.pl –deconfig -force


將 oragrid3 於 OCR 刪除

# $GRID_HOME/bin/crsctl delete node –n oragrid3


更新節點成員清單,於 oragrid3 執行:

$ $GRID_HOME/oui/bin/runInstaller -updateNodeList ORACLE_HOME=$GRID_HOME "CLUSTER_NODES={oragrid3}" CRS=TRUE -local


於剩下的節點 oragrid1 與 oragrid2 執行:

$ $GRID_HOME/oui/bin/runInstaller -updateNodeList ORACLE_HOME=$GRID_HOME "CLUSTER_NODES={oragrid1,oragrid2}" CRS=TRUE -local


最後確認節點移除的狀態:

[grid@oragrid1]$ cluvfy stage -post nodedel –n oragrid3 -verbose


最後可以把 oragrid3 的 GRID 軟體刪除:

[oracle@oragrid3]$ $GRID_HOME/deinstall/deinstall -local


至此完成節點的刪除。


  • 管理 Server Pool ----------

Oracle RAC 節點之間可以再定義 Server Pool ,等於是把節點做一個分組,例如把節點 oragrid1 與 oragrid2 分組到 Server Pool 1 ; oragrid3 與 oragrid4 分組到 Server Pool 2 ,不同的 Server Pool 提供給不同的應用系統所使用,等於是在一個大架構的 Cluster 之下裡面來區分應用系統所使用的 Server 。


RAC 的 Server Pool 有兩種管理方式, Administrator Managed - 使用系統預設的 Server Pool 與 Policy Managed - 自行定義 Server Pool 。系統預設會有兩個 Server Pool , Free Server Pool 與 Generic Server Pool ,所有未加入任何 Server Pool 的節點都會被歸類在 Free Server Pool ;所有使用 Administrator Managed 的節點都會被歸類為 Generic Server Pool 。一般來說,如果 RAC 節點數量沒有很多的話,大部分都會使用 Administrator Managed 就足夠,如果節點數量很多又有分類的需求,那麼就可以使用 Policy Managed 自行定義 Server Pool 。


建立 Server Pool 的方式可以使用 crsctl 或者是 srvctl 來建立:

$ crsctl add serverpool SP1 –attr "MIN_SIZE=2, MAX_SIZE=5, IMPORTANCE=3"

  (使用 crsctl 建立 server pool SP1)

$ srvctl add srvpool –g SP1 –l 2 –u 5 –i 3 -n "oragrid1,oragrid2"

  (使用 srvctl 建立 server pool SP1)

$ srvctl config serverpool

$ crsctl status server –f

  (檢查所有 server pool 的狀態)


其中 MIN_SIZE (-l) 表示此 Server Pool 最少需要的 Server 數量; MAX_SIZE (-u) 表示此 Server Pool 最多可容納的 Server 數量; IMPORTANCE (-i) 表示此 Server Pool 的重要程度。


當建立好 Server Pool 之後,新加入的節點會根據 Server Pool 的重要程度 (IMPORTANCE) 來決定要歸類到哪一個 Server Pool 當中,例如現在有建立三個 Server Pool ,分別的屬性如下:


NAME

IMPORTANCE

MIN_SIZE

MAX_SIZE

SP1

1

1

6

SP2

3

1

3

SP3

2

1

2


當現在有一個新的節點 oragrid5 加入這個 Cluster ,首先會依照 IMPORTANCE 來決定 oragrid5 要歸類到哪個 Server Pool ,顯然 SP2 的 IMPORTANCE 為 3 是當中最高的,接下來就判斷 SP2 目前的 MIN_SIZE 是否有符合,目前 MIN_SIZE 為 1 代表此 Server Pool 最少要有一個成員,如果目前都沒有成員屬於 SP2 的話,那 oragrid5 就首要加入到 SP2 ;如果 MIN_SIZE 有符合,那就要判斷 SP2 是否已達到 MAX_SIZE 所設定的 3 ,如果未達到,那麼 oragrid5 還是加入到 SP2 ,如果已達到 MAX_SIZE ,那麼 oragrid5 就會往下一個 IMPORTANCE 的 Server Pool 做歸類。


使用 Policy Managed 等於是在一個 Cluster 架構下利用 Server Pool 來區分系統所要使用的 Server ,當然我們不見得要把所有的 Server 都部屬在同一個 Cluster 下,也是可以依不同的應用系統建立多套的 Cluster 。

沒有留言:

張貼留言