如何在OpenDaylight中存储数据?开发控制器应用需存时间、数字与IP
在OpenDaylight中存储数据的实用方案
嘿,刚好我之前在ODL上开发过需要存储时间、数值和IP的应用,给你梳理几个靠谱的实现方向,还有你关心的数据库问题也一起解答:
一、优先用ODL原生的MD-SAL数据存储(最推荐)
OpenDaylight本身就基于**MD-SAL(模型驱动服务抽象层)**实现了内置的数据持久化,完全不需要额外部署数据库,而且和ODL的生态无缝集成,这是开发ODL应用的标准做法。
具体步骤:
- 用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地址 } } } - 生成Java绑定类
用ODL的Maven插件(比如odl-yang-maven-plugin)把YANG文件生成对应的Java类,这样你就能在应用代码里通过MD-SAL的API操作数据了。 - 通过DataBroker读写数据
在你的应用里注入DataBroker服务,用它来创建读写事务:
这些数据会自动存在ODL的内置存储里(默认是LevelDB,也可以配置成Cassandra等其他后端),重启控制器后数据不会丢失。// 注入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) { // 处理异常 } }
二、集成外部数据库(适合大数据量/复杂查询)
如果你的数据需要做复杂的统计分析,或者数据量特别大,原生存储满足不了需求,可以自己集成外部数据库,比如:
- 时序数据库: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
相关产品推荐
相关产品推荐

