【译】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数据代理:

  •     将子树路径映射到注册数据变化监听器
  •     发布数据变动事件;
  •     捕获“以前”和“以后”状态
相关文章
相关标签/搜索