基于 Apache IoTDB 的

跨『端-边-云』的时序数据库

  • 高压缩

    从0到1自研底层文件格式TsFile,采用专有压缩算法,节省90%+存储成本。

  • 分布式

    完全开源。在无需数据迁移的情况下,达成秒级扩容,降低运维压力。

  • 工业友好

    深入工业场景。适配数百种采集协议,支持乱序写入、一键备份等。

提供行业领先的

物联网时序数据库

管理系统及服务

聚焦大数据底层技术软件研发,实现时序数据采集、写入、存储、查询、分析、应用全周期生命覆盖,让企业用更低的成本挖掘更大的数据价值。

应用编程示意

选择你想查看的语言 查看相应源代码
package org.apache.iotdb;

import org.apache.iotdb.isession.SessionDataSet;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.session.Session;
import org.apache.iotdb.tsfile.write.record.Tablet;
import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;

import java.util.ArrayList;
import java.util.List;

public class SessionExample {

  private static Session session;

  public static void main(String[] args)
          throws IoTDBConnectionException, StatementExecutionException {
    session =
            new Session.Builder()
                    .host("172.0.0.1")
                    .port(6667)
                    .username("root")
                    .password("root")
                    .build();
    session.open(false);
    List<MeasurementSchema> schemaList = new ArrayList<>();
    schemaList.add(new MeasurementSchema("s1", TSDataType.FLOAT));
    schemaList.add(new MeasurementSchema("s2", TSDataType.FLOAT));
    schemaList.add(new MeasurementSchema("s3", TSDataType.FLOAT));
    Tablet tablet = new Tablet("root.db.d1", schemaList, 10);

    tablet.addTimestamp(0, 1);
    tablet.addValue("s1", 0, 1.23f);
    tablet.addValue("s2", 0, 1.23f);
    tablet.addValue("s3", 0, 1.23f);
    tablet.rowSize++;
    session.insertTablet(tablet);
    tablet.reset();
    try (SessionDataSet dataSet = session.executeQueryStatement("select ** from root.db")) {
      while (dataSet.hasNext()) {
        System.out.println(dataSet.next());
      }
    }
    session.close();
  }
}
from iotdb.Session import Session
from iotdb.utils.IoTDBConstants import TSDataType
from iotdb.utils.Tablet import Tablet

ip = "127.0.0.1"
port = "6667"
username = "root"
password = "root"
session = Session(ip, port, username, password)
session.open(False)

measurements = ["s_01", "s_02", "s_03", "s_04", "s_05", "s_06"]
data_types = [
    TSDataType.BOOLEAN,
    TSDataType.INT32,
    TSDataType.INT64,
    TSDataType.FLOAT,
    TSDataType.DOUBLE,
    TSDataType.TEXT,
]
values = [
    [False, 10, 11, 1.1, 10011.1, "test01"],
    [True, 100, 11111, 1.25, 101.0, "test02"],
    [False, 100, 1, 188.1, 688.25, "test03"],
    [True, 0, 0, 0, 6.25, "test04"],
]
timestamps = [1, 2, 3, 4]
tablet = Tablet(
    "root.db.d_03", measurements, data_types, values, timestamps
)
session.insert_tablet(tablet)

with session.execute_statement(
    "select ** from root.db"
) as session_data_set:
    while session_data_set.has_next():
        print(session_data_set.next())

session.close()
#include "Session.h"
#include <iostream>
#include <string>
#include <vector>
#include <sstream>

int main(int argc, char **argv) {
  Session *session = new Session("127.0.0.1", 6667, "root", "root");
  session->open();

  std::vector<std::pair<std::string, TSDataType::TSDataType>> schemas;
  schemas.push_back({"s0", TSDataType::INT64});
  schemas.push_back({"s1", TSDataType::INT64});
  schemas.push_back({"s2", TSDataType::INT64});

  int64_t val = 0;
  Tablet tablet("root.db.d1", schemas, /*maxRowNum=*/ 10);
  tablet.rowSize++;
  tablet.timestamps[0] = 0;
  val=100; tablet.addValue(/*schemaId=*/ 0, /*rowIndex=*/ 0, /*valAddr=*/ &val);
  val=200; tablet.addValue(/*schemaId=*/ 1, /*rowIndex=*/ 0, /*valAddr=*/ &val);
  val=300; tablet.addValue(/*schemaId=*/ 2, /*rowIndex=*/ 0, /*valAddr=*/ &val);

  session->insertTablet(tablet);
  tablet.reset();

  std::unique_ptr<SessionDataSet> res = session->executeQueryStatement("select ** from root.db");
  while (res->hasNext()) {
    std::cout << res->next()->toString() << std::endl;
  }

  res.reset();
  session->close();
  delete session;
  return 0;
}
package main

