Oracle RAC Cache Fusion 系列十四:Oracle RAC CR Server Part One

沃趣科技發表於2019-09-02
Oracle資料庫環境中隔離級別為read committed,每個事務都只能看到其他事務已提交的更改和自己未提交的更改。所有關於CR塊的統計都可以透過x$bh檢視檢視。read-commited隔離級別下的有兩種可能性:
  • 語句級別:查詢結果與查詢的開始一致(snap_scn =當前SCN)。
  • 事務 級別:查詢結果與事務開始時一致(snap_scn =事務開始時的當前SCN)。

CR塊請求流
ktrget:
- 初始化CR掃描請求。
- 呼叫kcbgtcr獲取最佳快取區域構建CR緩衝區。
- 呼叫ktrgcm應用undo來構建CR緩衝區。
-  將CR緩衝區返回給請求者。
kcbgtcr:
- 如果成功,返回“最佳”候選人(由ktrexf執行)。
- 掃描雜湊桶,以獲取可用於構建CR緩衝區的緩衝區。
- 如果不成功,請求呼叫kcbget。
kcbget:
- 重新嘗試kcbgtcr的掃描。
如果找到緩衝區,則立即返回。
如果沒有,那麼如果它正在讀入或存在當前模式緩衝區,則等待它可用後,然後重新掃描緩衝區。
如果這些失敗,則不能使用任何本地快取的緩衝區。
如果上述操作失敗:
- CR服務重新分配管理CR請求。
CR塊的請求最多涉及三個例項:請求者例項,鎖定主例項和當前塊所有者例項。
如果滿足以下條件之一,則授予鎖定:

  • 資源保持模式為NULL。

  •  資源保持模式為S,主節點中沒有S鎖的持有者。

否則,主裝置將CR請求轉發給持有者節點。
如果鎖是全域性的,那麼Oracle將選擇一個節點來轉發CR請求,如下所示:

  • 如果鎖主例項中存在過去映象(PI),並且PI SCN比snap-scn大,則主節點是為該節點。

  • 否則,您選擇具有最小SCN的PI映象且PI-SCN大於snap-SCN。此PI的所有者節點是系統將CR請求轉發到的節點。用最小SCN的PI的原因是這樣應用的UNDO較少。

  • 如果根本沒有PI,則選擇當前塊的所屬例項。


Light Work Rule
為了避免因為塊清除而產生消耗資源過多的CR塊構建工作,將合適的緩衝區傳送給請求者以完成CR構建。Oracle引入了LWR。CR請求節點的LMS程式透過呼叫kcbgtcr或ktrget以構建CR緩衝區。當LWR規則觸發條件:
- 請求物理I/O。
- 找到具有相同類,相同AFN和相同blockID單objectID的的緩衝區,一般是刪除或truncate的物件。
- 寫進行中。
Fairness
Oracle為了在鎖轉換和cr塊構造產生的開銷之間選擇最小消耗資源的方式,引入了fairness機制。當一個節點多次(_fairness_threshold)請求另一個節點具有獨佔鎖的buffer的時候。另外一個節點會將buffer上的鎖降級為scur然後把block傳輸到請求節點。之後這個節點再次訪問該buffer的時候直接到本地buffer cache申請即可。
LMS(構建CR緩衝區)執行buffer鎖的降級轉換動作,如果:
- 塊不是UNDO,鎖定保持在X模式
- 自上次對塊進行更改以來,緩衝區的CR請求過多。 如果有超過_fairness_threshold次數的CR請求,LMS會執行此操作。


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

相關文章