4. InfluxDB快速入门:安装、核心概念与基础操作

好,咱们进入实战环节了。前面聊了那么多时序数据库的理论,现在该上手摸一摸真家伙了。InfluxDB 是我个人在风控系统里用得最多的时序库,没有之一。为什么?因为它对 DevOps 和监控场景的支持太友好了,而且查询语法(Flux 和 InfluxQL)上手极快。

这一章,我会带你从零开始装一个 InfluxDB,然后搞懂它的几个核心概念——说白了就是它的数据模型长什么样。最后,咱们写几行代码,把数据写进去、查出来。嗯,都是基本功,但非常重要。

4.1 安装 InfluxDB:别怕,就三步

我习惯在 Linux 上跑 InfluxDB,尤其是 CentOS 7 或 Ubuntu 20.04 以上版本。当然,Windows 和 macOS 也能装,但生产环境我强烈建议用 Linux。

这里以 Ubuntu 20.04 为例,咱们用官方仓库安装,干净利落。

# 第一步:添加 InfluxData 的仓库源
wget -q https://repos.influxdata.com/influxdb.key
sudo apt-key add influxdb.key
echo "deb https://repos.influxdata.com/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

# 第二步:更新并安装
sudo apt-get update
sudo apt-get install influxdb

# 第三步:启动服务并设置开机自启
sudo systemctl start influxdb
sudo systemctl enable influxdb

# 检查一下状态
sudo systemctl status influxdb

看到 active (running) 就说明装好了。默认端口是 8086,HTTP API 就监听在这个端口上。

小提示: 如果你只是想快速体验,也可以用 Docker 一键启动:docker run -p 8086:8086 influxdb。我个人在本地开发时经常这么干,省心。

4.2 核心概念:一张图搞懂数据模型

InfluxDB 的数据模型跟传统关系型数据库不太一样。你想想看,传统数据库是「数据库 -> 表 -> 行 -> 列」。InfluxDB 呢?它是「组织 -> 桶 -> 测量 -> 点」。别被这些名词吓到,其实很简单。

下面这张图是我自己画的,帮你快速建立整体认知:

InfluxDB 数据模型核心结构 Organization(组织) 例如:my_company Bucket(桶) 例如:risk_metrics(保留策略:7天) Measurement(测量) 例如:transaction_risk_score Point(数据点) Tag(标签) user_id="U12345" region="cn-east" Field(字段) risk_score=0.87 amount=1500.00 Timestamp(时间戳) 2025-01-15T10:30:00Z (纳秒精度)

我来逐一解释一下这四个核心概念:

4.3 Measurement(测量)—— 相当于表

Measurement 你可以理解为关系型数据库里的「表」。它描述的是你要监控或记录的「一类指标」。比如在风控系统里,我通常会建一个叫 transaction_risk_score 的 measurement,专门存每笔交易的风险评分。

但注意,InfluxDB 的 measurement 不需要预先定义 schema。你直接往里写数据就行,它自动会创建。这一点跟 MongoDB 有点像,灵活得很。

4.4 Tag(标签)—— 用来查的

Tag 是 InfluxDB 里最巧妙的设计。它本质上是「带索引的元数据」。说白了,Tag 是用来做过滤和分组的。比如 user_idregiondevice_type 这些字段,你就应该设计成 Tag。

为什么?因为 Tag 会被自动建索引。你在查询时用 WHERE user_id='U12345',速度会非常快。我在项目中遇到过一个问题:有个同事把 user_id 存成了 Field,结果查询时全表扫描,慢得不行。改成 Tag 后,查询时间从 3 秒降到了 50 毫秒。

避坑指南: Tag 的值不要太多。如果某个 Tag 的基数(不同值的数量)超过 100 万,InfluxDB 的性能会急剧下降。我曾经在一个 IoT 项目里把设备 ID 直接当 Tag,结果设备数量到了 200 万,写入直接卡死。后来改成了哈希分桶才解决。

4.5 Field(字段)—— 用来算的

