DRM特性引起的RAC節點當機
某銀行客戶叢集1 節點出現異常重啟的問題,希望我們能夠找出問題所在。開始本次故障排查之前,我們先來了解下DRM (動態資源管理)的原理。
假設某叢集資料庫包含3 個節點,根據RAC 記憶體融合的原理,每個例項會儲存資料庫1/3 的主節點資訊,同時也意味著,每個節點訪問資料時會有2/3 的機率需要從遠端節點獲取資料塊的鎖資訊,從而造成更多節點間的訊息通訊。在實際應用中更有可能出現的情況是,一些資料塊在非主節點上被訪問了很多次,而主節點卻很少訪問。這種情況就意味著會產生大量的資源訪問節點和資源主節點的訊息,從而增加了私網的工作負載,甚至可能還會影響到資料庫的效能。所以,Oracle 從10g 開始,推出了DRM 特性,使資源的主節點資訊可以被動態修改。當然,決定這種修改的依據是每個節點對資源的訪問頻率。DRM 的移動過程主要可分為如下幾個步驟。
1) 靜默節點(Quiesce )。
2) 凍結階段(Freeze )。
3) 清除階段(Cleanup )。
4) 重建節點(Rebuild )。
5) 解凍節點(Unfreeze )。
下面先來看看資料庫的告警日誌,如圖2-47 所示。
圖2- 47 告警日誌
不難看出,2018 年10 月9 日23:41:14 ,由於資料庫的後臺程式LMON 和LMS 節點間存在通訊異常,LMS0 程式終止了資料庫例項。因此,我們繼續檢查資料庫LMON 和LMS 日誌,以便檢視是否因為程式出現了問題,才導致資料庫當機。接下來檢視LMON 跟蹤日誌,輸出如下:
*** 2018-10-09 23:34:18.405
* DRM RCFG called (swin 0)
CGS recovery timeout = 85 sec
Begin DRM(139949) (swin 0)
* drm quiesce
*** 2018-10-09 23:34:18.759
2018-10-09 23:34:18.759522 : DRM(139949) resources quiesced [0-65535], rescount 588987
2018-10-09 23:34:18.759882 : DRM(139949) local converts quiesced [0-65535], lockcount 0, bucket 0
* drm sync 1
* drm freeze
* drm cleanup
* drm sync 2
* drm replay
* drm sync 3
* drm fix writes
* drm sync 4
* drm end
* DRM RCFG called (swin 0)
CGS recovery timeout = 85 sec
* drm quiesce
<!--…… 省略部分-->
*** 2018-10-09 23:34:20.780
2018-10-09 23:34:20.780063 : DRM(139949) resources quiesced [131072-196607], rescount 589078
2018-10-09 23:34:20.780437 : DRM(139949) local converts quiesced [131072-196607], lockcount 1, bucket 228
* drm sync 1
* drm freeze
kjxgm_Notify_Eviction: Received an instance eviction notification from instance 2
*** 2018-10-09 23:41:14.147
kjxgm_Notify_Eviction: eviction member count 1 reason 0x2
kjxgm_Notify_Eviction: eviction map 1
2018 年10 月9 日 23:34:18.405 ,LMON 程式就已經接收到了來自2 節點的驅逐資訊。此時資料庫正在發生DRM ,但直到例項當機(23:41 ),DRM 也沒有結束的跡象。也就是說一個DRM 竟持續了7 分鐘都沒結束。
下面進一步檢視LMD trace 日誌DRM 的啟動資訊,內容如下:
*** 2018-10-09 23:34:18.359
* received DRM start msg from 2 (cnt 1, last 1, rmno 139949)
Rcvd DRM(139949) AFFINITY Transfer pkey 5999817.0 from 1 to 2 oscan 1.1
ftd (30) received from node 2 (76 0.30/0.0)
all ftds received
* kjxftdn: break from kjxftdn, post lmon later
*** 2018-10-09 23:34:18.812
ftd (33) received from node 2 (76 0.33/0.0)
all ftds received
* kjxftdn: break from kjxftdn, post lmon later
ftd (35) received from node 2 (76 0.36/0.0)
all ftds received
ftd (37) received from node 2 (76 0.38/0.0)
all ftds received
ftd (30) received from node 2 (76 0.30/0.0)
all ftds received
* kjxftdn: break from kjxftdn, post lmon later
*** 2018-10-09 23:34:20.830
ftd (33) received from node 2 (76 0.32/0.0)
all ftds received
* kjxftdn: break from kjxftdn, post lmon later
*** 2018-10-09 23:34:34.002
kjddt2vb: valblk [0.4e693] > local ts [0.4e692]
*** 2018-10-09 23:34:35.173
kjddt2vb: valblk [0.4e699] > local ts [0.4e698]
<!--…… 省略大量kjddt2vb: valblk 資訊-->
*** 2018-10-09 23:41:12.133
kjddt2vb: valblk [0.504e9] > local ts [0.504e8]
2018 年10 月9 日 23:34:18 ,LMS 程式開始啟動DRM ,直到例項當機都沒有結束,結合LMON 的資訊,我們可以猜測到當時節點間通訊的私網流量較大。
客戶端zabbix 監控故障時間段系統的心跳網路流量,也印證了上面的判斷。此時基本上可以判定是DRM 引起了此次當機。為了進一步明確當機的原因,我們再來檢視23 點34 分左右資料庫的會話資訊,如圖2-48 所示。
圖2- 48 故障時間點會話資訊
“gcs drm freeze in enter server mode ” 正是DRM 期間使用者需要操作相同資料塊時資料庫發生的等待事件,如圖2-49 所示。
圖2- 49 等待事件資訊
從會話等待及鎖資訊也能看出,故障發生前正在進行DRM 操作,但最終鎖的源頭LMS0 卻處於空閒等待的狀態。進一步檢視LMS0 及2 節點的跟蹤檔案資訊(ges2 LMON to wake up LMD - mrcvr ,2018-10-09 23:41:13.048015 : * kjfcdrmrcfg: waited 413 secs for lmd to receive all ftdones, requesting memberkill of instances w/o ftdones: ),內容與BUG 13399435/BUG13732226 匹配,MOS Oracle 官方參考文件LMON received an instance eviction notification from instance n (Doc ID 1440892.1) 。
最終,我們可以確認此次當機是由於節點間產生了大量的DRM 觸發了Bug ,從而導致1 節點資料庫當機。
分析到這裡,當機的原因已經很明確了,但是為什麼會產生大量的DRM ,使得節點間通訊加劇,這也是我們需要進一步排查的。由於資料庫故障時間段丟失了部分快照點及自重啟,我們儘可能地對現有日誌進行分析,下面就來介紹排查的過程。首先,檢視當機前資料庫的會話資訊,如圖2-50 所示。
圖2- 50 當機前資料庫的會話資訊
2018 年10 月9 日23 :34 ,節點間有大量的GC 類等待。堵塞的會話幾乎都是來自2480 和2353 的會話,下面分別看下2480 和2353 會話,如圖2-51 所示。
圖2- 51 2480 會話資訊
可以看出,2480 會話也被2353 會話堵塞,以相同的方式檢視別的blocking_session ,可以發現它們都是來自同一個2353 會話,如圖2-52 所示。
圖2- 52 2353 會話資訊
從以上會話資訊中我們可以看出,最終鎖的源頭來自2353 號會話,它沒有被任何會話堵塞,經排查,此會話是OGG (Oracle GoldenGate )挖掘程式,在執行SQL 23j1ukc8sjv4v 時構建了大量的全域性CR 塊。分析到這裡,觸發的條件也已經很明確了,是OGG 抽取程式引起的。
OGG 是本次故障的導火索,OGG 抽取導致了大量節點間的GC 類等待,造成大量會話阻塞,引起節點間的DRM ,觸發Oracle Bug ,最終導致當機。
由於DRM 觸發了Oracle Bug ,因此建議關閉DRM 。
在Oracle 11G 中,可以使用如下方式禁用DRM :
SQL> alter system set "_gc_policy_time"=0 scope=spfile;
然後,同時重啟所有例項生效。如果不想完全禁用DRM ,但是需要禁用read-mostly locking 或reader bypass 的機制。可以使用如下命令:
SQL> alter system set "_gc_read_mostly_locking"=false scope=spfile;
SQL> alter system set "_gc_bypass_readers"=false scope=spfile;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31547506/viewspace-2934454/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AIX RAC9I 節點當機測試AI
- 一次RAC節點當機的解決過程
- Oracle RAC 10.1.0 - 11.1.0.7引起節點被踢出的原因Oracle
- RedHat7.2的RemoveIPC設定主yes引起rac當機RedhatREM
- ora-00494引起rac當機的分析處理
- oracle 11.2.0.4 rac節點異常當機之ORA-07445Oracle
- asm例項自動dismount導致rac一個節點當機ASM
- RAC一個節點記憶體故障當機,無法訪問記憶體
- Oracle RAC DRM介紹和關閉DRMOracle
- Oracle9204 RAC 節點2當機後5小時重新啟動找不到節點1上例項Oracle
- ORACLE 11.2.0.4 rac for linux 鏈路宕導致的單節點異常當機OracleLinux
- RAC系統當中,job在哪個節點執行?
- DRM引起的問題解決一例
- 延遲密碼驗證特性引起的資料庫HANG死及當機密碼資料庫
- 11G RAC 一節點當機後修改監聽相關配置使通過當機節點VIP連線資料庫的客戶端可以連線資料庫客戶端
- Redis的KEYS命令引起當機事件Redis事件
- RAC 雙節點 轉單節點流程
- 人為操作不當引起電腦當機
- Oracle DRM引起的問題解決一例Oracle
- rac當機分析
- Oracle 10g RAC中的DRMOracle 10g
- 檢視oracle rac的節點Oracle
- Oracle RAC Cache Fusion 系列十七:Oracle RAC DRMOracle
- Oracle RAC新增節點Oracle
- Oracle RAC 新增節點Oracle
- 虛擬機器環境下RAC加入節點虛擬機
- 【RAC】Oracle10g RAC 節點重配的方式Oracle
- ORACLE RAC的DRM (動態資源管理)Oracle
- RAC節點之間通訊問題 兩節點 11g RAC
- 2節點RAC安裝
- Oracle Rac 刪除節點Oracle
- Zookeeper 節點特性介紹
- Postgrsql 從節點當機,主節點執行DML語句出現等待情況SQL
- 【RAC】節點2上不能完全識別節點1上的asmdiskASM
- 主機os重灌的節點加回RAC叢集步驟示例(11gR2 RAC)
- DRM --- RAC object remastering ( Dynamic remastering )ObjectREMAST
- 【RAC】部署安裝RAC時確保主節點的時間小於其他節點時間
- RAC中的跨節點並行[轉]並行