Prometheus(由go语言开发)是一套开源的监控&报警&时间序列(按照时间排序)数据库的组合。适合监控docker 容器。因为kubernetes(俗称k8s)的流行带动了prometheus的发展。它可以监控主机,服务,容器
https://prometheus.io/docs/introduction/overview/
时间序列数据(TimeSeries Data) : 按照时间顺序记录系统、设备状态变化的数据被称为时序数据。这种时序数据,会应用到很多场景, 如:
- 最常见的就是我们系统中的日志
- 无人驾驶车辆运行中要记录的经度,纬度,速度,方向,旁边物体的距离等等。每时每刻都要将数据记录下来做分析。
- 某一个地区的各车辆的行驶轨迹数据、车流量
- 传统证券行业实时交易数据
- 实时运维监控数据,网卡流量图,服务的当前状态,资源的使用情况,比如说,你所监控的内容出现了直线飙升、断崖式下跌、断线,一般都意味着出现了问题,不管是什么时候发生的,都要赶紧查一下出了什么问题
时间序列数据库的主要优点:
时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。
- 性能好
关系型数据库对于大规模数据的处理性能糟糕,这一点可以从I/O上有明显的体现。使用NOSQL可以比较好的处理大规模数据,但是依然比不上时间序列数据库。
-
存储成本低
由于采用的是metrics:key=value(标签:关键字=值)的数据存储方式,又使用了高效的压缩算法,平均消耗的存储成本在3.5个字节左右 ,所以比较节省存储空间 ,并且能有效降低IO
Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列数据,每隔30秒采集一次,保留60天,大概占用200多G的空间(来自官方文件数据)
Prometheus的主要特征
-
多维度数据模型,可以通过多个维度对数据建模,也可以通过多个维度对数据进行查询
-
灵活的查询语言,由于采用的是新兴的go语言进行开发,在灵活性和速度上都有明显的优势,有兴趣的同学可以去了解一下这门语言
-
不依赖分布式存储,单个服务器节点是自主的
-
以HTTP方式,通过pull模型拉取时间序列数据
-
也可以通过中间网关支持push模型
这种推,拉监控其实就是我们之前说的主动和被动监控,默认情况下是以pull(拉)的方式,也就是监控主机去找被监控主机将数据要过来,如果要实现push(推)的方式需要中间网关的支持,这只是与zabbix的叫法不同而已
-
通过服务发现或者静态配置来发现目标服务对象
-
支持多种多样的图表和界面展示,可以使用第三方的工具来展示内容,如grafana
监控原理
- Prometheus Server负责定时在目标上抓取metrics(指标)数据,
- 每个抓取目标[主机、服务]都需要暴露一个HTTP服务接口用于Prometheus定时抓取。也就是说prometheus会将获取到的监控数据打包成一个可访问的web页面,通过访问指定的url来确定主机的状态
Pull方式的优势是能够自动进行上游监控和水平监控,配置更少,更容易扩展,更灵活,更容易实现高可用。简单来说就是Pull方式可以降低耦合。由于在推送系统中很容易出现因为向监控系统推送数据失败而导致被监控系统瘫痪的问题。因为如果同一时间有很多被监控主机都把数据推送给监控主机的话,就很可能导致监控主机处理不过来,所以通过Pull方式,被采集端无需感知监控系统的存在,完全独立于监控系统之外,这样数据的采集完全由监控系统控制。