influxdb简介

influxDB 简介

InfluxDB 是一个 **开源的时序数据库 (Time-Series Database, TSDB)**,专门用于存储、查询和分析 带时间戳的数据

基本特点

  • 高效写入:能处理大量实时数据流(如传感器、日志、监控数据)。
  • 时间序列查询:支持按时间范围快速查询和聚合。
  • 内置函数:提供统计、聚合(平均值、最大值、最小值等)。
  • 轻量易用:安装简单,常与 Telegraf、Grafana 搭配使用。

常见应用

  1. 系统和应用监控(CPU、内存、接口性能)
  2. 物联网数据(温度、湿度、传感器信息)
  3. 金融行情数据(股票、加密货币价格)
  4. 日志和事件记录

influxdb 1.8 部署

docker 持久化部署

准备

准备目录结构和配置文件

image-20250820163421374

案例配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
reporting-disabled = true

[meta]
dir = "/var/lib/influxdb/meta"

[data]
dir = "/var/lib/influxdb/data"
wal-dir = "/var/lib/influxdb/wal"

[http]
enabled = true
bind-address = ":8086"
auth-enabled = false # 先创建admin再 true,如果是用了-e创建则可选true
access-log-path = "/var/log/influxdb/access.log"

[logging]
file = "/var/log/influxdb/influxdb.json"
level = "info"
format = "json"

run

1
2
3
4
5
6
7
docker run -d \
--name influxdb \
-p 8086:8086 \
-v /data/soft/influxdb1.8/data:/var/lib/influxdb \
-v /data/soft/influxdb1.8/config/influxdb.conf:/etc/influxdb/influxdb.conf \
-v /data/soft/influxdb1.8/log:/var/log/influxdb \
influxdb:1.8 -config /etc/influxdb/influxdb.conf

一键脚本

​ 包含配置初始密码

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123

#!/bin/bash
set -e

# =========================
# Docker 安装 InfluxDB 1.8 脚本
# =========================
#
# 功能:
# 1. 拉取/导入 InfluxDB 1.8 镜像
# 2. 创建数据、配置、日志、备份目录
# 3. 生成默认配置文件 influxdb.conf
# 4. 启动 InfluxDB 容器
# 5. 检查容器运行状态
#
# 使用方法:
# sudo bash docker-influxdb-install.sh
# docker ps
# docker logs influxdb
#
# =========================
# 可配置参数
# =========================

IMAGE_FILE="/data/resources/influxdb1.8.tar"
IMAGE_NAME="influxdb:1.8"
CONTAINER_NAME="influxdb"
INFLUXDB_ADMIN_USER="admin"
INFLUXDB_ADMIN_PASSWORD="StrongPass123"

HOST_PORT_1=8086 # 宿主机端口
HOST_PORT_2=8088
CONTAINER_PORT_1=8086 # RPC 端口
CONTAINER_PORT_2=8088
TZ="Asia/Shanghai"

# 数据、配置、日志、备份目录
BASE_DIR="/data/soft/influxdb"
DATA_DIR="$BASE_DIR/data"
CONF_DIR="$BASE_DIR/config"
LOGS_DIR="$BASE_DIR/log"

# =========================
# 创建目录结构
# =========================
echo "创建目录..."
mkdir -p "$DATA_DIR" "$CONF_DIR" "$LOGS_DIR"

# =========================
# 检查本地镜像 / 导入 tar / 拉取远程镜像
# =========================
if docker image inspect "$IMAGE_NAME" >/dev/null 2>&1; then
echo "镜像 $IMAGE_NAME 已存在,本地可用,跳过拉取和导入"
elif [ -f "$IMAGE_FILE" ]; then
echo "本地镜像不存在,但找到资源文件 $IMAGE_FILE,开始导入..."
LOADED_IMAGE=$(docker load -i "$IMAGE_FILE" | awk -F': ' '/Loaded image:/ {print $2}')
docker tag "$LOADED_IMAGE" "$IMAGE_NAME"
echo "镜像已导入并重命名为 $IMAGE_NAME"
else
echo "本地镜像和资源文件都不存在,尝试拉取远程镜像 $IMAGE_NAME ..."
if docker pull "$IMAGE_NAME"; then
echo "远程镜像 $IMAGE_NAME 拉取成功"
else
echo "❌ 镜像 $IMAGE_NAME 拉取失败,请检查网络或资源"
exit 1
fi
fi


# =========================
# 生成默认配置文件
# =========================
CONF_FILE="$CONF_DIR/influxdb.conf"
echo "生成配置文件 $CONF_FILE ..."
cat > "$CONF_FILE" <<EOF
[meta]
dir = "/var/lib/influxdb/meta"