import (
        "fmt"
        "log"

        "github.com/apache/iotdb-client-go/client"
)

func main() {

        config := &client.Config{
                Host:     "127.0.0.1",
                Port:     "6667",
                UserName: "root",
                Password: "root",
        }
        session := client.NewSession(config)
        if err := session.Open(false, 0); err != nil {
                log.Fatal(err)
        }
        defer session.Close() // close session at end of main()
        
        rowCount := 3
        tablet, err := client.NewTablet("root.db.d1", []*client.MeasurementSchema{
                {
                        Measurement: "restart_count",
                        DataType:    client.INT32,
                        Encoding:    client.RLE,
                        Compressor:  client.SNAPPY,
                }, {
                        Measurement: "price",
                        DataType:    client.DOUBLE,
                        Encoding:    client.GORILLA,
                        Compressor:  client.SNAPPY,
                }, {
                        Measurement: "description",
                        DataType:    client.TEXT,
                        Encoding:    client.PLAIN,
                        Compressor:  client.SNAPPY,
                },
        }, rowCount)

        if err != nil {
                fmt.Errorf("Tablet create error:", err)
                return
        }

        timestampList := []int64{0, 1, 2}
        valuesInt32List := []int32{5, -99999, 123456}
        valuesDoubleList := []float64{-0.001, 10e5, 54321.0}
        valuesTextList := []string{"test1", "test2", "test3"}
        for row := 0; row < rowCount; row++ {
                tablet.SetTimestamp(timestampList[row], row)
                tablet.SetValueAt(valuesInt32List[row], 0, row)
                tablet.SetValueAt(valuesDoubleList[row], 1, row)
                tablet.SetValueAt(valuesTextList[row], 2, row)
        }
        session.InsertTablet(tablet, false)

        var timeoutInMs int64
        timeoutInMs = 1000
        sql := "select ** from root.db"
        dataset, err := session.ExecuteQueryStatement(sql, &timeoutInMs)
        defer dataset.Close()

        if err == nil {
                for next, err := dataset.Next(); err == nil && next; next, err = dataset.Next() {
                        record, _ := dataset.GetRowRecord()
                        fields := record.GetFields()
                        for _, field := range fields {
                                fmt.Print(field.GetValue(), "\t")
                        }
                        fmt.Println()
                }
        } else {
                log.Println(err)
        }
}

Java

Python

C++

Go

  • 千万点
    每秒

    单节点每秒千万级
    数据写入

  • 10X

    10X倍无损压缩
    100X倍有损压缩

  • 毫秒
    查询

    TB数据
    毫秒级查询响应

  • 亿级
    点位

    单设备万级点位
    多设备亿级点位

工业真实场景验证

应对数千测点至数十亿测点场景

中车四方

帮助构建中车城轨车辆智能运维系统的核心部分,应用于 300 辆列车,3200 测点/列车的车辆监控数据存储,及对各类车辆故障的统计分析和趋势化分析。可管理列车数增加 1 倍,采样时间提升 60%,需要服务器数降为 1/13,月数据增量压缩后大小下降 95%,实现了日增 4140 亿数据点管理的飞跃。

中国核电

已应用在中核五大核电基地的关键与敏感设备可靠性管理业务,实现工业大数据存储、预处理、失效实时监测计算。目前应用平台可支持 30 台以上服务器,至少 1000 个容器节点,每秒 40000 用户在线处理业务,支持至少 100 TB 时序数据存储,应用秒级调度、部署、运行,可靠性达到 99.9%。

国家电网

帮助构建精准用电调控终端、物联管理平台及实时量测中心,实现多种能源数据采集缓存,多类终端千万级接入管控,在线汇聚全量实时数据。支持日新增至少千万数据,累积亿级数据的高效管理,支持千万级设备并发,千万点数据/秒的实时写入能力。

博世力士乐

