IoT 时代传感器每秒产生几十个数据点(温度、压力、位置),传统 MySQL 一行一行写——索引碎片、表膨胀、性能崩盘。时序数据库(Time Series Database) 就是为这种"高频写入、范围查询、降采样分析"场景设计的。这篇文章把三类主流的时序数据库(InfluxDB 1.x/2.x、TimescaleDB、TDengine)在 Docker 里的部署、配置、查询实战一次性收齐。
阅读对象:IoT / 监控 / 金融行情 / DevOps Metrics 等"时序数据"场景的工程师;正在选型时序数据库的架构师。
覆盖范围:InfluxDB 1.x 数据保留策略、用户授权、influxdb-relay 高可用;InfluxDB 2.x token + bucket 模式;TimescaleDB hypertable 实战(见 PostgreSQL 篇);TDengine 2.0/3.3 客户端、超级表、taos.cfg。
一、时序数据库选型速查
| 数据库 | 类型 | 写入吞吐 | 查询语言 | 适合 |
|---|
| InfluxDB 1.x | 纯时序 | 高 | InfluxQL(类 SQL) | 监控指标(Prometheus 替代) |
| InfluxDB 2.x | 纯时序 + Flux | 高 | InfluxQL + Flux | 新项目、与 Grafana 集成 |
| TimescaleDB | PG 扩展 | 中 | SQL | 关系+时序混合场景 |
| TDengine | 国产自研 | 极高 | SQL | 工业 IoT、千万级设备 |
核心区别:
- InfluxDB:写快、读强、生态成熟(Telegraf + Grafana),但集群版不开源
- TimescaleDB:复用 PostgreSQL,关系+时序一把抓,单机性能中等
- TDengine:国产、写入性能逆天、硬件资源占用低,但生态相对小
二、InfluxDB 1.x
2.1 启动
1
2
3
4
5
6
7
8
9
10
11
12
| docker pull influxdb:1.8.0-alpine
# 导出默认配置
docker run --rm influxdb:1.8.0-alpine influxd config > /home/docker/influxdb/conf/influxdb.conf
# 启动
docker run -d --name influxdb \
-p 8086:8086 \
-v /home/docker/influxdb/conf/influxdb.conf:/etc/influxdb/influxdb.conf:ro \
-v /home/docker/influxdb/data:/var/lib/influxdb \
--restart=always \
influxdb:1.8.0-alpine -config /etc/influxdb/influxdb.conf
|
2.2 初始化用户和库
1
2
3
4
5
6
| docker exec -it influxdb /bin/bash
> create user "<your-org>" with password '{{REDACTED}}'
> show users
> create database safety_dev
> show databases
|
2.3 数据保留策略(RP)
1
2
3
4
5
6
7
8
9
10
11
| # 进入 influx CLI
docker exec -it influxdb influx
# 创建保留 30 天的策略
create retention policy "rp-day-30" on "mydb" duration 30d replication 1 default
# 改保留期
alter retention policy "rp-day-30" on "mydb" duration 20d replication 1 default
# 查看
show retention policies on "mydb"
|
2.4 批量建库脚本
1
2
3
4
5
6
| cat << 'EOF' | docker exec -i influxdb influx
create user "<your-org>" with password '{{REDACTED}}';
create database safety_dev;
create retention policy "rp-day-365" on "safety_dev" duration 365d replication 1 default;
GRANT ALL PRIVILEGES ON "safety_dev" TO "<your-org>";
EOF
|
2.5 写入与查询
1
2
3
4
5
6
7
8
| # 写入(tag + field + time)
insert cpu_usage,ip=192.168.0.1 value=30
insert temperature,iccid=1119264005543987 value="23.6"
# 查
select * from temperature tz('Asia/Shanghai')
delete from temperature
show field keys from temperature
|
Why 没 into? InfluxDB 1.x 的 insert 语句不写 into(写 into 是 SQL 习惯)。measurement 名是第一个 token(这里是 cpu_usage / temperature)。
2.6 高可用:influxdb-relay
influxdb-relay 是 InfluxData 官方的高可用代理:写入请求复制到多台 InfluxDB,查询自动选择可用节点。
1
2
3
4
| git clone https://github.com/influxdata/influxdb-relay.git
cd influxdb-relay
git checkout tags/v1.8.0
docker build -t my-influxdb-relay:v1.8.0 .
|
relay.toml:
1
2
3
4
5
6
7
8
| [[http]]
name = "relay-http"
bind-addr = "0.0.0.0:8096"
output = [
{ name = "influxdb-node1", location = "http://node1.internal:8086" },
{ name = "influxdb-node2", location = "http://node2.internal:8086" },
{ name = "influxdb-node3", location = "http://node3.internal:8086" },
]
|
启动:
1
2
3
4
5
6
| docker run -d \
--name=influxdb-relay \
-p 8096:8096 \
-v /path/to/relay.toml:/etc/influxdb-relay.toml \
--network=influxdb_network \
my-influxdb-relay:v1.8.0 -config /etc/influxdb-relay.toml
|
架构:应用 → relay(写入广播到 3 个 InfluxDB + 查询选择可用节点)→ InfluxDB 集群。不是真正的分布式(每台都是全量数据),适合"读多写少 + 高可用"场景。
三、InfluxDB 2.x
2.x 引入Token 认证 + Bucket 模型,API 与 1.x 不完全兼容。
2.1 启动
1
2
3
4
5
6
| docker pull influxdb:2.7-alpine
docker run -d --name influxdb2 \
-p 8086:8086 \
-v /home/docker/influxdb2/data:/var/lib/influxdb2 \
--restart=always \
influxdb:2.7-alpine
|
2.2 Token 认证
1
2
3
4
5
6
7
8
9
| # 首次启动进入 UI 初始化(http://<host>:8086)
# 创建 org、bucket、token
# Spring Boot 集成
influx2:
url: http://internal.example.com:8086
token: <your_token>
org: my-org
bucket: my-bucket
|
Spring Boot 集成 org.springframework.boot:spring-boot-starter-data-influxdb(2.x 专属 starter)。
四、TimescaleDB
TimescaleDB 是 PostgreSQL 的时序扩展,对用户看就是一张"超表(hypertable)",底层自动按时间分块(chunk)。见 PostgreSQL Docker 实战 篇,本节只列关键点。
1
2
3
4
5
| -- 启用扩展
CREATE EXTENSION IF NOT EXISTS timescaledb;
-- 转超表
SELECT create_hypertable('sensor_data', 'time');
|
优势:
- 复用 PG 的 SQL、事务、备份工具
- 关系数据 + 时序数据一把抓
- 连续聚合(Continuous Aggregate)自动降采样
劣势:
- 单机写入性能不如 InfluxDB / TDengine
- PG 本身的运维成本(vacuum、autovacuum 调优)
五、TDengine(国产时序库)
TDengine 是涛思数据(TAOS Data)2017 年开源的时序数据库,写入性能是 InfluxDB 的 5-10 倍,硬件资源占用 1/5~1/10。国产化场景的优选。
5.1 启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| docker pull tdengine/tdengine:2.0.18.0
docker pull tdengine/tdengine:3.3.6.13
mkdir -p /home/docker/taos/{conf,lib,log,data}
# 2.0 docker-compose
cat << 'EOF' > /home/docker/taos/docker-compose.yml
version: '3'
services:
tdengine:
image: tdengine/tdengine:2.0.18.0
container_name: tdengine
volumes:
- /home/docker/taos/conf:/etc/taos
- /home/docker/taos/lib:/var/lib/taos
- /home/docker/taos/log:/var/log/taos
ports:
- "6030:6030"
- "6035:6035"
- "6041:6041"
- "6030-6040:6030-6040/udp"
restart: always
EOF
docker-compose -f /home/docker/taos/docker-compose.yml up -d
# 3.x 启动
docker run -tid \
--name tdengine \
--restart=always \
--hostname="worker9" \
-v /data/docker/taos/log:/var/log/taos \
-v /data/docker/taos/data:/var/lib/taos \
-p 6030-6060:6030-6060 \
-p 6030-6060:6030-6060/udp \
tdengine/tdengine:3.3.6.13
|
5.2 端口说明
| 端口 | 协议 | 作用 |
|---|
| 6030 | TCP | 原生客户端 |
| 6035 | TCP | 启动服务 |
| 6041 | TCP | 监控/管理 |
| 6030-6040 | UDP | 多播(集群内) |
5.3 客户端
1
2
3
4
5
6
7
8
| # Windows 客户端
# https://www.taosdata.com/cn/getting-started/
# 可视化工具 Taos.Studio
# https://github.com/maikebing/Taos.Studio/releases
# 配置文件 taos.cfg(C:\TDengine\cfg\taos.cfg)
# firstEp <server_ip>:6030
|
命令行进入 taos shell:
1
2
| taos
# 默认用户名 root,密码 taosdata
|
5.4 建库建表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| -- 创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name [KEEP keep] [UPDATE 1];
CREATE DATABASE zzkde;
-- 创建超级表(模板)
CREATE STABLE history (
ts timestamp,
src binary(200),
ch0 binary(20),
ch1 binary(20),
...
ch50 binary(20)
) TAGS (sn binary(20), group_id int);
-- 用超级表做模板创建子表
CREATE TABLE d1000 USING history TAGS ("1000", 2);
-- 插入(自动建表)
INSERT INTO d1001 USING history TAGS ("1001", 2) VALUES (now, 1, 1, 1, ...);
-- 插入已有表
INSERT INTO d1000 VALUES ('2021-03-12 11:26:02', '...', ...);
|
**超级表(STable)**是 TDengine 的核心抽象:1 张 STable = 1 类设备,N 张子表 = N 个设备实例。每张子表自动继承 STable 的 schema 和 tag。
5.5 关键参数调优
/etc/taos/taos.cfg:
1
2
3
4
5
6
7
8
9
10
11
12
| # 客户端 FQDN(集群必须)
fqdn worker9.internal
# 监听所有网卡
serverPort 6030
# 最小存储天数
keep 3650
# 数据块大小(设备多时调大)
cacheNumOfBlocks 6
cacheBlockSize 1024
|
六、InfluxDB vs TimescaleDB vs TDengine
| 维度 | InfluxDB 1.x | TimescaleDB | TDengine |
|---|
| 类型 | 纯时序 | PG 扩展 | 纯时序(自研引擎) |
| 写入性能 | 高 | 中 | 极高(10x InfluxDB) |
| 查询语言 | InfluxQL | SQL | SQL |
| 生态 | Telegraf + Grafana | PG 生态 | 较新,国产生态 |
| 集群 | 企业版(不开源) | Citus / Patroni | 开源(3.x 内置集群) |
| 内存占用 | 中 | 大(PG) | 极小(1/10 InfluxDB) |
| 适合 | 监控、Prometheus 替代 | 关系+时序混合 | 工业 IoT、千万级设备 |
经验法则:
- 监控指标、可视化、Prometheus 替代 → InfluxDB 1.x/2.x
- 业务系统需要关系 + 时序混合 → TimescaleDB
- 工业 IoT / 千万级设备 / 国产化 → TDengine
七、2024+ 视角补充
本文写于 2023-09,2024-2026 几年里这三类时序库都有显著演进:
InfluxDB:2024-01 推出 InfluxDB 3.0(InfluxData 重写了存储引擎为 FDAP 架构,基于 Apache Arrow + DataFusion),IO 性能比 1.x/2.x 提升 10x+,但 OSS 版本仅暴露核心读写 API;2.x 仍是当前生态最稳的"开箱即用"选择。Telegraf + InfluxDB 2.x + Grafana 这套依然是把"指标 + 时序分析"零代码搭起来的首选。
TimescaleDB:2024-08 发布的 TimescaleDB 2.18 把 hypercore 列为正式 GA——hypercore 是新一代存储引擎(行存 + 列存混合),分析查询比 hypertable 快 10-100x。TimescaleDB 还在 2024-09 把 timescale/timescaledb 镜像迁到 timescale/timescaledb-ha,推荐改用 HA 镜像做生产。
TDengine:2024-2025 持续迭代 3.3.x → 3.4.x,主要变化:
- TDgpt 内置 AI 分析(2024-11):时序异常检测、预测直接 SQL 调用
- 流计算引擎 2.0:窗口函数 + 事件驱动双模式
- 3 节点 RAFT 集群:内置高可用不再依赖第三方(之前要接 ZK)
- 订阅/消费者 模型重构:Kafka-like 订阅 API,2024-Q3 全面替代旧的 topic 模式
经验法则更新:监控/Prometheus 替代首选仍是 InfluxDB 2.x;混合关系+时序用 TimescaleDB(强烈推荐升 2.18+ 体验 hypercore);工业 IoT/千万级设备 TDengine 3.4+ 优势进一步扩大(10x 性能 + 内置 AI)。
八、扩展阅读