时序数据存储是一种高性能、低成本、稳定可靠的在线时序数据库服务,提供高效读写、高压缩比存储等服务。

背景信息

如果您购买了实例,可以享受时序数据存储服务。公共实例不提供此服务。购买实例,请参见实例管理

什么是时序数据存储

时序数据存储是一种高性能、低成本、稳定可靠的在线时序数据库服务,提供高效读写、高压缩比存储等服务,广泛应用于物联网(IoT)设备监控系统、企业能源管理系统(EMS)、生产安全监控系统和电力检测系统等行业场景,解决由于设备采集点数量巨大、数据采集频率高造成的存储成本高、写入和查询分析效率低的问题。

时序数据存储是一个分布式时序数据库,具备多副本高可用能力。同时在高负载大规模数据量的情况下可以方便地进行弹性扩容,方便用户结合业务流量特点进行动态规划与调整。

产品功能

时序数据存储提供以下功能:

  • 时序数据高效读写

    对于百万数据点的读取,响应时间小于5秒,且最高可以支撑每秒千万数据点的写入。

    • 数据写入:支持通过配置数据流转规则,将数据转发到实例内的时序数据存储进行数据写入。
    • 数据查询:支持通过SDK进行数据的查询操作。
  • 数据管理

    您可以通过控制台设置数据的有效期。数据时效开启并设置完成后,系统对于定义的过期数据将立即标记失效,并在特定时间进行自动化清理。

  • 高效压缩存储

    将单个数据点的平均使用存储空间降为1~2个字节,可以降低90%存储使用空间,同时加快数据写入的速度。

  • 数据安全

    时序数据存储默认采取三副本策略,充分保证数据的可用性。

开通时序数据存储

时序数据存储随您购买的实例开通。购买实例,请参见实例管理

需要选择时序数据存储的规格,包括以下项目:

项目 说明
时序数据写入TPS 每秒钟写入时序数据存储的最大数据条数,达到上限后会写入失败。

时序数据写入TPS选择5千条/秒时,不支持TSQL。

时序数据存储空间 时序数据达到存储空间上限后会写入失败。

默认时序数据时效为永久,购买后时序数据时效可配置,请参见管理时序数据存储

说明 当实例被释放时,时序数据存储也将同时被释放。

管理时序数据存储

开通时序数据存储后,您可以设置时序数据时效,查看时序存储用户名和密码,重新创建时序存储用户。

  1. 登录物联网平台控制台
  2. 在左侧导航栏,选择实例管理
  3. 单击时序数据存储所在实例对应的查看,进入实例详情页。
  4. 设置时序数据时效。
    创建实例时时效配置默认关闭。您可以开启数据时效,设置时效为1~365天。

    实例详情页,打开时序存储时效开关,设置保留数据天数。

  5. 查看时序存储用户名和密码。
    用户名和密码用于通过SDK访问时序存储中的数据,创建实例时会自动生成。

    实例详情页,在实例信息中查看时序存储用户名,单击查看,短信校验码验证通过后显示密码。

  6. 重新创建时序存储用户。
    说明 重新创建时序存储用户后,旧的用户名和密码将失效,会导致正在进行的时序数据查询失败,请及时更新SDK使用的用户名和密码。
    实例详情页,单击重新创建,输入新的用户名、密码,短信校验码验证通过后创建成功。

写入时序数据

时序数据存储的唯一写入方式为:通过配置数据流转规则,将数据转发到实例内的时序数据存储。