运行于博世力士乐全新自动化平台 ctrlX AUTOMATION,可实现 ctrlX 数据层读取实时数据并保存,并为 ctrlX CORE 提供历史时序数据管理能力,解决低资源硬件下随数据量变大而崩溃的问题。目前已集成于多款不同性能的 ctrlX CORE 型号,实现工业生产中计算资源受限下的海量数据处理、边缘侧与中心侧的数据同步功能。

长安汽车

已作为海量智能网联车辆的车况时序数据处理方案,目前接入车辆设备约 57 万,测点数约 8000 万,托管时间序列约 1.5 亿,写入量级达到 150 万条数据/秒。同等硬件资源条件下诊断系统的数据查询效率从分钟级提升到毫秒级。

大唐先一

帮助构建新能源时序数据应用系统,服务大唐集团60家电厂。每家电厂的日数据量达到了 17 亿及以上,数据存储量级达 3 万亿,运维成本减少 95%,且涵盖自定义函数和丰富的查询功能,充分满足分析团队诉求。

京东

已应用于数字能源、数字仓库、智能家居水电气等多领域,帮助构建数字家庭、数字城市、数字能源新成果。单项目测点数大于 5000 万,实现千万级/秒写入,秒级查询响应,存储数据量达 5 年以上,并支持时间窗口统计百万级/秒的记录处理能力与云边协同。

中航机载

帮助构建机载云制造系统,实现边端设备采集处理、生产数据存储、云上业务系统与数据中心的数据交互。由于存储结构、数据接口、存储特点、用户功能函数上的优势,能高效解决机载实时数据获取、存储和查询问题,预期随项目推进的价值能够节省逾百万硬件存储成本开销。

宝武钢铁

帮助构建远程智能运维软硬件平台,目前接入单时间序列 2000 亿个时序点,接口写入速度可达 3000 万每秒,压缩比达到 10 倍,毫秒级高频数据可达到长时间稳定写入,多采集频率可达到稳定兼容。

太极

帮助构建发电机组的远程分析平台,服务4家电厂,11个发电机组,风机锅炉设备、发电机、变电设备等测点数达到 80000 以上,数据采集频次最高达纳秒级,运维成本减少 95%,并提供傅里叶变幻、小波等专业数据处理方法,为分析数据提供很大便利。

国家气象局

帮助构建 MICAPS4 气象预报系统,用于存储全国 10 万个国家级地面实况观测站数据,并为 MICAPS4 提供实况数据展示与分析能力。在实况数据处理上性能提升数倍,支持更长时间的实况数据存储与访问。

中冶赛迪

帮助构建水土云工业互联网平台数据开发治理的核心部分,参与数据管理全流程,并设计实时可视化管理工具 Timecho Workbench。目前管理设备数超过 3 万,测点数超过 25 万,写入量级达到 15 亿条/天,写入点位数提升 132%,压缩比提升 50%,查询速度提升 100%,存储数据时长可达 2 年以上。

华为

帮助构建 MRS 时序数据库,与华为在深度合作与共建生态的过程中,强化一致性框架、扩缩容功能、以及构建安全、传输、加密、可靠性、运维等方面的企业级特性增强,助力更多企业数字化、智能化和智慧化发展。

拓维

帮助构建拓维物联网系统,搭建公司、工厂、车间三级物联网平台,实现设备统一联调联控。产品生命周期缩短 20%,设备资源利用率提高 25%,综合生产效率提升 25%,单箱产值能耗降低 10%。

阿里云

帮助构建阿里云大数据平台 MaxCompute,在 MPP 架构、集群测试框架、云边同步、查询引擎等方向进行优化,让更多企业实现更加优化的物联网大数据计算解决方案。目前实现的解决方案中,带宽要求降低为原方案的 0.2%,查询耗时降低为原方案的 2%。

东方国信

帮助构建 Cloudiip 工业互联网平台,已覆盖冶金、电力、化工等 20 个工业大类行业,和安全生产、节能减排等 9 大应用领域。帮助实现高性能的大数据高并发实时写入,降低 90% 存储成本,支持历史数据查询、实时数据查询、数据计算分析、工业数据上云等功能。

用友

帮助构建制造云YonBIP,提供设备后服务解决方案,服务于钢铁业中的指挥大屏和安环监控、化工业中的生产及设备监控、流程+离散混合制造业中的生产及设备监控、车联网平台的车载终端运行监控及车辆位置跟踪、视频行业的设备及能源监控和生产看板等行业方向。

