跳转至

时序数据库

Prometheus 使用的是一种专门为时序数据(time-series data)设计的数据库,通常被称为 Prometheus 时序数据库(Prometheus TSDB)。该数据库是 Prometheus 的核心组成部分,用于存储和管理从各个目标抓取的指标数据。

Prometheus 数据库(TSDB)的主要特点

  1. 时序数据存储
  2. Prometheus 数据库专门优化了对时序数据的存储。这些数据通常具有时间戳,每个时间戳记录了某个指标在该时间点的值。例如,一个 CPU 使用率指标的时序数据可能会记录每秒钟 CPU 使用率的变化。
  3. 每个指标都有一个唯一的名称和一组标签(labels)。这些标签通常是键值对,描述该指标的不同维度,例如:

    • cpu_usage{host="server1", region="us-west"}
    • http_requests_total{method="GET", status="200"}
  4. 数据存储结构

  5. 时间序列:每个监控指标在 Prometheus 中是一个时间序列(series)。时间序列由多个值组成,每个值都有对应的时间戳。
  6. 标签(Labels):每个时间序列都可以带有一组标签,用于描述该指标的特定属性(例如:主机、地区、请求类型等)。标签使得 Prometheus 能够根据不同维度进行分组和过滤。
  7. 块(Blocks):Prometheus 数据库按时间段将数据分块存储,通常是按 2小时(默认)为一个存储块(Block)。每个存储块包含该时间段内的所有时序数据,且数据是按时间顺序组织的。

  8. 数据压缩和存储优化

  9. Prometheus 使用了 Time-Series Compression 算法,旨在减少存储空间的使用,同时保证查询时的高效性。Prometheus 采用了一些常见的压缩算法,如 delta encoding(增量编码)和 variable-length encoding(变长编码),从而将相同的或相似的数据高效地存储在一起,减少磁盘空间的占用。
  10. WAL(Write-Ahead Log):Prometheus 使用 WAL 机制来确保数据的可靠写入。写入数据前会先写入 WAL,然后再批量写入主数据库。这样做的目的是提高写入性能并确保数据不会丢失。

  11. 数据保留和自动清理

  12. Prometheus 默认会保留存储的数据,在磁盘上的时序数据会有一定的保留期(通常是 15 天)。超出保留期的数据会被自动删除。保留期可以在配置文件中进行调整。
  13. 数据清理是基于时间的(基于时间的滚动清理),例如,超过一定时间的数据块会被删除,以便节省存储空间。

  14. 查询和索引

  15. Prometheus 提供了一个高效的查询语言 PromQL,用于访问和分析时序数据。查询的数据通过时间戳和标签进行索引,Prometheus 会根据用户查询条件快速找到相关数据并返回结果。
  16. 为了提高查询性能,Prometheus 对数据进行了索引和优化,使得通过标签筛选和时间范围查询都能在较短的时间内完成。

  17. 多副本和高可用性

  18. 单节点模式:Prometheus 本身是设计为单节点的,但它能够通过分布式存储方案与其他组件(如 ThanosCortex)结合使用,来提供高可用性和跨数据中心的高可扩展性。
  19. 查询数据复制:虽然 Prometheus 不是为分布式存储设计的,但它可以与其他系统结合,进行分布式数据存储。例如,使用 Thanos 或 Cortex 可以在 Prometheus 中实现数据的跨集群复制和持久化存储。

重要的存储和性能考量

  1. 磁盘性能:Prometheus 的数据库是高度依赖磁盘性能的,特别是在存储大规模时序数据时。使用较快的磁盘(如 SSD)可以显著提高 Prometheus 的性能,尤其是在高频抓取和查询的情况下。

  2. 存储空间管理:Prometheus 数据库设计上不具备横向扩展的能力,因此,如果单节点的存储和计算资源不足以支持系统的需求,可以使用外部的存储系统(如 Thanos 或 Cortex)来进行数据的扩展和持久化。

  3. 高效查询:为了确保高效的查询,Prometheus 通过标签索引来提高对时间序列数据的检索速度。然而,随着时间序列数据量的增大,查询的延迟也会增加,尤其是在没有优化存储和查询配置时。

总结

Prometheus 使用的数据库(Prometheus TSDB)是专为时序数据存储和查询优化的。它通过使用高效的数据压缩、增量编码、存储分块等技术,能够高效地处理大量的监控数据。虽然 Prometheus 默认是单节点存储,但通过扩展方案(如 Thanos 或 Cortex),可以实现跨集群的存储和查询。