在單實例中,進程要想修改數據塊,必須在數據塊的當前版本(Currentcopy)上進行修改RAC環境也一樣
這便涉及到一系列問題:
如何獲得數據塊的版本在集群節點間的分布圖?
如何知道哪個節點擁有的是當前版本?
如何完成傳遞過程?
這一系列問題的解決依靠內存融合技術(cachefusion)
cachefusion通過高速的privateinterconnect,在實例間進行數據塊傳遞
這是RAC最核心的工作機制,他把所有實例的SGA虛擬成一個大的SGA區
每當不同的實例請求相同的數據塊,這個數據塊就需要在實例間進行傳遞
在Oracle7的OPS中,這種傳遞是通過磁盤完成的,也叫“Disk-BasedPing”
也就是第1個實例必須先把這個數據塊寫回磁盤,然后第2個實例再從磁盤上讀取這個數據塊
這種依靠磁盤來完成數據傳遞極大影響系統性能
在Oracle8i引入“Net-BasedPing”通過PrivateInterconnect來傳遞數據塊
但是8i只能傳遞沒有修改過的數據塊,對于“臟塊”還是要通過磁盤來傳遞,這一點和OPS一樣
在Oracle9i的cachefusion,所有的數據塊,無論修改的或者沒有修改的,都可以通過PrivateInterconnect傳遞
系統系能得到極大的改善
在cachefusion中,每個數據塊都會被映射成一個cachefusion資源,或者說是一個PCM資源
PCM資源實際上是一個數據結構,資源的名稱就是DBA(數據塊地址)
每個進程對數據的請求都是分步完成:
①把DBA轉換成PCM資源名稱
②把這個PCM資源請求提交給DLM(分布式鎖管理器)
③DLM進行GlobalLock的申請、釋放活動,只有進程獲得了PCMLock,才能繼續下一步
也就是實例首先要獲得數據塊的使用權
整個cachefusion有兩個服務組成:GCS和GES
⑴GCS服務負責數據塊在實例間的傳遞
由后臺進程LMSn完成
⑵GES服務負責鎖管理
在多個實例之間協調對數據塊的訪問順序,保證數據的一致性訪問
由后臺進程LMD完成