数据写入

Lindorm时序引擎支持六种数据写入方法:Java Native SDK写入、行协议写入、标准SQL写入、时间序列数据库TSDB接口写入(多值写入和单值写入)、remote write数据写入、Flink数据写入。本文介绍数据写入的六种方法。

Java Native SDK写入

Java Native SDK适用于Java开发者,具体操作,请参见教程:通过Java Native SDK连接并使用Lindorm时序引擎

Java Native SDK写入主要有以下优势:

  • 异步写入,写入无需同步等待。

  • 数据自动攒批,简化开发流程,提高写入效率。

  • 连接池管理,底层自动管理连接复用,无创建大量连接的风险。

  • 出错自动重试,无需业务层重试。

  • 使用自定义传输编码协议,实现高效的数据编解码。

  • 线程安全,业务层无需考虑连接的线程安全问题。

  • 支持强、弱、无约束的三种Schema约束策略。

示例

// 连接地址
String url = "http://ld-bp17j28j2y7pm****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242";
// 创建客户端,LindormTSDBClient线程安全,可以重复使用,无需频繁创建和销毁
ClientOptions options = ClientOptions.newBuilder(url).build();
LindormTSDBClient lindormTSDBClient = LindormTSDBFactory.connect(options);

// 创建数据库和表
lindormTSDBClient.execute("CREATE DATABASE demo");
lindormTSDBClient.execute("demo","CREATE TABLE sensor (device_id VARCHAR TAG,region VARCHAR TAG,time BIGINT,temperature DOUBLE,humidity DOUBLE,PRIMARY KEY(device_id))");

// 写入数据
int numRecords = 10;
List<Record> records = new ArrayList<>(numRecords);
long currentTime = System.currentTimeMillis();
for (int i = 0; i < numRecords; i++) {
    Record record = Record
        .table("sensor")
        .time(currentTime + i * 1000)
        .tag("device_id", "F07A1260")
        .tag("region", "north-cn")
        .addField("temperature", 12.1 + i)
        .addField("humidity", 45.0 + i)
        .build();
    records.add(record);
}
CompletableFuture<WriteResult> future = lindormTSDBClient.write("demo", records);
// 处理异步写入结果
future.whenComplete((r, ex) -> {
    // 处理写入失败
    if (ex != null) {
        System.out.println("Failed to write.");
        if (ex instanceof LindormTSDBException) {
            LindormTSDBException e = (LindormTSDBException) ex;
            System.out.println("Caught an LindormTSDBException, which means your request made it to Lindorm TSDB, "
                               + "but was rejected with an error response for some reason.");
            System.out.println("Error Code: " + e.getCode());
            System.out.println("SQL State:  " + e.getSqlstate());
            System.out.println("Error Message: " + e.getMessage());
        }  else {
            ex.printStackTrace();
        }
    } else  {
        System.out.println("Write successfully.");
    }
});
// 这里作为示例, 简单同步处理写入结果
System.out.println(future.join());
说明

连接地址的获取方法,请参见查看连接地址

行协议写入

Lindorm时序引擎支持通过InfluxDB®行协议写入数据。建议非Java应用通过行协议写入数据。行协议写入支持设置Schema约束策略,默认设置为弱约束。行协议写入的具体操作,请参见行协议写入

重要

通过行协议写入时,不同时间精度的数据最终都会转化成毫秒精度存储。比毫秒精度更高的数据,写入时会丢失精度。

示例

curl -X POST \
'http://ld-bp1489gr5t*****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242/api/v2/write?precision=ms&db=default' \
-d '
sensor7,device_id=F07A1260,region=north-cn temperature=12.1,humidity=45 1619076780000
sensor7,device_id=F07A1260,region=north-cn temperature=13.2,humidity=47 1619076790000
sensor7,device_id=F07A1260,region=north-cn temperature=10.6,humidity=46 1619076800000
sensor7,device_id=F07A1260,region=north-cn temperature=18.1,humidity=44 1619076780000
sensor7,device_id=F07A1260,region=north-cn temperature=19.7,humidity=44 1619076790000
'

标准SQL写入

下表为标准SQL写入支持的两种写入方法。

写入方式

适用场景

描述

操作文档

JDBC Driver

Java语言的应用开发

使用JDBC写入数据时,需要自己管理连接池或使用Druid管理连接池。

Java JDBC Driver开发手册

HTTP SQL API

非Java语言的应用开发

时序引擎支持基于HTTP协议的API接口实现SQL交互。

HTTP API SQL接口开发手册

时间序列数据库TSDB的接口写入

对于时间序列数据库TSDB的迁移用户,时序引擎支持使用时间序列数据库TSDB兼容的接口写入数据。下表为时间序列数据库TSDB接口写入的两种方法。

写入方法

描述

操作文档

多值写入

多值写入使用/api/mput接口写入数据。Schema约束策略默认为无约束,即不会创建时序数据表,也不支持SQL查询。如果需要使用SQL查询数据,您可以在数据写入前或写入后手动建表,也可以将数据库约束策略设置为弱约束,开启自动建表。

说明

修改Schema约束策略,请参见数据写入方式与Schema约束的选择

单值写入

单值写入同时也是兼容OpenTSDB的写入,Schema约束策略只能为无约束,即不会自动创建时序数据表、也不支持直接使用SQL查询数据。不再推荐使用。

使用remote write数据写入

时序引擎可以作为Prometheus的远端存储,在数据写入后,可以使用PromQL来查询数据。具体操作,请参见通过Prometheus访问时序引擎

使用Flink数据写入

时序引擎支持通过集成Native SDK的Sink插件写入数据。具体操作,请参见使用Flink写入时序引擎