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 run -p 8086:8086 influxdb。我个人在本地开发时经常这么干,省心。
4.2 核心概念:一张图搞懂数据模型
InfluxDB 的数据模型跟传统关系型数据库不太一样。你想想看,传统数据库是「数据库 -> 表 -> 行 -> 列」。InfluxDB 呢?它是「组织 -> 桶 -> 测量 -> 点」。别被这些名词吓到,其实很简单。
下面这张图是我自己画的,帮你快速建立整体认知:
我来逐一解释一下这四个核心概念:
4.3 Measurement(测量)—— 相当于表
Measurement 你可以理解为关系型数据库里的「表」。它描述的是你要监控或记录的「一类指标」。比如在风控系统里,我通常会建一个叫 transaction_risk_score 的 measurement,专门存每笔交易的风险评分。
但注意,InfluxDB 的 measurement 不需要预先定义 schema。你直接往里写数据就行,它自动会创建。这一点跟 MongoDB 有点像,灵活得很。
4.4 Tag(标签)—— 用来查的
Tag 是 InfluxDB 里最巧妙的设计。它本质上是「带索引的元数据」。说白了,Tag 是用来做过滤和分组的。比如 user_id、region、device_type 这些字段,你就应该设计成 Tag。
为什么?因为 Tag 会被自动建索引。你在查询时用 WHERE user_id='U12345',速度会非常快。我在项目中遇到过一个问题:有个同事把 user_id 存成了 Field,结果查询时全表扫描,慢得不行。改成 Tag 后,查询时间从 3 秒降到了 50 毫秒。
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)
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