[data]
dir = "/var/lib/influxdb/data"
wal-dir = "/var/lib/influxdb/wal"

[http]
enabled = true
auth-enabled = true
access-log-path = "/var/log/influxdb/access.log"

[logging]
level = "info"

EOF

# =========================
# 启动容器
# =========================
echo "启动 InfluxDB 容器..."
CONTAINER_ID=$(docker run -d \
--name "$CONTAINER_NAME" \
--restart=unless-stopped \
-p $HOST_PORT_1:$CONTAINER_PORT_1 \
-p $HOST_PORT_2:$CONTAINER_PORT_2 \
-v "$DATA_DIR":/var/lib/influxdb \
-v "$CONF_FILE":/etc/influxdb/influxdb.conf \
-v "$LOGS_DIR":/var/log/influxdb \
-e TZ="$TZ" \
-e INFLUXDB_ADMIN_USER=$INFLUXDB_ADMIN_USER \
-e INFLUXDB_ADMIN_PASSWORD=$INFLUXDB_ADMIN_PASSWORD \
-e INFLUXDB_REPORTING_DISABLED=true \
$IMAGE_NAME -config /etc/influxdb/influxdb.conf) || {
echo "❌ 容器启动失败!请检查配置或镜像"
exit 1
}

# =========================
# 检查容器状态
# =========================
if [ "$(docker ps -q -f id=$CONTAINER_ID)" ]; then
echo "✅ InfluxDB 容器已启动,容器名:$CONTAINER_NAME"
docker ps --filter "id=$CONTAINER_ID"
else
echo "❌ InfluxDB 容器启动失败,请查看日志:docker logs $CONTAINER_NAME"
exit 1
fi

实体机部署

添加仓库

1
2
3
4
5
6
7
8
sudo tee /etc/yum.repos.d/influxdb.repo <<EOF
[influxdb]
name = InfluxDB Repository - RHEL/CentOS \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

查看版本

1
dnf list influxdb

安装

1
2
3
dnf install -y influxdb-1.8.10-1
# GPG 签名校验失败可以使用
sudo dnf install -y --nogpgcheck influxdb-1.8.10-1

influxdb数据备份

1
2
docker exec -it influxdb influxd backup -portable /var/lib/influxdb/backup
docker cp influxdb:/var/lib/influxdb/backup ./backup20250819

image-20250820164400019

influxdb数据恢复

版本原因只能恢复业务数据。

用户则需要单独导入。

全量恢复

1
2
3
4
5
6
7
8
docker run -d \
--name influxdb_new \
-p 8087:8086 \
-v /data/soft/influxdb1.8new/data:/var/lib/influxdb \
-v /data/soft/influxdb1.8new/config/influxdb.conf:/etc/influxdb/influxdb.conf \
-v /data/soft/influxdb1.8new/log:/var/log/influxdb \
-v /data/soft/influxdb1.8new/backup:/var/lib/influxdb/backup \
influxdb:1.8 -config /etc/influxdb/influxdb.conf \
1
docker exec -it influxdb_new influxd restore -portable /var/lib/influxdb/backup

增量恢复

通过挂载或者cp备份文件到容器里

1
2
docker exec -it influxdb_new influxd restore -portable -db mydb1 -newdb mydb1 /var/lib/influxdb/backup
docker exec -it influxdb_new influxd restore -portable -db mydb2 -newdb mydb2 /var/lib/influxdb/backup

influxdb版本分析

InfluxDB 的版本线主要分为 1.x 系列2.x 系列,其中 1.x 又有不同小版本(如 1.8、1.11)

1. 1.x 系列

主要特点

  • 单独数据库、测量、点的概念
  • 使用 InfluxQL 作为主要查询语言(类似 SQL)。
  • 数据库管理简单,部署轻量。
  • 适合 传统 TSDB 用法:监控、IoT、日志。

版本区别

版本 主要变化
1.8 - 最后一版 1.x 的长期支持 (LTS)- 支持 Flux 查询语言(实验性)- 企业版可用 Clustering(集群)- 兼容 1.x 所有 API
1.9 - 提供更好的兼容 2.x 的 Flux- 减少一些已弃用功能- 企业版增加一些新特性
1.10/1.11 - 主要是性能优化和 bug 修复- Flux 功能更完整- 为平滑迁移到 2.x 做准备

总结:1.x 系列以 InfluxQL 为主,Flux 为辅,适合长期使用和稳定项目。1.8 是 LTS,1.11 则是稳定性和性能的增强版。