Field 就是你要存储的实际数值。比如风险评分 risk_score=0.87、交易金额 amount=1500.00。Field 不会被自动索引,所以不适合做 WHERE 过滤条件。但它是你聚合计算(比如求平均值、最大值)的目标。

嗯,这里要注意:一个 Point 里至少得有一个 Field。只有 Tag 没有 Field 的数据点是没意义的。

4.6 Timestamp(时间戳)—— 灵魂所在

时序数据库嘛,时间戳就是灵魂。InfluxDB 默认使用纳秒精度的时间戳。如果你不指定,它会用服务器当前时间。但我建议你尽量自己传时间戳,尤其是在回填历史数据时。

时间戳的格式可以是:

  • Unix 纳秒时间戳:1736932200000000000
  • RFC3339 格式:2025-01-15T10:30:00Z

4.7 基础读写操作:动手试试

概念讲完了,咱们来写点代码。InfluxDB 提供了 HTTP API,你可以用 curl 直接操作。当然,更推荐用客户端库,比如 Python 的 influxdb-client

4.7.1 写入数据

写入数据用的是 Line Protocol 格式。说白了就是一行字符串,结构是:

measurement,tag_key=tag_value field_key=field_value timestamp

举个例子:

transaction_risk_score,user_id=U12345,region=cn-east risk_score=0.87,amount=1500.00 1736932200000000000

用 Python 写入:

from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS

# 连接 InfluxDB
client = InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org")
write_api = client.write_api(write_options=SYNCHRONOUS)

# 构造数据点
point = Point("transaction_risk_score") \
    .tag("user_id", "U12345") \
    .tag("region", "cn-east") \
    .field("risk_score", 0.87) \
    .field("amount", 1500.00) \
    .time("2025-01-15T10:30:00Z")

# 写入到指定的 bucket
write_api.write(bucket="risk_metrics", record=point)
个人习惯: 我一般会把 Tag 放在前面,Field 放在后面,时间戳放在最后。这样写出来的 Line Protocol 可读性更好。另外,批量写入时建议用列表,一次写几百条,性能远高于逐条写入。

4.7.2 查询数据

InfluxDB 2.x 推荐使用 Flux 查询语言。不过别怕,Flux 的语法很直观。咱们查一下刚才写入的数据:

from(bucket: "risk_metrics")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "transaction_risk_score")
  |> filter(fn: (r) => r.user_id == "U12345")
  |> yield(name: "results")

用 Python 执行查询:

query_api = client.query_api()

query = '''
from(bucket: "risk_metrics")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "transaction_risk_score")
  |> filter(fn: (r) => r.user_id == "U12345")
'''

tables = query_api.query(query, org="my-org")
for table in tables:
    for record in table.records:
        print(f"时间: {record.get_time()}, 风险评分: {record.get_value()}")

输出应该是:

时间: 2025-01-15T10:30:00Z, 风险评分: 0.87

4.8 实战中的小技巧

最后分享几个我在风控项目里积累的经验:

  • Tag 设计要克制: 只把你会频繁用来过滤的字段设为 Tag。比如用户 ID、商户 ID、渠道类型。像「用户姓名」这种几乎不会用来过滤的,就别放 Tag 了。
  • 时间精度要统一: 整个系统里最好统一用毫秒或纳秒。混用会导致查询结果对不上。我吃过这个亏,排查了半天才发现是时间精度不一致。
  • 批量写入是王道: 风控系统里数据量通常很大,逐条写入性能太差。建议攒够 5000 条或 1 秒后再批量写入。
  • 保留策略要提前规划: 风控数据一般只需要保留 7-30 天。InfluxDB 的 Bucket 自带数据过期机制,记得设置好。

好了,InfluxDB 的入门就到这里。你只要把 Measurement、Tag、Field、Timestamp 这四个概念吃透,后面学什么都很顺。下一节咱们会深入聊聊 InfluxDB 的查询优化,特别是风控场景下常见的聚合查询怎么写才快。


公众号:蓝海数据掘金营,微信deep3321