掌握你的心跳:使用 InfluxDB 和 Grafana 架构高频健康监测系统

发布: (2026年4月24日 GMT+8 08:23)
5 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的正文内容,我将为您翻译成简体中文并保留原有的 Markdown 格式、代码块和链接。

介绍

高频健康监测会从心率、血氧(SpO₂)和心电图(ECG)等传感器每分钟产生数千个数据点。将这些数据存储在传统关系型数据库中很快就会变得不切实际。像 InfluxDB 这样的时间序列数据库(TSDB)提供了此类工作负载所需的写入吞吐量和存储效率。

架构概览

The data flow consists of:

graph TD
    A[Wearable Sensors / IoT Node] -->|MQTT/HTTP| B(Telegraf Collector)
    B -->|Line Protocol| C{InfluxDB 2.x}
    C -->|Flux Query| D[Grafana Dashboard]
    C -->|Retention Policy| E[Downsampled Long‑term Storage]

    subgraph "Data Engineering Layer"
    B
    C
    E
    end

    style C fill:#f96,stroke:#333,stroke-width:2px
  • 可穿戴传感器 / IoT 节点 – 通过 MQTT 或 HTTP 发送数据。
  • Telegraf – 通用数据采集器,接收数据并使用行协议将其写入 InfluxDB。
  • InfluxDB 2.x – 存储原始测量数据,并运行后台任务进行降采样。
  • Grafana – 使用 Flux 查询可视化数据。

前提条件

  • Docker 与 Docker Compose
  • 对 IoT 协议(MQTT/HTTP)的基本了解
  • InfluxDB 2.x、Telegraf、Grafana

Docker Compose 设置

创建一个 docker-compose.yml 文件来编排这些服务:

version: '3.8'
services:
  influxdb:
    image: influxdb:2.7
    ports:
      - "8086:8086"
    volumes:
      - influxdb-data:/var/lib/influxdb2
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=password123
      - DOCKER_INFLUXDB_INIT_ORG=my-health
      - DOCKER_INFLUXDB_INIT_BUCKET=raw_vitals

  telegraf:
    image: telegraf:latest
    volumes:
      - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
    depends_on:
      - influxdb

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    depends_on:
      - influxdb

volumes:
  influxdb-data:

运行 docker compose up -d 将启动一个可复现的、隔离的环境。

InfluxDB 架构设计

对于健康体征数据,将数据组织为 tags(元数据)和 fields(测量值)。

Measurement: vitals
Tags:        patient_id="user_01", device_type="watch_v2"
Fields:      bpm (float), spo2 (float), ecg_mv (float)

Tags 被索引并支持高效查询;fields 存储实际的数值。

Telegraf 配置

将以下内容保存为 telegraf.conf(TOML 格式)。它会配置一个 HTTP 监听器以接收 JSON 负载,并将其转发到 InfluxDB。

[[inputs.http_listener_v2]]
  service_address = ":8080"
  path = "/telegraf"
  methods = ["POST"]
  data_format = "json"
  tag_keys = ["patient_id", "device_type"]

[[outputs.influxdb_v2]]
  urls = ["http://influxdb:8086"]
  token = "${INFLUX_TOKEN}"
  organization = "my-health"
  bucket = "raw_vitals"

使用 InfluxDB 任务进行下采样

多年存储每个 ECG 样本成本很高。将原始数据保留 24 小时,降采样数据用于长期分析。以下 Flux 任务会创建 1 分钟平均值并写入单独的 bucket。

option task = {name: "Downsample_Vitals", every: 1m}

from(bucket: "raw_vitals")
  |> range(start: -task.every)
  |> filter(fn: (r) => r._measurement == "vitals")
  |> mean()
  |> set(key: "_measurement", value: "vitals_1m_avg")
  |> to(bucket: "long_term_vitals")

Grafana 设置

  1. 将 InfluxDB 添加为数据源(选择 Flux 作为查询语言)。
  2. 创建一个仪表盘面板,使用以下 Flux 查询来可视化心率(bpm):
from(bucket: "raw_vitals")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "vitals")
  |> filter(fn: (r) => r["_field"] == "bpm")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "mean")

警报

在 Grafana(或通过 InfluxDB Tasks)中设置警报规则,当心率超过阈值,例如 bpm > 150 持续超过 5 分钟时触发。警报可以将通知发送到 Slack、Discord 或其他渠道。

结论

通过将 InfluxDB、Telegraf 和 Grafana 结合使用,原始传感器信号被转化为可操作的健康洞察。该技术栈提供高写入吞吐量、高效存储和灵活可视化——非常适合个人或研究级别的健康监测。

接下来怎么办?

  • 添加 AI 层(例如 Python)实时检测心律失常。
  • 探索多租户架构和静态加密,以实现符合 HIPAA 的部署。
0 浏览
Back to Blog

相关文章

阅读更多 »

这周你的胜利是什么?

封面图片:What was your win this week!? https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-...