【譯】OpenDaylight控制器:MD-SAL架構:DOM DataStore

源文件:https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL:Architecture:DOM_DataStore#The_In-Memory_MD-SAL_Data_Store_Implementationgit

問題描述數據庫

在MD-SAL數據存儲和數據存儲自己的當前實現中,存在幾個有關數據結構問題:json

  • 數據結構(在yang-data-api中定義)更像是XML結構,所以很難在其上實現優化的數據存儲。 而YANG定義的數據結構應該被使用在數據存儲中。 Yang定義的數據結構已經在MD-SAL、YangTools和其餘組件生成的Java DTO中使用;
  • 目前,MD-SAL數據契約(contracts)沒有提供足夠的能力來更精確地指定應用程序的意圖並對客戶端執行優化(例如,「沒必要要地反序列化數據」或「僅計算必要的變化集合」);
  • 數據存儲的實現不容許在子樹上進行原子更新。

爲了提升MD-SAL的可靠性和性能,上述問題須要解決。   api

當前MD-SAL DOM數據代理  緩存

目前,DOM數據代理沒有被設計成具備樹狀結構的智能內存緩存,其可以記錄依賴性,計算變化集合並維護提交處理程序、通知監聽器和實際數據之間的關係。 這可能致使兩階段提交的低效實施,其中全部狀態記錄由Data Broker自己完成,以下所示: 數據結構

  1. 計算受影響的子樹
  2. 過濾受影響子樹的提交處理程序
  3. 過濾受影響子樹的數據變化監聽器
  4. 捕獲數據變化監聽器的初始狀態(每一個數據變化監聽器集讀取一個)
  5. 啓動全部受影響提交處理程序的請求提交
  6. 完成對全部受影響提交處理程序的執行
  7. 捕獲數據變化監聽器的最終狀態(每一個數據變化監聽器集讀取一個)
  8. 將數據更改事件發佈到受影響的數據變化監聽器。

 

DOM數據代理保留和維護的狀態是:併發

  • 將子樹路徑映射到已註冊的提交處理程序
  • 將子樹路徑映射到註冊數據變化監聽器
  • 將子樹路徑映射到註冊數據讀取器

另外,如今DOM數據代理的職責是:異步

  • 爲數據讀取器讀取請求路由
  • 兩階段提交協調
  • 發佈數據更改事件
  • 捕獲先後狀態

異步讀取 工具

大多數MD-SAL API是異步的--有一個例外是用於讀取*數據操做,這個操做比較快。 當引入額外的讀取*數據用例時,例如懶編解碼生成,提供讀取操做的遠程系統(Netconf),支持多個讀取器和集羣,這個速度就會慢下來。性能

所提出的改變是使DataReader約束也是異步的,這容許讀取連接,並容許調用者線程在讀取期間不被阻塞。 這將致使更簡潔的併發模型。

建議的改變:https://git.opendaylight.org/gerrit/#/c/5143/2

需求
      交易
      在交易期間一致的數據存儲視圖:

  • 應用程序能夠讀取對數據存儲所作的全部修改。
  • 應用程序在當前事務(隔離)以後不能包含任何寫入。

 咱們須要作什麼

  •  須要擴展yang-data-api以提供與YANG模式定義的數據結構更好匹配的樹結構: 數據結構須要與實例標識符緊密對齊;數據結構應支持原子操做;
  • 須要擴展sal-common-api,sal-core-api和sal-binding-api API以更好地指定用戶意圖
  • 分離操做數據存儲和配置數據存儲

建議的變動

     新規範化數據樹模型

     新規範化模型將表明YANG規範背後的實際理念。 它將再也不基於序列化格式(如YANG規範中定義並由sal-broker-impl 1.0使用)。     

NormalizedNode - 表示樹結構中的節點的基本類型;全部其餘節點類型都是今後基本類型派生的。它包含一個葉子標識符和一個值。
     DataContainerNode - 包含多個葉子的節點;它在YANG語法中沒有直接的表示。
            ContainerNode - 節點,表示每一個父節點只能有一個;它包含多個葉子,並映射到YANG中的容器語句。
    MapEntryNode - 表示葉子的節點,能夠出現屢次。 MapEntryNode可能包含多個葉子。 MapEntryNode映射到YANG中的列表List實例。
    ChoiceNode -     表明葉子的節點,每一個父節點大多出現一次,但可能的值可能有不一樣的類型。映射到選擇語句choice。類型映射到該選擇的案例語句。
    AugmentationNode - 表示葉子的節點,每一個父節點大多發生一次。
   LeafNode - 表示葉子的節點,每一個父節點大多出現一次。包含簡單的值。
     LeafSetEntryNode - 表示葉子的節點,每一個父節點能夠屢次出現該類型的節點。映射到YANG中的葉子列表的實例。
     LeafSetNode - 特殊節點,每一個父節點只能出現一次;其葉子是指定類型的LeafSetEntryNode節點。
     MapNode - 特殊節點,每一個父節點只能出現一次;其葉子是MapEntryNode節點。

     當前模型不提供InstanceIdentifier和Data Store之間的綁定。 在該建議中經過定義InstanceIdentifier中的路徑參數與數據樹節點之間的關係來解決此問題。

     請參閱OpenDaylight_Controller:MD-SAL:Design:Normalized_DOM_Model

     提出的API的代碼在:http://git.opendaylight.org/gerrit/5441

   對現有組件的影響

      此建議將影響執行 perform schema aware data normalization 的組件:

     Yangtools

      yang-data-impl - XmlDocumentUtils - Netconf工具使用的一組實用程序和編解碼器,用於根據提供的Schema將輸入XML歸一化爲yang-data-api 

      binding-generator-impl - LazyGeneratedCodecRegistry - 從Java DTO到yang-data-api的運行時生成的編解碼器

     Controller

sal-rest-connector RestconfContext - 將輸入json / xml轉換爲中間格式,使用Schema上下文進行規範化; 
sal- * DataBroker - 統一Java DTO和yang-data-api之間的概念,定義正確的格式將提升數據代理的代碼可重用性,可讀性和性能; 
DataStore - 數據存儲實現將受益於規範化數據模型,這將致使更有效的實現

     這些組件將被修改成使用新的規範化數據模型(提供更有效的API)。

新組件
    內存數據庫/緩存    

    新的DOM數據代理的契約和部署模型將假定存在內存數據庫(緩存),它將從如下職責中代替DOM數據代理:

  •     將子樹路徑映射到註冊數據變化監聽器
  •     發佈數據變動事件;
  •     捕獲「以前」和「以後」狀態
相關文章
相關標籤/搜索