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


    Redis exporter

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

    喜欢的可以关注微信公众号: 云原生生态圈

    1. # old
    2. http://redis_exporter:9121/metrics
    3. # now
    4. http://redis_exporter:9121/scrape?target=redis://redis:6379

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

    prometheus配置回顾

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

    静态配置

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

    1. scrape_configs: 
    2. - job_name: node 
    3.   static_configs: 
    4.   - targets: 
    5.     - 10.40.58.153:9100 
    6.     - 10.40.61.116:9100 
    7.     - 10.40.58.154:9100

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

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

    基于文件发现

    1. - job_name: 'RabbitMQ-server'
    2.     file_sd_configs:
    3.     - files:
    4.       - rabbitmq.json

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

    基于consul/etcd

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

    1. 避免频繁操作机器配置文件来增加和修改配置项,减轻运维人员负担避免成为配置达人

    2. 利用 consul 等 自带的 API 可以结合现有的平台实现自动化接入

    3. 无需 reload

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

    前期准备

    因为这里主要记录 prometheus 基于 consul 实现的 redis_exporter 进行多实例监控的案例,consulprometheus 部署的问题就不在细说,可以翻看公众号之前的文章。

    测试环境服务器IP:192.168.0.100

    consul部署

    1. consul配置文件 consul.hcl

    1. client_addr = "0.0.0.0"
    2. ui_config{
    3.   enabled = true
    4. }
    5. server = true
    6. bootstrap = true
    7. acl = {
    8.   enabled = true
    9.   default_policy = "deny"
    10.   enable_token_persistence = true
    11. }
    1. Consul docker-compose.yaml

    1. version: '3'
    2. services:
    3.   consul-server1:
    4.     image: hashicorp/consul:1.13
    5.     container_name: consul-server
    6.     restart: always
    7.     ports:
    8.       - "8500:8500"
    9.       - "8600:8600/tcp"
    10.       - "8600:8600/udp"
    11.     command: "agent -server -config-file /consul/consul.hcl"
    12.     volumes:
    13.       - ./consul.hcl:/consul/consul.hcl:ro

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

    1. docker-compose up -d
    2. docker exec -it consul-server bash
    3. consul acl bootstrap

    redis_exporter

    redis_exporter 多实例密码问题[1]

    1. # 运行一个redis_exporter,用于获取 没有启用认证的实例的指标
    2. docker run -d --name redis_exporter -p 19121:9121 oliver006/redis_exporter
    3. # 运行一个redis_exporter,用于获取 启用认证且密码是SUPER_SECRET_PASSWORD的实例的指标
    4. docker run -d --name redis_exporter_auth -p 29121:9121 oliver006/redis_exporter -redis.password SUPER_SECRET_PASSWORD
    5. # 运行一个 启用认证且密码是SUPER_SECRET_PASSWORD的redis实例
    6. 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

    1. version: '3'
    2. services:
    3.   prometheus:
    4.     image: prom/prometheus:v2.12.0
    5.     container_name: prometheus
    6.     volumes:
    7.       - /apps/prometheus/conf/:/etc/prometheus/
    8.     restart: always
    9.     ports:
    10.       - "9090:9090"
    11.     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实践展示'
    1. 注册 redisconsul

    1. curl --location --request PUT 'http://consul:8500/v1/agent/service/register' \
    2. --header 'X-CONSUL-TOKEN: 17ee5423-b5ce-xxxx-338e-xxxxxxxxxxx' \
    3. --header 'Content-Type: application/json' \
    4. --data-raw '{
    5.     "id": "redis-192.168.0.100:46379",
    6.     "name": "redis",
    7.     "address": "192.168.0.100",
    8.     "port": 46379,
    9.     "tags": [
    10.         "192.168.0.100:29121",
    11.         "redis",
    12.         "test"
    13.     ],
    14.     "checks": [
    15.         {
    16.           "http": "http://192.168.0.100:29121",
    17.           "interval": "5s"
    18.         }
    19.     ]
    20. }'
    df30b11468e9f635fe75e61dfb3a0797.png
    consul页面

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

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

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

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

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

    curl -XPUT http://prometheus:9090/-/reload
    1. 然后访问 prometheus 的页面,查看是否有监控项被发现

    3e4b2ce6af7df2c913e48361f1508d99.png

    prometheus target页面

    这里就是最后的发现结果

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

    6135255d918cc6cfa1142cbb4ee8ed04.png

    通过curl查看exporter结果
    1. 查看 grafana 数据展示

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

    79bd9969d19d5fb55f574c221b8f2fc7.png

    f5bb27bb7a9aa207b485d7af63d800f9.png

    <<< 左右滑动见更多 >>>

    资料参考

    [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

  • 相关阅读:
    基于原microc改进的编程语言原理与编译
    AJAX基于XML的数据交换、XML和JSON的区别
    linux进程管理
    实现excel导出最简单方式
    【藏经阁一起读(71)】读《阿里云 ClickHouse 企业版技术白皮书》
    基于物联网表计的综合能源管理方案-安科瑞黄安南
    《HelloGitHub》第 80 期
    SpringBoot框架SpEL表达式注入漏洞复现与原理分析
    go语言使用grpc
    一文搞懂传统单节点网站的 Serverless 上云
  • 原文地址:https://blog.csdn.net/csdnzxm/article/details/126564773