前言
软件运行是带错运行的一个过程,没有人能肯定的说自己的程序永远不会出现问题。那么既然是这样,我们怎么判断我们的系统出现了问题呢?肯定不能让甲方爸爸告知你的系统访问不了了(这样的话这个绩效你背定了,耶稣的留不住你,产品经理说的)。那我们又不可能随时随刻的在电脑面前看有没有问题发生,那么怎么办?我们可以请几个人来轮班看着这个程序,如果有问题了马上解决(其实就是运维老哥)。但是这样不是办法,我们能不能让电脑帮助我们来监控程序呢,一有问题就告诉我们,然后我们第一时间马上解决。这就落到了我们的重点了——监控技术。要想我们的系统能够长久平稳的运行,监控和运维是必不可少的一部分。
技术简介
consul
Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性:
- 服务发现 Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.
- 健康检查 Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信息可由operator用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机.
- Key/Value存储 应用程序可用根据自己的需要使用Consul的层级的Key/Value存储.比如动态配置,功能标记,协调,领袖选举等等,简单的HTTP API让他更易于使用.
- 多数据中心: Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域.
Consul面向DevOps和应用开发者友好.是他适合现代的弹性的基础设施。在这里我们主要是使用它的服务发现和健康检查的功能。
prometheus
Prometheus 是由 SoundCloud 开源监控告警解决方案。
从这个架构图,也可以看出 Prometheus 的主要模块包含, Server, Exporters, Pushgateway, PromQL, Alertmanager, WebUI 等。
它大致使用逻辑是这样:
- Prometheus server 定期从静态配置的 targets 或者服务发现的 targets 拉取数据。
- 当新拉取的数据大于配置内存缓存区的时候,Prometheus 会将数据持久化到磁盘(如果使用 remote storage 将持久化到云端)。
- Prometheus 可以配置 rules,然后定时查询数据,当条件触发的时候,会将 alert 推送到配置的 Alertmanager。
- Alertmanager 收到警告的时候,可以根据配置,聚合,去重,降噪,最后发送警告。
- 可以使用 API, Prometheus Console 或者 Grafana 查询和聚合数据。
从上图可以看出,prometheus主要是用来将exporters采集过来的数据(上报的数据)进行查询
grafana
grafana是用于可视化大型测量数据的开源程序,他提供了强大和优雅的方式去创建、共享、浏览数据。dashboard中显示了你不同metric数据源中的数据。拥有丰富dashboard和图表编辑的指标分析平台,和Kibana不同的是Grafana专注于时序类图表分析,而且支持多种数据源,如Graphite、InfluxDB、Elasticsearch、Mysql、K8s、Zabbix等。
从本质上来说,grafana是一个数据可视化的平台。
相互关系
这里我们首先来讲一下prometheus主要是怎么工作的。我们可以理解prometheus targets
是一个探子(需要在prometheus.yml中去配置),是去各个服务里面去收集一些我们需要的数据,并上报给prometheus server
进行处理。在prometheus server
里面我们可以使用专门的promQL对我们需要的信息进行查询并展示。其中prometheus alertmanager
是配置我们的告警规则,告诉prometheus什么时候通知你这个系统出问题了,你需要来看一眼。
了解了prometheus是怎么工作的之后,我们再来了解一下consul和grafana的作用什么?
- grafana作用:使用一个prometheus已经可以做到数据采集,数据可视化以及报警的需求了,那么怎么会多出一个grafana来插一脚呢?prometheus做可视化的部分还是比较单一的,grafana提供了多种不同的数据可视化界面,是专门用于可视化操作的框架。那么专业的事情就交给专业人来做,这样的话事半功倍。并且grafana还支持监控模版的导入(通过添加官网提供的id即可快速添加监控模版,炫酷又实用)
- consul作用:这样以来,既然我们的
peometheus targets
已经可以做到探测数据了,那么我们还要这个consul来干什么?我们不妨换一个角度想问题,我可能需要有多个系统进行监控,我们完全可以搭建一个prometheus服务端,然后配置一下prometheus targets
就可以了。但是问题就出在这个配置这里面,配置需要我们在peometheus.yml
里面进行修改,配置完成之后需要进行重启。有句话说得好,程序员都是懒惰的,能不做就不做。而且手工配置的话,不仅存在人工出错的风险(你配置了一个不可用的地址上去,但是你没发现,发现不行了再重试),而且如果我需要加一个系统进行监控的话,我们还要重新编写配置文件,再重启。这时候,consul就站出来了,他是一个服务发现的一个组件,并且可以对注册的服务进行健康检测,并且所有的注册于解注册都是通过consul对外暴露的api完成。如此一来,我们可以通过在prometheus服务上面配置consul,在consul上注册服务来让prometheus到对应的服务上面拉取对应的监控数据。
那么完成以上的理解之后,我们得出了下面一张图:
- 首先server是我们的系统,里面包含了prometheus-cli 用于获取监控的数据进行上报,还有一个consul-cli用于将/metrics接口注册。
- 然后prometheus可以从consul里面获取到
prometheus targets
地址,然后从/metrics拉取监控上报的数据。并将这个数据给到grafana进行可视化展示,同时grafana可以配置多个数据面板,进行多维度的监控,同时可以配置告警规则和告警方式
实践
- 首先,我们搭建consul组件,用于服务注册与服务发现。
$ docker run --name consul -d -p 8500:8500 consul
此时我们访问http://localhost:8500
即可访问如下页面
- 启动prometheus监控平台
首先我们要准备一个prometheus.yml 配置文件,里面配置了consul的相关信息
# prometheus.yml
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
evaluation_interval: 15s # Evaluate rules every 15 seconds.
# Attach these extra labels to all timeseries collected by this Prometheus instance.
external_labels:
monitor: 'codelab-monitor'
rule_files:
- 'prometheus.rules.yml'
scrape_configs:
- job_name: 'prometheus'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'consul-prometheus'
consul_sd_configs:
- server: 'xx.xx.xxx.xxx:8500' # 这里需要写我们consul的ip地址,由于是dockr启动,127和localhost都无法访问外部,请通过ip a查看局域网IP地址或者公网地址,进行填写
services: []
启动prometheus,将配置文件通过数据卷的形式进行挂载
$ docker run -d \
-p 9090:9090 \
-v ~/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
通过访问浏览器http://localhost:9090
可以看到如下页面:
- 启动一个服务模拟我们的请求,这里我们使用官网提供的
./node_exporter --web.listen-address xx.xxx.xxx.xxx:8080 # 这里要填局域网ip或者公网ip,不然健康检测不到
./node_exporter --web.listen-address 127.0.0.1:8081 # 这个在consul健康检测是失败的
- 向consul注册服务
curl -X PUT -d '{"id": "node-exporter8080","name": "node-exporter8080","address": "xx.xxx.xxx.xxx","port": 8080,"tags": ["test"],"checks": [{"http": "http://xx.xxx.xxx.xxx:8080", "interval": "5s"}]}' http://localhost:8500/v1/agent/service/register
curl -X PUT -d '{"id": "node-exporter8081","name": "node-exporter8081","address": "127.0.0.1","port": 8081,"tags": ["test"],"checks": [{"http": "http://127.0.0.1:8081", "interval": "5s"}]}' http://localhost:8500/v1/agent/service/register
在页面上就可以看到两个新注册的服务,其中8080是可用的,8081是不可用的:
- 我们可以在prometheus平台上通过promql进行监控数据的查询
- 如果觉得页面太low,我们可以启动grafana来帮助我们建立可视化界面,username/pwd:admin/admin
docker run -d -p 3000:3000 grafana/grafanadock
添加prometheus数据源
添加面板,通过特定的promsql查询数据,可以设置展示的类型,时间间隔(这里不多展示)
- 告警设置
我们需要修改grafana的 conf/default.ini 文件新增如下配置,然后重启:(配置的是告警发出的邮箱)
[smtp]
enabled = true
host = smtp.exmail.qq.com:465
user = xxx@163.com
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = xxxx
cert_file =
key_file =
skip_verify = false
from_address = xxx@163.com //必须与上面的 user 属性一致
from_name = Grafana
ehlo_identity =
然后在页面上添加告警渠道
然后在alert添加告警规则即可,这里配置的是5分钟内平均值高于90就会通过邮箱进行告警信息的发送
总结
至此,一套监控平台算是搭建完毕了,本文粗略的讲了一下consul prometheus grafana的简单使用和相互的配合关系,更多的细节需要我们自己去摸索。一套好的监控告警平台对于我们系统的平稳运行时非常有必要的。能够帮助我们在出现问题的第一时间及时通知到我们解决问题,对于系统瓶颈的排查也很有帮助。