一、简介
1. 什么是时序数据库?
时序数据库是专门用于存储和处理时间序列数据的数据库系统。
时间序列数据是指按时间顺序索引的一系列数据点。每个数据点都包含:
一个时间戳:记录数据产生的时间。
一个或多个指标值:例如温度、湿度、CPU使用率、股价、销售额等。
一组标签:用于标识数据的来源和属性,例如设备ID、传感器类型、地理位置、股票代码等。
核心思想:数据是按时间流入的,查询也总是围绕时间区间展开。
2. 时序数据的特点
时序数据有其独特的模式,这与传统的关系型数据(如订单、用户信息)截然不同:
海量性:数据源源不断地产生,数据量巨大。一个传感器每秒钟上报一次数据,一年就能产生3150万条记录。
时效性:新数据按时间顺序追加,几乎不会有旧数据的更新或删除操作。
冷热分明:越新的数据被查询和使用的频率越高(热数据),越老的数据被访问的频率越低(冷数据)。
多写少读:95%以上的操作是写入(插入新的数据点),读取操作相对较少,但查询模式复杂。
高并发写入:通常需要同时接收来自成千上万个设备或代理的高并发写入请求。
3. 为什么需要专门的时序数据库?
传统关系型数据库(如 MySQL, PostgreSQL)在处理时序数据时会遇到巨大挑战:
写入瓶颈:频繁的INSERT操作会产生大量写入负载,关系型数据库的B+树索引在大量写入时维护成本极高,容易成为瓶颈。
存储成本高:原始数据不经压缩直接存储,占用空间巨大。
查询效率低:基于时间的范围查询、聚合查询(如求1小时内的平均值、最大值)性能很差,尤其是在海量数据中。
数据生命周期管理困难:难以高效地自动删除过期数据(数据降采样和保留策略)。
时序数据库正是为了解决这些痛点而设计的。
4. 时序数据库的核心技术与优势
列式存储
传统数据库是行式存储,一行数据(所有列)存储在一起,适合OLTP事务。
时序数据库采用列式存储,将同一列的数据存储在一起。这对于聚合查询(如求所有设备在某个时间段的平均温度)极其高效,因为只需要读取特定的列,I/O效率极高。
高效压缩
由于指标值在时间上通常缓慢变化或具有重复性(如
true/false
状态),列式存储非常适合压缩。常用的压缩算法如 Gorilla、Delta-of-delta、Simple-8b 等,可以将数据压缩到原始大小的十分之一甚至二十分之一,极大地降低了存储成本。
专为时间优化的索引
时序数据库通常对时间戳建立主索引,使其能快速定位到某个时间范围内的数据。
对标签建立倒排索引或其他高效索引,使得能快速过滤出某个特定设备或某类设备的数据。
这种“时间戳 + 标签”的索引组合,完美契合了“查询某设备在某时间段内的数据”这类典型场景。
数据降采样与保留策略
保留策略:可以自动删除超过指定时间的老数据,释放存储空间。
降采样:可以自动将高精度的原始数据(如每秒一次)聚合计算成低精度的数据(如每小时的平均值),并存储下来。这样在查询历史趋势时,可以使用降采样后的数据,极大地提升查询速度并节省存储空间。
强大的聚合函数和连续查询
内置了大量针对时序数据的聚合函数(
MEAN
,SUM
,MAX
,MIN
,MEDIAN
,DERIVATIVE
(求导)等)。支持连续查询,可以定期自动执行聚合查询并将结果存入另一张表,用于实现实时仪表盘或告警。
5. 常见的时序数据库
InfluxDB:Go语言编写,是目前最流行、生态最完善的时序数据库之一。开源版和商业版功能有差异。
Prometheus:CNCF毕业项目,起源于监控系统,其存储引擎是专为监控场景设计的时序数据库。是 Kubernetes 生态中的监控事实标准。
TimescaleDB:基于 PostgreSQL 的扩展,将其转变为一个全功能的时序数据库。优势是支持完整的SQL,能与现有PostgreSQL生态无缝集成。
TDengine:国产优秀的时序数据库,以其极高的性能和压缩比著称。开源版和商业版并行。
OpenTSDB:基于 Hadoop 和 HBase 构建,历史悠久,适合大规模集群。
QuestDB:一个高性能、开源的时序数据库,专注于速度和易用性。
6. 典型应用场景
监控系统:IT基础设施监控(服务器CPU、内存、磁盘IO)、应用性能监控(APM)、微服务链路追踪。
物联网:智能家居传感器数据、工业物联网设备状态监控、车联网车辆轨迹与状态。
金融科技:实时股价、交易记录、风险控制指标、欺诈检测。
** DevOps与SRE**:服务性能指标、日志事件的时间序列化分析。
商业智能:网站实时访问量、广告点击率、销售额随时间的变化趋势。
总结对比
特性 | 时序数据库 | 传统关系型数据库 |
---|---|---|
数据模型 | 基于时间戳和标签 | 基于行和表的关系模型 |
写入模式 | 高并发、追加写入 | 随机读写、更新、删除 |
存储效率 | 极高(列式存储+高效压缩) | 较低 |
典型查询 | 时间范围聚合、分组 | 关联查询、事务、点查 |
扩展性 | 易于水平扩展(分片) | 垂直扩展或复杂的分库分表 |
总而言之,时序数据库是应对海量时间序列数据挑战的专用工具,它在写入性能、存储成本和时序查询效率方面相比传统数据库有数量级的提升,是构建现代监控、物联网和分析系统不可或缺的基础组件。
二、安装
1. 拉取镜像
sudo docker pull apache/iotdb:1.3.2-standalone
2.启动和运行容器
注意:这个命令启动的容器不能退出终端,退出后所有表都删除了,再次登录需要重新建表。这里仅作演示用。
docker run --rm -p 6667:6667 --name iotdb apache/iotdb:1.3.2-standalone
当控制台出现这样的提示则表明启动成功:
o.a.i.db.service.DataNode:227 - Congratulations, IoTDB DataNode is set up successfully. Now, enjoy yourself!
下载好后,可以安装dbeaver对时序数据进行可视化操作。
3. 安装dbeaver
下载地址:https://dbeaver.io/files/7.2.5/
4. dbeaver连接iotdb
4.1 添加iotdb驱动 (数据库->驱动管理器)
4.2 建立iotdb连接
4.2.1 选中iotdb驱动
4.2.2 JDBC URL: jdbc:iotdb://ip:6667 #ip替换为数据库所在服务器的ip
默认账号 用户名: root 密码: root