时序数据库(Time Series Database,TSDB)是一种专门用于存储和查询时序数据的数据库系统。时序数据是按时间顺序记录的数据点序列,每个数据点包含时间戳和对应的数值。
时序数据的特点
graph TB
A[时序数据] --> B[时间序列]
A --> C[数据点]
A --> D[标签]
B --> B1[按时间顺序 连续记录]
C --> C2[时间戳 + 数值]
D --> D3[元数据标签 用于分类]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
style D fill:#ffffcc
1. 时间序列
定义:一系列按时间顺序排列的数据点
特点:时间戳是主键,数据按时间顺序写入
示例:CPU 使用率、内存使用量、请求数量
2. 数据点
组成:时间戳 + 数值
格式:(timestamp, value)
示例:(2024-01-01 12:00:00, 75.5)
3. 标签(Labels)
用途:标识和分类时序数据
特点:键值对形式
示例:{instance="server1", job="web"}
时序数据库 vs 传统数据库
graph TB
A[数据库对比] --> B[传统数据库]
A --> C[时序数据库]
B --> B1[行存储 随机写入 复杂查询]
C --> C2[列存储 顺序写入 时间范围查询]
style B fill:#ffcccc
style C fill:#ccffcc
特性
传统数据库
时序数据库
存储方式
行存储
列存储
写入模式
随机写入
顺序写入
查询模式
复杂查询
时间范围查询
压缩
一般
高效压缩
适用场景
事务处理
监控、IoT、日志
时序数据库应用场景
graph TB
A[时序数据库应用] --> B[系统监控]
A --> C[IoT设备]
A --> D[日志分析]
A --> E[金融数据]
A --> F[业务指标]
B --> B1[CPU/内存/磁盘]
C --> C2[传感器数据]
D --> D3[日志聚合]
E --> E4[股票价格]
F --> F5[用户行为]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccffcc
style D fill:#ccffcc
style E fill:#ccffcc
style F fill:#ccffcc
graph TB
A[Prometheus特性] --> B[多维数据模型]
A --> C[Pull模式]
A --> D[PromQL查询语言]
A --> E[高效存储]
A --> F[告警系统]
B --> B1[标签系统 灵活分类]
C --> C2[主动拉取 目标暴露指标]
D --> D3[强大的查询 聚合分析]
E --> E4[本地存储 高效压缩]
F --> F5[Alertmanager 告警管理]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccffcc
style D fill:#ccffcc
style E fill:#ccffcc
style F fill:#ccffcc
1. 多维数据模型
指标名称:标识指标类型
标签:键值对,用于分类和过滤
时间序列:指标名称 + 标签组合
2. Pull 模式
sequenceDiagram
participant Prometheus as Prometheus
participant Target as 目标服务
Prometheus->>Target: 定期拉取指标
Target-->>Prometheus: 返回指标数据
Prometheus->>Prometheus: 存储到时序数据库
Note over Prometheus,Target: 默认每15秒拉取一次
优势:
集中管理采集配置
目标服务无需主动推送
易于扩展和监控
3. PromQL 查询语言
强大的查询能力:支持聚合、函数、运算符
实时计算:支持实时计算和聚合
灵活过滤:基于标签的灵活过滤
4. 高效存储
本地存储:基于本地文件系统
数据压缩:高效的时序数据压缩
数据保留:可配置的数据保留策略
Prometheus 架构
graph TB
A[Prometheus架构] --> B[Prometheus Server]
A --> C[Exporters]
A --> D[Pushgateway]
A --> E[Service Discovery]
A --> F[Alertmanager]
A --> G[Grafana]
B --> B1[数据采集 存储 查询]
C --> C2[指标导出器 Node Exporter MySQL Exporter等]
D --> D3[短期任务指标 批处理任务]
E --> E4[服务发现 Kubernetes Consul等]
F --> F5[告警管理 路由 通知]
G --> G6[可视化 仪表盘]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
style D fill:#ffffcc
style E fill:#ffccff
style F fill:#ccffff
style G fill:#ffcccc
Prometheus 数据模型
指标格式
1
metric_name{label1="value1", label2="value2"} value timestamp
graph TB
A[指标类型] --> B[Counter]
A --> C[Gauge]
A --> D[Histogram]
A --> E[Summary]
B --> B1[计数器 只增不减]
C --> C2[仪表盘 可增可减]
D --> D3[直方图 分桶统计]
E --> E4[摘要 分位数统计]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
style D fill:#ffffcc
style E fill:#ffccff
graph TB
A[Grafana特性] --> B[数据源支持]
A --> C[丰富的面板]
A --> D[告警功能]
A --> E[用户权限]
A --> F[插件系统]
B --> B1[Prometheus InfluxDB MySQL等]
C --> C2[图表 表格 热力图等]
D --> D3[可视化告警 通知]
E --> E4[角色权限 组织管理]
F --> F5[扩展功能 自定义插件]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccffcc
style D fill:#ccffcc
sequenceDiagram
participant User as 用户
participant Grafana as Grafana
participant Prometheus as Prometheus
User->>Grafana: 登录 Grafana
User->>Grafana: 添加数据源
Grafana->>User: 数据源配置页面
User->>Grafana: 输入 Prometheus URL
Grafana->>Prometheus: 测试连接
Prometheus-->>Grafana: 连接成功
Grafana->>User: 数据源添加成功
配置步骤:
登录 Grafana
进入 Configuration → Data Sources
点击 Add data source
选择 Prometheus
输入 URL:http://prometheus:9090
点击 Save & Test
创建仪表盘
1. 创建新仪表盘
flowchart TD
A[创建仪表盘] --> B[添加面板]
B --> C[选择可视化类型]
C --> D[配置查询]
D --> E[设置选项]
E --> F[保存面板]
F --> G[保存仪表盘]
style A fill:#ffcccc
style G fill:#ccffcc
2. 常用面板类型
graph TB
A[面板类型] --> B[Graph]
A --> C[Stat]
A --> D[Table]
A --> E[Gauge]
A --> F[Heatmap]
A --> G[Bar Gauge]
B --> B1[时序图表 折线图]
C --> C2[统计值 数字显示]
D --> D3[表格 数据列表]
E --> E4[仪表盘 百分比]
F --> F5[热力图 分布图]
G --> G6[条形图 对比]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccffcc
style D fill:#ccffcc
graph TB
A[Grafana告警] --> B[告警规则]
A --> C[通知渠道]
A --> D[告警状态]
B --> B1[查询条件 评估条件]
C --> C2[Email Slack Webhook]
D --> D3[OK Pending Alerting]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccffcc
graph TB
A[命名规范] --> B[使用下划线]
A --> C[包含单位]
A --> D[使用复数]
A --> E[描述性名称]
B --> B1[metric_name_not_methodName]
C --> C2[bytes_seconds_total]
D --> D3[requests_total_not_request_total]
E --> E4[描述清楚用途]
style A fill:#ffcccc
style B fill:#ccffcc
建议:
使用下划线分隔:http_requests_total
包含单位:memory_usage_bytes
使用复数:requests_total
描述性名称:cpu_usage_percent
2. 标签使用
graph TB
A[标签使用] --> B[避免高基数]
A --> C[使用有意义的标签]
A --> D[保持标签稳定]
B --> B1[避免用户ID等 高基数标签]
C --> C2[instance job method status]
D --> D3[标签值稳定 不频繁变化]
style A fill:#ffcccc
style B fill:#ccffcc
建议:
避免高基数标签(如用户 ID)
使用有意义的标签(instance、job、method)
保持标签值稳定
3. 查询优化
graph TB
A[查询优化] --> B[使用 rate]
A --> C[避免高基数]
A --> D[使用 recording rules]
B --> B1[rate() 而非 increase()]
C --> C2[限制标签数量]
D --> D3[预计算常用查询]
style A fill:#ffcccc
style B fill:#ccffcc
style D fill:#ccffcc
建议:
使用 rate() 而非 increase()
避免高基数查询
使用 recording rules 预计算
4. 存储优化
graph TB
A[存储优化] --> B[数据保留策略]
A --> C[压缩配置]
A --> D[远程存储]
B --> B1[合理设置保留时间]
C --> C2[启用压缩]
D --> D3[长期数据远程存储]
style A fill:#ffcccc
style B fill:#ccffcc
style D fill:#ccffcc