2. 2.x 系列

主要特点

  • 融合数据库、任务管理、告警、可视化于一体(InfluxDB UI、任务调度、Alerts)。
  • 默认使用 Flux 语言,InfluxQL 可兼容但不推荐。
  • 多租户、多组织支持:组织(Org)、桶(Bucket)替代 1.x 的 database + retention policy。
  • 安全与认证:2.x 默认启用 token-based 认证。
  • API 和数据模型变化
    • Database → Bucket
    • Retention Policy → Bucket 的保留策略
    • Measurement、Tag、Field 基本概念保留,但 API 有变化
  • 适合 现代云原生监控、大规模 IoT 和多组织场景

主要区别对比 1.x

特性 1.x 2.x
查询语言 InfluxQL 为主,Flux 可选 Flux 为主,InfluxQL 可兼容
数据库概念 Database + Measurement + RP Organization + Bucket + Measurement
UI 简单 Web UI 完整 UI + Task + Alert + Explore
认证 可选 Token-based 强制认证
集群 企业版支持 企业版支持,集群管理更现代化
开箱体验 轻量 功能丰富,但稍重

总结

  • 1.x 系列:轻量、稳定、InfluxQL 主导,适合老项目或简单部署。1.8 是长期支持版,1.11 是功能和性能优化版。
  • 2.x 系列:功能完整、现代化、多租户,Flux 主导,适合新项目和云原生场景。

nfluxQL和 Flux

1. InfluxQL

概述

  • InfluxQLInfluxDB 1.x 系列的主查询语言
  • 类似 SQL,但专门针对 时序数据(Time Series Data) 优化。
  • 支持数据查询、聚合、分组、时间范围选择。

特点

  • 类 SQL 语法,容易上手:

    1
    2
    3
    4
    SELECT mean("value") 
    FROM "temperature"
    WHERE "device"='esp32' AND time > now() - 1h
    GROUP BY time(5m)
  • 功能有限

    • 聚合函数、分组、时间条件
    • 不能方便地做复杂的数据管道和跨数据库分析
  • 只支持 InfluxDB,不能做跨数据源处理

适用场景

  • 1.x 系列项目
  • 简单时序查询、告警阈值计算、监控指标聚合

2. Flux

概述

  • Flux 是 InfluxData 推出的 通用数据脚本语言,兼容 1.x,但 2.x 系列默认使用。
  • 不仅可以查询 InfluxDB,也支持其他数据源(CSV、Prometheus、HTTP API 等)。

特点

  • 函数式语言,支持数据管道:

    1
    2
    3
    4
    5
    from(bucket:"temperature_bucket")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "temperature" and r.device == "esp32")
    |> aggregateWindow(every: 5m, fn: mean)
    |> yield(name: "mean")
  • 更强大

    • 数据清洗、转换、聚合、窗口计算
    • 可跨桶、跨组织查询
    • 支持复杂告警逻辑
  • 学习曲线稍陡:不再是 SQL 风格,而是函数式链式操作

适用场景

  • 2.x 系列项目
  • 高级数据分析、跨数据源整合、复杂告警

3. 对比总结

特性 InfluxQL Flux
语法风格 类 SQL 函数式管道
支持数据源 仅 InfluxDB InfluxDB + CSV + Prometheus + HTTP 等
功能 查询 + 聚合 + 分组 查询 + 聚合 + 转换 + 跨桶分析 + 复杂逻辑
易用性 容易上手 功能强大但学习成本高
默认版本 1.x 2.x

遇到的问题

日志文件无法挂载

access.log可以正常挂载出俩,配置文件设置好了日志输出也还是没有。不管是docker还是宿主机直接部署都没有。不太清除怎么解决,不太清楚怎么解决,发了issue。

issue : Unable to output influxd.log. · Issue #822 · influxdata/influxdata-docker

补救方式,可以输出日志到挂载的文件里。格式与配置文件有关(json或者其他)

1
2
3
4
# 进入容器
docker exec -it influxdb bash
# 执行
influxd > /var/log/influxdb/influxdb.log 2>&1 &

用户数据无法迁移

备份出来的数据确实包含meta元数据,但是恢复的时候尝试了很多方法无法都不行。只能用sql一个个插入了。

备份时用的是 -portable ,导入备份时只能-portable,而不能用-metadir。两者是不同方式备份出来的文件。

  1. 如果使用 -portable导出,导入时必没有用户数据,业务数据正常导入
  2. 不支持其他方式:普通 OSS 容器只能做 portable backup