Oracle RAC Cache Fusion 系列九:Oracle RAC 分散式資源管理(二)

沃趣科技發表於2019-07-31

因為叢集的分散式架構,透過程式間的通訊完成資源的共享、分發、同步對分散式鎖管理實現就變得尤為必要。 有了這種通訊的存在,在與叢集中的其他例項上LMD程式完成通訊鎖定一個資源後,無論有多少DLM例項發生故障,都不會丟失有關鎖資源的重要資訊。但是需要注意的一點是資料庫的崩潰恢復(能夠恢復在中止例項的緩衝區快取記憶體中丟失的塊)不是DLM的功能,塊的全域性快取記憶體處理仍然使用相同的“寫入前刷日誌”規則來確保持久化。透過前面系列文章我們知道GRD或DLM是由GES元件和GCS組建組成,而這些功能的程式(LMON、LMS、LMD等)實現我們也有了大致的瞭解。現在我們來更進一步的瞭解這些程式的函式實現和引數調整。

DLM存在於群集的每個例項中。

 - 協調不同例項之間的請求和對共享資源的訪問。

 - 儲存叢集中所有鎖的清單。

  資源可用時授予和通知程式。

 - 當其他程式請求鎖時通知鎖的所有者。

容錯: DLM可以承受n-1個節點故障。 

死鎖檢測: DLM檢測並報告死鎖。

LMD程式:

LMD0是DLM的核心,LMD0處理所有鎖定操作和資源建立,檢測死鎖以及向其他LMD0傳送訊息。LMD0的處理統計資訊可以透過兩個檢視V$DLM_CONVERT_LOCAL和V$DLM_CONVERT_REMOTE檢視。統計資訊由初始化引數timed_statistics控制,在11g版本預設為TRUE。

假設當前在轉換佇列上等待的鎖定符合授權佇列,則LMD會使用 move-scan-convert 流程進行定期檢查。

LMD0的主迴圈:kjmdm

• lock db鎖定:

 - 停止任何死鎖檢測:kjdddei

 - 鎖定並重置:kjfzfcl

在鎖定狀態下,無法從DLM獲取任何鎖定或建立任何新資源。在重構期間鎖定整個GRD,以便可以快速從節點故障中恢復。

• lock db解鎖:

 - 檢測鎖轉換:kjcvscn。

 - 死鎖檢測:kjddits / kjddscn。 

 - 清理恢復域:kjprsem。

 - 更新統計資訊:kjxstc。

 - 傳送流控制訊息:kjctssb。

LMON程式:

由前面系列文章我們知道LMON程式主要負責整個資料庫叢集層面的一致性關係(CGS),監控整個叢集的全域性佇列和資源。根據前面DLM快取資源和鎖定結構的介紹。當叢集存在不再需要的資源時就會將他放置在一個空閒列表上。然後LMON呼叫kjrchc清除資源的DLM快取。

LMON程式的使用的主要函式如下:

 - LMON的主迴圈:kjfcln

 - 偵聽本地訊息:kjcswmg

 - 響應重構事件:kjfcrfg

 - 清除GES快取:kjrchc

LMS程式:

LMS是整個Cache Fusion體系最活躍和最忙碌的程式。它負責維護GRD中的資料塊資源資訊。

LMS程式數由_lm_lms確定預設值為max(#CPU/ 4,2)

1.掃描具有可授予轉換鎖的PCM資源。

2.處理降級轉換佇列由kclpbi處理。

3.如果訊息正在排隊並且超過_side_channel_batch_timeout引數設定的時間,則flush訊息。

4.處理PCM鎖的遠端訊息。

GES資源和鎖

GES資源即non-PCM資源的初始分配數量可以透過查詢隱含引數_lm_ress。如果用盡,則可以在shared_pool中申請分配更多資源。ges資源的初始分配,使用和限制資訊可以透過v$resource_limit的ges_ress值獲得(SELECT * FROM V$RESOURCE_LIMITWHERE RESOURCE_NAME LIKE 'ges%' ;)

預設情況下_lm_ress=1.1 * ( localres +(number_of_instance-1) * localres / number_of_instance )

localres = processes + dlm_locks + transactions+ enqueue_resources+ db_files+7+

parallel_max_servers *cluster_database_instance+ parallel_max_servers + cluster_database_instance+200

GES資源鎖初始分配數量可以透過查詢隱含引數_lm_locks。同樣的如果用盡,則可以在shared_pool中申請分配更多鎖資源。ges鎖的初始分配,使用和限制資訊可以透過v$resource_limit的ges_locks值獲得(SELECT * FROM V$RESOURCE_LIMIT WHERE RESOURCE_NAME LIKE 'ges%' ;)

預設情況下_lm_locks=(localres+_enqueue_locks)+ (number_of_instance-1 * (localres+_enqueue_locks) / number_of_instance)

localres = processes + dlm_locks +transactions + enqueue_resources + db_files + 7 +

parallel_max_servers *cluster_database_instance+ parallel_max_servers + cluster_database_instance+200

GCS資源和鎖

GCS資源即PCM資源的初始分配數量可以由隱含引數_gcs_resources 配置或預設max(1.1 * _db_block_buffers,2500)。如果耗盡,則從shared_pool分配的更多資源以1024為增量單位。gcs資源的初始分配,使用和限制資訊可以透過v$resource_limit的gcs_resources值獲得(SELECT * FROMV$RESOURCE_LIMIT WHERE RESOURCE_NAME LIKE 'gcs%' ;)

GCS資源鎖即PCM資源鎖的初始分配數量可以由隱含引數_pcm_shadow_locks配置或則預設max(1.1 * _db_block_buffers,2500)。如果耗盡,則從shared_pool分配的更多資源以1024為增量單位。gcs資源的初始分配使用和限制資訊可以透過v$resource_limit的gcs_shadows值獲得(SELECT * FROMV$RESOURCE_LIMIT WHERE RESOURCE_NAME LIKE 'gcs%' ;)

DLM程式

DLM程式數量初始分配數量可以透過設定隱含引數_lm_procs或max( ( 64 + 256 ) + ( number_of_instance-1 ), processes )如果耗盡,則從shared_pool分配更多資源。DLM程式的初始分配,使用和限制資訊可以透過v$resource_limit的ges_locks值獲得(SELECT * FROM V$RESOURCE_LIMIT WHERE RESOURCE_NAME LIKE 'ges%' ;)


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

相關文章