生产环节的Prometheus节点每隔一段时间就会出现内存不足情况,并且频繁崩溃,重新加载的时间非常长请问如何解决?

提问者:帅平 问题分类:运维
公司基于自建方式搭建基础架构,目前由单个Prometheus节点负责包括主机 、操作系统、数据库、Kubernetes集群等资源的监控。当前,该Prometheus节点每隔一段时间就会出现内存不足情况,并且频繁崩溃,重新加载的时间非常长。

虽然目前已对机器资源进行了扩容,将内存增加了一倍,但问题依然会时不时出现。请问是什么原因如何解决?
2 个回答
吹南风
吹南风
Prometheus原生的TSDB数据库虽然使用方便,但该数据库本身并不适用于大数据量的存储与查询。在大规模的监控环境中,该数据库也很容易成为一个故障点。
发布于:1个月前 (08-19) IP属地:四川省
帅平
帅平 提问者
Prometheus系统采集的样本数据会按照两个小时为一个时间窗口,将期间产生的数据存储在一个块(Block)中。而对于当前时间窗口内正在收集的样本数据,则会被Prometheus保存在内存中。同时 ,为了确保系统在出现意外崩溃后数据依然能够恢复,Prometheus会通过预写日志(WAL)的方式进行临时保存,在重新启动后会从WAL目录进行加载,从而恢复数据。
通过对存储机制的了解,我们知道Prometheus节点的内存至少要达到2小时的数据存储量,并且还不包括操作系统和程序本身的内存使用。当使用单个实例获取大量的目标数据时,就容易出现占用大量内存的情况,导致程序出现问题。
所以当前出现问题主要是由于数据量过大,导致内存和TSDB数据库负载过高导致的。因此,解决方案主要针对这两块的问题进行处理。
最简单的方法,就是减少指标的样本数量和样本保留时间(retention_time_seconds)。对于样本保留时间,可以在系统启动时通过--storage.tsdb.retention 参数进行修改,例如配置为7天。当然,这并不算是一个好方案,因为大多数企业都希望尽可能完整的保留监控数据,并且需要存储较长的时间便于历史查询。
那么,更好的方案则是Prometheus的联邦集群模式。联邦集群通过将任务分配到不同的实例上面,实现每个实例的负载降低。在任务划分上,可以按功能类型或HASH值的方式划分监控目标,并最终由主节点进行汇总。
而对于监控数据的存储,Promethesu提供Remote Write/Remote Read方式来支持远程存储。我们可以数据保存在第三方存储数据库上,这样可以解决TSDB数据库对于大数据处理弱的问题。
发布于:1个月前 (08-19) IP属地:四川省
我来回答