共用方式為


穀物目錄實作

概觀和架構

Orleans 中的 grain 目錄是索引鍵/值存放區,其中索引鍵是 grain 識別符,而值是註冊項目,指向一個作用中的 silo,該 silo 可能裝載該 grain。

雖然 Orleans 提供預設的記憶體內分散式目錄實作(如本文所述),但粒度目錄系統的設計是可插拔的。 開發人員可以通過實作 IGrainDirectory 介面並將其註冊到應用程式的服務集合來實現自己的目錄。 這允許使用不同記憶體後端或一致性模型的自定義目錄實作,以更符合特定應用程式需求。 由於引進新的強式一致性目錄,因此不需要外部目錄實作,但 API 會維持回溯相容性和彈性。 粒紋目錄可以根據每個粒紋類型來設定。

為了優化效能,目錄查詢會在每一個資料筒倉內進行本地快取。 這表示只有在本機快取項目遺失或無效時,才需要可能的遠端目錄讀取。 此快取機制可減少與粒紋位置查閱相關聯的網路額外負荷和延遲。

最初,Orleans 實作最終一致的目錄,結構為分散式哈希表。 這是由 Orleans v9.0 中的強一致性目錄所取代,其基礎在於兩階段 虛擬同步方法,並且設計成分散式哈希表,但在虛擬節點的運用下改善了負載平衡。 本文說明後者較新的粒紋索引實現。

分散式粒紋目錄

Orleans 中的分散式資料目錄提供強一致性、負載平衡、高性能和容錯。 實作遵循兩階段設計,基於虛擬同步方法; 並與垂直Paxos 有相似之處。

目錄分割區有兩種作業模式:

  1. 一般作業:分割區會在本機處理要求,而不與其他主機協調。
  2. 檢視變更:主機會彼此協調,以移轉目錄範圍的擁有權。

目錄運用 Orleans的強式一致性叢集成員資格系統,其中稱為「視圖」的組態具有單調增加的版本號碼。 當獨立模組加入和離開叢集時,會建立接續的檢視,從而改變範圍歸屬。

所有目錄操作都包含視圖協調:

  • 要求會攜帶呼叫端的檢視號碼。
  • 回應包括分割區的檢視編號。
  • 檢視次數不一致會觸發同步。
  • 檢視變更時會自動重試要求。

這可確保目錄分割區的正確擁有者會處理所有要求。

分區策略

目錄會使用一致的哈希環進行分割,並將範圍分配給叢集中活躍的樞紐。 粒紋標識符通過哈希運算來確定擁有其哈希對應環節的筒倉。

每個啟用中的儲存桶擁有預設的範圍數目,預設為每個儲存桶30個範圍。 這與 amazon Dynamo 和 Apache Cassandra所使用的配置類似,其中會為每個節點(主機)建立多個「虛擬節點」(範圍)。

分割區的大小取決於其哈希與下一個分割區哈希之間的距離。 在視圖變更期間,範圍可能會被分割成多個獨立儲存區,這會增加視圖變更程式的複雜性,因為每個分割區都可能需要與多個其他分割區進行協調。

檢視變更程序

目錄分割區(在 GrainDirectoryPartition中實作)使用具有版本控制的範圍鎖,以防止在檢視變更期間對範圍的無效訪問。 範圍鎖定會在檢視變更期間建立,並在檢視變更完成時釋放。 這些鎖類似於虛擬同步性方法中使用的「楔子」。

發生檢視變更時,分割區可以成長或縮小:

  • 如果一個新的節點加入叢集,那麼現有的分區可能會縮小以騰出空間。
  • 如果有節點離開叢集,那麼剩餘的數據分割可能會擴展以接管孤立的範圍。

在能處理請求之前,必須先將目錄註冊從舊擁有者轉移至新擁有者。 傳輸程式會遵循下列步驟:

  1. 先前的擁有者會鎖定範圍區段,並建立其目錄項目的快照。
  2. 新的擁有者會要求並套用快照。
  3. 新任擁有者開始處理範圍內的請求。
  4. 先前的擁有者會收到通知並刪除快照。

復原過程

當主機當機而未能妥善移交其目錄分區時,後續的分區擁有者必須進行恢復操作。 這牽涉到:

  1. 查詢叢集中的所有作用中儲存桶,以取得其 Grain 註冊。
  2. 重建受影響範圍的目錄狀態。
  3. 確保不會發生重複的粒子激活。

當叢集成員頻繁變更時,也需要復原。 雖然叢集成員資格保證單調性,但孤立的系統可能會遺漏中繼成員資格視圖。 在這種情況下:

  • 快照集傳輸已放棄。
  • 執行恢復操作,取代正常的分區交接。
  • 儘管缺少中繼狀態,但系統仍維持一致性。

叢集成員資格的未來改善,可能會透過確保所有筒倉都能看到所有視圖,來減少或消除這些情況。