说明
  • 在设置转发之前,请参见设置数据流转规则,创建数据转发规则和编写处理数据的SQL。
  • 只支持JSON格式数据转发。
  • 转发的消息中,除了配置的timestamptag字段外,其他字段都将作为metric写入时序数据存储。metric的值只能为数值类型,否则会导致写入失败。
  1. 登录物联网平台控制台
  2. 在左侧导航栏,选择规则引擎 > 云产品流转
  3. 单击规则对应的查看,进入数据流转规则页。
  4. 单击转发数据一栏对应的添加操作
  5. 添加操作对话框中,选择操作为存储到实例内的时序数据存储中
  6. 按照界面提示,设置其他信息,单击确定
    添加操作
    参数 描述
    选择操作 选择存储到实例内的时序数据存储中
    timestamp 时间戳。支持:
    • 使用转义符${}表达式,例如${time},表示取值为数据源Topic消息中time字段对应的值。
    • 使用数据流转函数timestamp(),表示取值为数据流转服务器的时间戳。
    • 输入值,必须为Unix时间戳,例如1404955893000。
    tag 设置标记数据的标签名。支持中文汉字、英文字母、数字、和特殊字符,包括:半角冒号(:)、逗号(,)、点号 (.)、单引号(')、正斜线(/)、连字符(-)、下划线(_)、圆括号()、方括号[]。
    设置标签值。支持:
    • 使用转义符${}表达式。例如,数据源Topic的消息结构中,包含一个位置属性,标识符为city,则可以指定标签值为${city},表示消息中city字段对应的值。建议使用此方式。
    • 使用数据流转函数规定的一些函数,例如deviceName(),表示标签值为设备名称。支持的函数,请参见函数列表
    • 输入常量,例如beijing。支持输入中文汉字、英文字母、数字、和特殊字符包括:半角冒号(:)、逗号(,)、点号 (.)、单引号(')、正斜线(/)、连字符(-)、下划线(_)、圆括号()、方括号[]。
    说明
    • 最多可添加8个tag键值对。
    • 需保证时序数据存储能够获取到配置的tag键值对,如果获取不到任意一个tag键值对,会导致写入数据库失败。
  7. 回到云产品流转页,单击规则对应的启动按钮启动规则。

下面给出一个数据流转示例。

某规则的SQL如下:

SELECT time,city,power,distance, FROM "/alprodu****/myDevice/user/update";

规则引擎根据SQL处理数据和写入数据到时序数据存储如下。

  1. 根据该SQL,规则引擎从Topic /alprodu****/myDevice/user/update的消息中,筛选出timecitypowerdistance字段内容,作为转发的消息内容。

    通过以上SQL处理后的转发消息内容示例如下:

    {
    "time": 1513677897,
    "city": "beijing",
    "distance": 8545,
    "power": 93.0
    }
  2. 根据已配置的数据流转操作,规则引擎向时序数据存储中写入两条数据。

    示例中写入时序数据存储的数据如下:

    • 数据: timestamp:1513677897, [metric:power value:93.0]
      tag: cityName=beijing
    • 数据: timestamp:1513677897, [metric:distance value:8545]
      tag: cityName=beijing

查询时序数据

您可以使用SDK查询已写入实例内时序数据存储的数据。

  1. 获取SDK。
    使用Maven做项目构建工具,在pom.xml文件的<dependencies>标签中添加hitsdb-client依赖。代码如下:
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>hitsdb-client</artifactId>
        <version>0.2.7</version>
    </dependency>
    说明 SDK版本号必须为0.2.7及以上。
  2. 配置客户端。
    客户端的所有配置均由TSDBConfig类进行配置。示例代码如下:
    //实例详情页面中的连接地址、端口。
    String connectString = "XXX";
    int port = XXX;
    //实例详情页面中的时序数据存储用户名、密码。
    String username = "XXX";
    String password = "XXXX";
    TSDBConfig config = TSDBConfig.address(connectString, port)
        .basicAuth(username, password)
        // 网络连接池大小,默认为64。
        .httpConnectionPool(64)
        // HTTP 等待时间,单位为秒,默认为90秒。
        .httpConnectTimeout(90)
        // IO 线程数,默认为1。
        .ioThreadCount(1)
        .config();
  3. 查询数据。
    示例代码如下:
    TSDB tsdbClient = TSDBClientFactory.connect(config);
    //按标签筛选数据。
    Map<String, String> tags = new HashMap<>();
    String metric = "XXX";
    long now = System.currentTimeMillis();
    LastPointQuery query = LastPointQuery.builder()
        .timestamp(now)
        .backScan(-1)
        .msResolution(true)
        .sub(LastPointSubQuery.builder(metric, tags).build()).build();
    List<LastDataValue> lastDataValues = tsdbClient.queryLast(query);
    
    System.out.println(lastDataValues);
说明 SDK不能用于将数据写入实例内的时序数据存储。