You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenDaylight中存储数据?开发控制器应用需存时间、数字与IP

在OpenDaylight中存储数据的实用方案

嘿,刚好我之前在ODL上开发过需要存储时间、数值和IP的应用,给你梳理几个靠谱的实现方向,还有你关心的数据库问题也一起解答:

一、优先用ODL原生的MD-SAL数据存储(最推荐)

OpenDaylight本身就基于**MD-SAL(模型驱动服务抽象层)**实现了内置的数据持久化,完全不需要额外部署数据库,而且和ODL的生态无缝集成,这是开发ODL应用的标准做法。

具体步骤:

  1. 用YANG定义你的数据模型
    先写一个YANG文件,把你要存的时间、数字、IP字段定义清楚,ODL有内置的标准类型可以直接用:
    module my-app-data {
        namespace "urn:opendaylight:params:xml:ns:yang:my-app-data";
        prefix "myapp";
    
        import yang { prefix "yang"; }
        import inet { prefix "inet"; }
    
        container my-stored-data {
            list data-entry {
                key "entry-id";
                leaf entry-id { type uint32; }
                leaf record-time { type yang:date-and-time; } // 时间字段
                leaf metric-value { type uint64; } // 数字字段
                leaf device-ip { type inet:ipv4-address; } // IP地址
            }
        }
    }
    
  2. 生成Java绑定类
    用ODL的Maven插件(比如odl-yang-maven-plugin)把YANG文件生成对应的Java类,这样你就能在应用代码里通过MD-SAL的API操作数据了。
  3. 通过DataBroker读写数据
    在你的应用里注入DataBroker服务,用它来创建读写事务:
    // 注入DataBroker(用OSGi注解或者Spring依赖注入)
    @Reference
    private DataBroker dataBroker;
    
    // 写入数据示例
    public void writeData(uint32 entryId, String time, long metric, String ip) {
        InstanceIdentifier<DataEntry> iid = InstanceIdentifier.builder(MyStoredData.class)
            .child(DataEntry.class, new DataEntryKey(entryId))
            .build();
        DataEntry entry = DataEntryBuilder.create()
            .setEntryId(entryId)
            .setRecordTime(time)
            .setMetricValue(metric)
            .setDeviceIp(ip)
            .build();
        WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
        tx.put(LogicalDatastoreType.CONFIGURATION, iid, entry);
        try {
            tx.submit().get();
        } catch (Exception e) {
            // 处理异常
        }
    }
    
    这些数据会自动存在ODL的内置存储里(默认是LevelDB,也可以配置成Cassandra等其他后端),重启控制器后数据不会丢失。

二、集成外部数据库(适合大数据量/复杂查询)

如果你的数据需要做复杂的统计分析,或者数据量特别大,原生存储满足不了需求,可以自己集成外部数据库,比如:

  • 时序数据库:InfluxDB(完美适配你的时间+数字存储场景,查询历史数据效率极高)
  • 关系型数据库:MySQL、PostgreSQL(适合需要关联查询的场景)
  • NoSQL数据库:MongoDB(适合非结构化数据)

实现思路:

在你的ODL应用里引入对应的数据库客户端依赖(比如JDBC驱动、InfluxDB Java SDK),然后在代码里直接操作数据库。比如用JDBC连接MySQL:

// 初始化数据库连接(建议用连接池)
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/my_db", "user", "pass");

// 写入数据
PreparedStatement stmt = conn.prepareStatement("INSERT INTO metrics (record_time, metric_value, device_ip) VALUES (?, ?, ?)");
stmt.setTimestamp(1, Timestamp.valueOf(time));
stmt.setLong(2, metric);
stmt.setString(3, ip);
stmt.executeUpdate();

注意要处理好连接池的生命周期,和ODL应用的启动/停止同步,避免资源泄漏。

三、关于“在ODL中创建数据库”的疑问

ODL本身不需要你手动创建数据库:

  • 如果你用原生的MD-SAL存储,只需要定义YANG模型,ODL会自动帮你管理数据的存储结构,底层的LevelDB/Cassandra会自动创建对应的存储区域。
  • 如果用外部数据库,那需要你提前在数据库服务器上创建好数据库和表,然后在ODL应用里连接使用即可。

实践小建议

  • 如果是存储和网络控制相关的配置/状态数据,优先用MD-SAL原生存储,最省心,还能享受ODL的事务、数据订阅等特性。
  • 如果是存历史监控数据(比如时间+数字的指标),强烈推荐用InfluxDB,比原生存储更适合时序数据的查询和分析。
  • 开发测试时,可以用ODL Karaf的odl:yang-show命令查看你的YANG模型是否正确,用Postman调用RESTCONF API来测试数据读写。

内容的提问来源于stack exchange,提问作者 jad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:03:47