我正在考虑使用 Prometheus 作为时间序列数据库来长期存储数据(几个月甚至一年以上)。
但是,我在一些地方读到 Prometheus 不适合长期存储,在这种情况下其他 TSDB 将是更好的解决方案。但到底为什么它不适合?使用它作为长期存储有什么缺点?
官方文档提及:
Prometheus 的本地存储并不是为了长期持久使用 贮存;外部解决方案提供更长的保留时间和数据 耐用性。
但是“延长保留和数据持久性”的确切含义是什么?为什么 Prometheus 无法实现这一点?
这是一个设计决策,主要与项目/工具的范围有关。原作者根据 SoundCloud 的用例,决定不构建分布式数据存储层,而是保持简单。
换句话说:Prometheus 会填满磁盘,但不会为您分片或复制数据。现在,如果您想要监控许多不同的环境,创建数十万个时间序列和无数的指标,则无法扩展(本地磁盘太小,基于 NFS 的解决方案现在可能也是您想要的)。因此,有不同的解决方案,允许您联合和/或删除来自不同环境的重复指标。
这里要记住的重要一点是,这不是 Prometheus 的缺点,而是一个有意识的决定,专注于一件事并真正做好它,并随着时间的推移开发 API(
remote_write
和 remote_read
),使其他人能够构建系统解决分布式/大规模用例。
Prometheus 可以存储任意长时间的数据 - 只需根据
这些文档将
--storage.tsdb.retention.time
或 --storage.tsdb.retention.size
命令行标志设置为所需的值就足够了。
Prometheus 的性能和容量可以随着可用的计算资源(RAM、CPU、磁盘 IO 和磁盘空间)垂直扩展。但它无法水平扩展,因为 Prometheus 不提供集群版本。因此,如果您的工作负载适合单个节点,那么 Prometheus 对于您的任何保留来说都是一个很好的解决方案。
如果您的工作负载不适合单个节点,那么您需要从此列表切换到与 Prometheus 兼容的长期系统之一。以下系统最受欢迎:
remote_write -> url
选项(位于Prometheus 配置文件)将抓取的指标写入远程存储。通常可以通过Prometheus兼容的查询API来查询远程存储,而不需要查询用于指标抓取的原始Prometheus。这意味着Prometheus只能用于目标的抓取,并将抓取的指标转发到配置的远程存储系统,而不需要在本地存储和查询抓取的指标。在这种情况下,使用专门的 Prometheus 兼容的抓取工具而不是 Prometheus 可能会更节省资源,因为它们通常需要更少的 RAM、CPU 和磁盘 IO: