Prometheus基于Consul的 Redis 多实例监控方案

开发 前端
使用 Prometheus​ 进行 Redis​ 监控的都知道,Redis_exporter​ 是较常用的解决方案,但是在 redis_exporter​ 开始的版本中,并不支持一个 redis_exporter​ 实例监控多 Redis​ 实例,这样造成 exporter​ 实例的数量较多,难以维护和管理。

Redis exporter

使用 Prometheus​ 进行 Redis​ 监控的都知道,Redis_exporter​ 是较常用的解决方案,但是在 redis_exporter​ 开始的版本中,并不支持一个 redis_exporter​ 实例监控多 Redis​ 实例,这样造成 exporter​ 实例的数量较多,难以维护和管理。但是好在官方已经解决了此问题。在 metrics 的暴漏形式上也有所改变:

# old
http://redis_exporter:9121/metrics
# now
http://redis_exporter:9121/scrape?target=redis://redis:6379

这种改变一定程度缓解了 redis​ 相同认证方式上 redis_exporter实例过多,维护难得问题。

prometheus配置回顾

prometheus 有静态配置和动态配置。

静态配置

静态配置就是直接把要监控的目标写死到 prometheus​ 的配置文件中,这样维护起来比较难,需要频繁的修改配置文件 prometheus.yml​. 同时还需进行 reload 操作才能生效。

scrape_configs: 
- job_name: node
static_configs:
- targets:
- 10.40.58.153:9100
- 10.40.61.116:9100
- 10.40.58.154:9100

配置完成后需要 reload 后,才能生效。

curl -XPUT http://prometheus:9090/-/reload

基于文件发现

- job_name: 'RabbitMQ-server'
file_sd_configs:
- files:
- rabbitmq.json

与此相反,prometheus​ 也可基于文件形式 rabbitmq.json​(与 prometheus​ 在同一级目录下) 的动态发现,虽然不需要再频繁修改的 prometheus​ 配置文件后进行 reload 操作,但是维护文件对运维确实也是苦难的,可自动化程度低且复杂。

基于consul/etcd

prometheus​ 是可以基于 consul/etcd​ 实现动态发现的,这也是今天说的重点,对于基于 consul 实现的监控目标自动发现好处多多:

  • 避免频繁操作机器配置文件来增加和修改配置项,减轻运维人员负担避免成为配置达人。
  • 利用 consul 等 自带的 API 可以结合现有的平台实现自动化接入。
  • 无需reload。

其他过多的就不在扩展了,直接进入正题,通过 Redis_exporter​ 的动态发现实现多实例监控来熟悉一下 consul​ 在 prometheus 动态发现中有多重要。

前期准备

因为这里主要记录 prometheus​ 基于 consul​ 实现的 redis_exporter​ 进行多实例监控的案例,consul​ 和 prometheus 部署的问题就不在细说。

测试环境服务器IP:192.168.0.100。

consul部署

1.consul配置文件consul.hcl。

client_addr = "0.0.0.0"
ui_config{
enabled = true
}
server = true
bootstrap = true
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
}

2.Consul docker-compose.yaml。

version: '3'
services:
consul-server1:
image: hashicorp/consul:1.13
container_name: consul-server
restart: always
ports:
- "8500:8500"
- "8600:8600/tcp"
- "8600:8600/udp"
command: "agent -server -config-file /consul/consul.hcl"
volumes:
- ./consul.hcl:/consul/consul.hcl:ro

启动 consul​ 服务,并且获取 consul​ 的 token​,后期 prometheus 的配置中需要用到。

docker-compose up -d
docker exec -it consul-server bash
consul acl bootstrap

redis_exporter

redis_exporter 多实例密码问题[1]。

# 运行一个redis_exporter,用于获取 没有启用认证的实例的指标
docker run -d --name redis_exporter -p 19121:9121 oliver006/redis_exporter
# 运行一个redis_exporter,用于获取 启用认证且密码是SUPER_SECRET_PASSWORD的实例的指标
docker run -d --name redis_exporter_auth -p 29121:9121 oliver006/redis_exporter -redis.password SUPER_SECRET_PASSWORD
# 运行一个 启用认证且密码是SUPER_SECRET_PASSWORD的redis实例
docker run --name redis -d -p 46379:6379 redis redis-server --requirepass "SUPER_SECRET_PASSWORD"

在redis_exporter issues中也有人做了针对不同密码不同redis实例采集的Docker镜像, 但这种方案无论在prometheus展示中还是在consul中都会明文暴漏redis实例密码,有需要的可以自己查看[2]。

prometheus

1.prometheus docker-compose.yaml。