冠通期货

帮助构建期货行情数据平台,搜集实时 Tick 行情。目前已存储上期所、中金所、大商所、郑商所 4 大交易所、67 个期货品种、1000 多个合约近 20 年历史 Tick 数据,新采集行情平均支持 1 亿条数据/天入库,系统运行稳定,数据检索快速。

查看更多案例

获得学术界和工业界的高度认可

吸引全球贡献者共建开源社区

Chandrasekaran Mohan

数据库事务恢复技术奠基者之一,美国工程院院士

IoTDB 是中国高校首个达到国际顶级(top-level)标准的数据库项目,拥有光明的前景。

刘旭嘉

中国核能电力股份有限公司数字化创新中心负责人

IoTDB 的 UDF 功能能够支持在线时序数据预处理,在征兆趋势判断和规则推理算法将大量测点接入后,能够进行滚动的征兆分析,实现分钟级的故障预警,在网络传输、低延时、运算效率方面效率均明显提升。

黄立

长安汽车智能化研究院车云高可用技术主管

长安汽车采用了 IoTDB 一套单机版、高 IO 的引擎机型,同时实现了单车时间范围的查询和单车全时间序列最新点的查询,目前均达到毫秒级返回,相比以前需要同时维护两套查询方案,整个架构的复杂度明显降低。

刘刚

京东科技 IoT 技术负责人

IoTDB 实现了物联网场景专属模型,能支持树状结构,单节点就能管理百万的设备或者千万条的时间序列。IoTDB 底层使用的 TsFile,低 Schema 的结构,可以在端侧实现即插即用的效果。IoTDB 分布式版本做到了实时化的采集和聚合计算,实现了存储分级管理。

徐少锋

宝武装备智能科技技术中心主任工程师

IoTDB 可以支持多频次、海量时序数据的高效、稳定写入,能够覆盖长达十年的设备全生命周期数据的降采样分析,也能满足各类数据的聚合分析查询、趋势分析等模型需求,为我们节省了大量的服务器。

王超

华为云 MRS 时序数据库研发负责人,Apache IoTDB Committer

IoTDB 协议开放友好,支持SQL接口,方便开发使用,易用性较高。同时,IoTDB 与大数据生态集成度高,支持 Spark、HDFS、Hive 等多种大数据系统无缝集成,能够充分利用大数据组件算力。

李睿博

阿里云自研大数据产品 MaxCompute 生态负责人

近两年来,我们和 IoTDB 社区保持了紧密的合作。IoTDB 以其先进的架构,优越的性能,开放且面向云厂商非常友好的社区,赢得了我们的青睐,成为我们大数据+物联网背景下解决方案的不二选择。

白渐

阿里云技术专家,Apache IoTDB Committer

IoTDB 自主可控、100%开源,有完善的文档和活跃的社区,并遵循 Apache 2.0 开源协议,十分商业友好。从技术上来看,IoTDB 具有十分健壮的架构,内置大规模并行处理框架,可以按需扩展,且本身的性能十分优异,具有高数据的压缩率、低写入延迟和资源占用,十分适合边缘端物联网数据的处理。

Julian Feinauer

德国普戈曼公司 CEO,兼天谋科技欧洲技术负责人

在德国应用场景中非常典型的可用网络带宽有限情况下,因为 IoTDB 的数据通过已经高度压缩的 TsFile 传输,在边缘版数据传输后,可达到开箱即用,且压缩比下降到原始网络带宽量的 20%,完成了约 5 倍的提升。

王超

东方国信分布式数据库事业部时序数据库负责人,Apache IoTDB PMC

IoTDB 是一款开放、高性能、功能丰富的数据库。IoTDB 代码框架灵活性较高,扩展性强,生态较繁荣,能对接多类大数据平台,已写入单节点可达到 2000 万点每秒,查询的延迟可控制在毫秒级。并支持触发器写回,连续查询,云边同步等多种功能,能支持多种业务场景。

2024-01-03

2023 IoTDB Summit:清华大学软件学院长聘副教授龙明盛《IoTDB 新组件:内生机器学习》

12 月 3 日,2023 IoTDB 用户大会在北京成功举行,收获强烈反响。我们邀请到清华大学软件学院长聘副教授龙明盛参加此次大会,并做主题报告——《IoTDB 新组件:内生机器学习》。

联系我们