zoukankan      html  css  js  c++  java
  • 【译】OpenDaylight控制器:MD-SAL架构:DOM DataStore

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

    问题描述

    在MD-SAL数据存储和数据存储本身的当前实现中,存在几个有关数据结构问题:

    • 数据结构(在yang-data-api中定义)更像是XML结构,因此很难在其上实现优化的数据存储。 而YANG定义的数据结构应该被使用在数据存储中。 Yang定义的数据结构已经在MD-SAL、YangTools和其他组件生成的Java DTO中使用;
    • 目前,MD-SAL数据契约(contracts)没有提供足够的能力来更精确地指定应用程序的意图并对客户端执行优化(例如,“不必要地反序列化数据”或“仅计算必要的变化集合”);
    • 数据存储的实现不允许在子树上进行原子更新。

    为了提高MD-SAL的可靠性和性能,上述问题需要解决。   

    当前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数据代理:

    •     将子树路径映射到注册数据变化监听器
    •     发布数据变更事件;
    •     捕获“之前”和“之后”状态
  • 相关阅读:
    重写对象的compareTo方法
    java基础之----hbase
    java基础之----innodb存储引擎
    java基础之----mysql存储结构
    fastjson jsonArrsy 转 list ,list 转 jsonArray
    java基础之----elasticsearch(Java客服端搜索实例)
    java基础之----elasticsearch
    java基础之----RabbitMQ
    java基础之----kafka
    java基础之----zookeeper
  • 原文地址:https://www.cnblogs.com/FrankZhou2017/p/7308428.html
Copyright © 2011-2022 走看看