GRD (global resource directory)保存著所有實例中資源的分佈情況 GCS (global cache service)具體執行cache fusion 工作的服務,對應進程LMSn GES (global enqueues service)協調實例之間的GCS完成數據傳遞 ...
GRD (global resource directory)保存著所有實例中資源的分佈情況
GCS (global cache service)具體執行cache fusion 工作的服務,對應進程LMSn
GES (global enqueues service)協調實例之間的GCS完成數據傳遞工作,完成non-cache fusion資源的管理工作,對應進程LMD.
Cache-fusion全局鎖
全局鎖的分配是通過每個節點的GES服務協調完成的,每個時間點只有一個實例能夠修改相同的數據塊,通過GES的協調獲得塊的全局鎖之後,GCS負責實例間數據塊的傳遞工作。(cache fusion的頻繁使用會導致數據性能的下降)。
GES(全局隊列服務)負責維護字典緩存和庫緩存內的一致性。字典緩存是實例的SGA內所存儲的對數據字典信息的緩存,用於高速訪問數據字典信息。GES控制資料庫中所有的library cache鎖和dictionary cache鎖。
數據一致性
實例A的一個事務更新了一個數據塊,但沒有提交,這個時候實例B查詢包含事務的這個數據塊,那麼實例A會將UNDO段中的一致性數據塊傳送給實例B,實例B中存放的該數據塊就是CR狀態的數據塊,並非是當前最新的數據塊。如果這個時候實例B要更新這個數據塊,實例A會將SGA中當前的數據塊降級,然後傳遞給實例B,實例B中存放的數據塊就是當前最新的數據塊。(相同的塊在不同實例中分佈體現在GRD中,GRD能展示塊的分佈圖)
Past Image(PI)是維護臟塊的拷貝,GCS管理PI,GCS在實例失敗恢復的時候會用到PI版本的塊。Oracle允許即使操作塊的事務未提交,如果其他實例有事務修改相同塊的不同行,塊也能在實例間傳遞,但是必須保留原來實例中未提交的塊,這個塊就是PI.
(1) 並行操作過程中的PI
在多節點實例並行操作的過程中,當實例請求修改塊時,GCS服務的LMSn進程會將數據塊從最後修改此塊的實例傳送給請求的實例,而LMSn會在原來持有此塊的實例中保留此資料庫的PI版本。
(2) 資源的磁碟寫
因為可能在集群的多個實例中存在多個被修改過的數據塊,由GCS管理的寫規則必須確保將最近版本的數據塊寫入磁碟中。GCS還必須確保所有之前的版本已從其他cache中清除。對數據塊的寫可以由任何持有此數據塊的當前版本或PI數據塊的實例發起。
Cache fusion應用場景
(1) 多節點實例並行讀
實例A從吸盤讀取一個塊的時候,該塊在GRD中記錄的狀態為SCUR,實例B查詢該表,通過cache fusion獲取該塊,由於並不對該塊進行更改,所以實例A塊的狀態沒有發生變化,在實例B中的塊的狀態是CR。實例C再次執行相同的查詢從實例A獲取該塊,同樣實例C中的塊狀態也是CR。
(2) 多節點實例並行讀和寫
實例A從磁碟讀取數據塊到記憶體中,記錄塊的狀態為SCUR。實例B要更新該塊中的行,必須獲得排他的鎖,且更新的塊必須是當前最新的塊,實例B通過cache fusion將實例A的塊拷貝到自己的buffer cache中,同時實例A的塊狀態變為CR,實例B中塊的狀態是XCUR。
(3) 多節點實例並行寫
實例A執行UPDATE語句從磁碟讀取塊到實例中,塊的狀態為XCUR。實例B要更新同一個塊的其他行記錄,實例A的塊狀態變為CR,實例B通過cache fusion將實例A的塊拷貝到實例B的buffer cache中,實例B上塊的狀態為XCUR。如果實例C也要更新同一塊,實例C必須等待實例B執行完成後,實例B的狀態變更為CR,通過cache fusion將實例B上的塊拷貝到實例C,並修改修改實例C塊狀態為XCUR。以上操作,實例A和實例B中保存的CR狀態的塊都是PI版本。
(參考《構建最高可用RAC》)