version: '3'
services:
prometheus:
image: prom/prometheus:v2.12.0
container_name: prometheus
volumes:
- /apps/prometheus/conf/:/etc/prometheus/
restart: always
ports:
- "9090:9090"
command: ['--web.external-url=http://192.168.0.100:9090','--config.file=/etc/prometheus/prometheus.yml','--storage.tsdb.path=/prometheus/data','--web.enable-lifecycle','--web.enable-admin-api','--web.console.templates=/prometheus/consoletest','--web.page-title=prometheus-consul-redis实践展示'

2.注册redis​ 到consul 中。

curl --location --request PUT 'http://consul:8500/v1/agent/service/register' \
--header 'X-CONSUL-TOKEN: 17ee5423-b5ce-xxxx-338e-xxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"id": "redis-192.168.0.100:46379",
"name": "redis",
"address": "192.168.0.100",
"port": 46379,
"tags": [
"192.168.0.100:29121",
"redis",
"test"
],
"checks": [
{
"http": "http://192.168.0.100:29121",
"interval": "5s"
}
]
}'

图片

consul页面

这样截图对比一下是否清晰的知道 JSON​ 中每个字段的含义了?对于同一分类的 redis​ 实例可以放在同一个 service​ 的 name​ 下,也就是通过 service​ 的 name 进行分组。

3.服务注册到consul​ 以后,就需要修改prometheus 的配置了。

- job_name: consul_redis
scrape_interval: 15s
scrape_timeout: 5s
consul_sd_configs:
- server: '192.168.0.100:8500' # 修改你consul服务所在的ip地址
token: '17ee5423-b5ce-xxxx-338e-xxxxxxxxxxx' # 修改你从consul中获取到的token
refresh_interval: 30s
services: ["redis"] # 这里是匹配注册到consul中的服务名称
tags: ['test','redis'] # 这是匹配注册到consul中的tags, 要对应一致,不然查找到对象
metrics_path: /scrape # redis_exporter 监控多实例时要把/metrics自定义为/scrape
relabel_configs: # 以下是修正标签值以及grafana的自定义模板进行的自定义标签【注意:】一定要按需修改,切勿照搬
- source_labels: ['__meta_consul_service']
regex: "consul"
action: drop
- source_labels: ['__address__']
target_label: __param_target
- source_labels: ['__param_target']
target_label: realip # 自定义realip标签,值为注册进去的address:port,用于grafana dashboard
- source_labels: ['__meta_consul_tags']
separator: ','
regex: ",(.*),redis,test," # 此处要注意逗号格式,按照tags的顺序匹配,(.*)获取到的是redis_exporter的实例地址
replacement: $1
target_label: exporter
- source_labels: ['__meta_consul_tags']
separator: ','
regex: ",(.*),redis,test,"
replacement: $1
target_label: __address__ # 此处是修正endpoint的值为redis_exporter的实例地址
- source_labels: ['__param_target']
regex: "(.*):(.*)"
replacement: $2
target_label: port # 自定义标签port,用于grafana dashboard

如果有同学借鉴以上配置,把自定义标签 realip/port 两个去掉即可,其它不动即可使用。

4.修改完成后,我们做针对consul_redis​ 这个 job 的最后一次reload prometheus服务。

curl -XPUT http://prometheus:9090/-/reload

5.然后访问prometheus 的页面,查看是否有监控项被发现。

图片

prometheus target页面

这里就是最后的发现结果。

6.通过curl 查看监控指标的值

图片

通过curl查看exporter结果

7.查看grafana 数据展示。

在 Dashboard​ 中配置之前定义好的realip变量,最终的展示大盘。

图片

图片

资料参考

[1]redis_exporter 多实例密码问题讨论:https://github.com/oliver006/redis_exporter/issues/278

[2]redis_exporter multi-auth docker:https://hub.docker.com/r/linuxhub/redis_exporter

责任编辑:武晓燕 来源: 云原生生态圈
相关推荐

2022-12-13 08:01:06

监控黑盒集成

2021-07-07 05:46:46

运维监控Prometheus

2020-05-18 12:04:17

PrometheusMySQL监控

2020-12-30 08:09:46

运维Prometheus 监控

2018-08-30 15:48:43

ConsulSpring Clou开源

2023-11-06 01:39:02

Go语言开发

2022-10-17 12:12:07

2022-03-01 16:26:09

链路监控日志监控分布式系统

2020-12-30 05:34:25

监控PrometheusGrafana

2023-02-28 22:52:47

2017-05-19 09:03:17

MySQL安装方案

2020-12-02 10:38:13

Prometheus微服务架构

2022-11-08 00:00:00

监控系统Prometheus

2010-10-21 21:35:35

联网监控多域视频H3C

2017-04-13 10:51:09

Consul分布式

2022-05-18 08:32:05

服务监控Prometheus开源

2022-07-27 22:56:45

前端应用缓存qiankun

2022-03-06 09:51:04

PrometheusKubernete监控

2022-04-05 13:10:15

consul分布式高可用

2020-12-29 10:45:22

运维Prometheus-监控
点赞
收藏

51CTO技术栈公众号