Prometheus+Redis_exporter基于consul动态发现实现redis多实例监控

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
可观测可视化 Grafana 版,10个用户账号 1个月
简介: prometheus+ consul动态发现

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 实现的监控目标自动发现好处多多:

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

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

前期准备

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

测试环境服务器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
}
  1. 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 服务,并且获取 consultoken,后期 prometheus 的配置中需要用到

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

redis_exporter

redis_exporter 多实例密码问题
# 运行一个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实例密码,有需要的可以自己查看

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实践展示'
  1. 注册 redisconsul
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"
        }
    ]
}'

image-20220827180219820.png

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

  1. 服务注册到 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 两个去掉即可,其它不动即可使用
  1. 修改完成后,我们做针对 consul_redis 这个 job 的最后一次 reload prometheus服务
curl -XPUT http://prometheus:9090/-/reload
  1. 然后访问 prometheus 的页面,查看是否有监控项被发现

image-20220827182140287.png

这里就是最后的发现结果

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

image-20220827182753069.png

  1. 查看 grafana 数据展示

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

image-20220827183359514.png

相关实践学习
通过可观测可视化Grafana版进行数据可视化展示与分析
使用可观测可视化Grafana版进行数据可视化展示与分析。
相关文章
|
7月前
|
NoSQL 关系型数据库 Redis
Docker的通俗理解和通过宿主机端口访问Redis容器的实例
本文目标:引导初学者入门Docker,理解镜像、容器和宿主机概念,学习常用Docker命令,特别是如何创建并从Redis容器通过宿主机端口访问。 关键点: - Docker核心:镜像(类)、容器(实例)、宿主机(运行环境)。 - `docker pull` 拉取镜像,如 `redis:3.0`。 - `docker run -d --name` 后台运行容器,如 `my-redis`。 - `-p` 参数做端口映射,如 `6379:6379`。 - `docker exec -it` 交互式进入容器,如 `bash` 或执行命令。
278 4
|
8月前
|
NoSQL Java Redis
使用Redis实例搭建网上商城的商品相关性分析程序
本教程将指导您如何快速创建实例并搭建网上商城的商品相关性分析程序。(ApsaraDB for Redis)是兼容开源Redis协议标准的数据库服务,基于双机热备架构及集群架构,可满足高吞吐、低延迟及弹性变配等业务需求。
17603 0
|
7月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
88 1
|
6月前
|
Prometheus 监控 Cloud Native
Prometheus结合Consul采集多个MySQL实例的监控指标
将 Prometheus 与 Consul 结合使用,实现对多个 MySQL 实例的自动发现与监控,不仅提高了监控的效率和准确性,也为管理动态扩缩容的数据库环境提供了强大的支持。通过细致配置每一部分,业务可以获得关键的性能指标和运行健康状况的即时反馈,进而优化资源配置,提高系统的稳定性和可用性。
183 3
|
6月前
|
NoSQL Redis 开发工具
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
|
6月前
|
运维 NoSQL Serverless
Serverless 应用引擎使用问题之首次启动无法获取redis连接,重启实例后可以获取,是什么原因
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
Serverless 应用引擎使用问题之首次启动无法获取redis连接,重启实例后可以获取,是什么原因
|
6月前
|
NoSQL Redis 容器
Redis性能优化问题之如何判断 Redis 实例是否写入了 bigkey
Redis性能优化问题之如何判断 Redis 实例是否写入了 bigkey
|
7月前
|
消息中间件 弹性计算 缓存
通过OOS定时升级Redis实例临时带宽
阿里云OOS提供了定时升级Redis实例临时带宽的功能,以应对数据驱动业务中的流量高峰。这个功能允许用户根据预测的业务负载,在特定日期和时间自动增加Redis实例的带宽,确保服务性能和稳定性。在高流量事件结束后,带宽会自动恢复到原设置,节省成本。 此功能适用于电商平台促销、大型游戏更新等场景,确保在流量高峰期间的系统稳定运行。
|
8月前
|
存储 Prometheus 运维
All in One:Prometheus 多实例数据统一管理最佳实践
当管理多个Prometheus实例时,阿里云Prometheus托管版相比社区版提供了更可靠的数据采集和便捷的管理。本文比较了全局聚合实例与数据投递方案,两者在不同场景下各有优劣。
62847 24
|
8月前
|
存储 运维 NoSQL
通过OOS实现定时备份Redis实例转储到OSS
基于阿里云 Redis 备份功能,现结合 OOS 推出自动转储至 OSS 的新方案,解决了数据安全风险、运维繁琐、成本增加和效率低下等问题。新方案亮点包括: 1. 数据安全性提高:备份文件自动上传至OSS,利用OSS的数据冗余存储,保证数据在硬件故障时的持久性和可用性。 2. 完全自动化:设置好定时规则后,备份和转储过程无需人工干预。 3. 多实例多地域集中管理:支持一次选择多个实例和跨区域备份,简化管理。 4. 灵活的备份策略和成本控制:自定义备份频率,并通过OSS生命周期管理策略控制成本。 5. 监控和告警:集成OSS和云监控,实时掌握备份状态,及时处理异常。
通过OOS实现定时备份Redis实例转储到OSS