当前位置: 首页 > news >正文

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

Consul介绍

Consul是由hashicorp组织发起的开源项目。Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul有一组组件,因此能提供多种功能,目前主要的功能就是服务发现,其他的附加功能,比如自动编排,key-value数据库等,暂时归属为附加值。
在Consul的服务发现定义中,应用服务(如Web服务、数据库服务、Redis服务等)在向Consul服务注册的过程中是作为提供服务方(Producer),Consul是接受服务方,服务信息由Consul Agent提供给Consul Server。
借助Consul,被服务者(Consumer)可以从Consul那里获得到提供服务方(Producer)提供了哪些可用的服务、应用。这些服务、应用是随时可以添加或移除的,借助负载均衡设备或软件可以非常容易实现高可用、可扩展的、弹性的应用服务架构。

服务发现以及服务注册

服务管理(注册与发现)的方式:
1:通过配置文件的方式静态注册(json文件)
2:通过HTTP API接口来动态注册(spring cloud使用方式,spring cloud中使用的是consul api)
3:使用consul client或consul api(程序)实现服务的注册和发现(Java非spring boot、cloud项目)

服务注册

当提供服务方(Producer)启动时,会将自己的IP/host等信息通过发送请求告知Consul,Consul接收到Producer的注册信息后,每隔10s(默认)会向Producer发送一个健康检查的请求,检验Producer是否存活。

服务发现

当被服务方(Consumer)请求Producer时,会先从Consul中拿到Producer服务的IP和Port的临时表(temp table),从temp table 表中匹配一个Producer的IP和Port,然后根据这个IP和Port,发送访问请求;temp table表中只包含通过了健康检查的Producer信息,并且每隔10s(默认)更新。
在这里插入图片描述

需求概述

使用 prometheus 进行 Redis 监控的都知道,redis_exporter 是较常用的解决方案,但是在 redis_exporter 开始的版本中,并不支持一个 redis_exporter 实例监控多 Redis 实例,现在虽然支持监控多个redis实例,但 redis_exporter 对于redis集群的监控表现不是太好(如果采用一个redis_exporter采集多个redis实例,可能会导致其中某个redis实例连不上),建议为每个redis 实例启动一个 redis_exporter,这样造成 exporter 实例的数量较多,难以维护和管理。
prometheus 有静态配置和动态配置。静态配置就是直接把要监控的目标写死到 prometheus 的配置文件中,这样维护起来比较难,需要频繁的修改配置文件 prometheus.yml. 同时还需进行 reload 操作才能生效。与此相反,prometheus 也可基于文件形式 xxx.json(与 prometheus 在同一级目录下) 的动态发现,虽然不需要再频繁修改的 prometheus 配置文件后进行 reload 操作,但是维护文件对运维确实也是挺难的,可自动化程度低且复杂。
但在大规模的监控环境中,基于文件的方式往往会面临较多的挑战。首先,由于有大量的实例需要进行监控,运维人员得频繁地对 Prometheus 配置文件进行修改,这会给工作带来很大的负担,同时也容易出现人为的失误。
另外,在大型企业中往往会有细致的分工,服务器部署与监控的管理可能是由不同的团队成员在负责,每当实例部署完成后还需要在人员之间进行信息的传递,这更进一步增加了操作的复杂性。
对此,Prometheus提供了多种动态服务发现的功能,而基于Consul的服务发现即是其中较为常见的一种方案。
prometheus 是可以基于 consul 实现动态发现的,这也是今天说的重点,对于基于 consul 实现的监控目标自动发现好处:
1、避免频繁操作机器配置文件来增加和修改配置项,减轻运维人员负担
2、利用consul自带的 API 可以结合现有的平台实现自动化接入
3、无需 reload
其他过多的就不在扩展了,直接进入正题,通过 redis_exporter 的动态发现实现多实例监控来熟悉一下 consul 在 prometheus 动态发现中有多重要。

注册监控服务

Consul部署:

consul配置文件

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

使用docker-compose启动

version: '3'
services:consul-server1:image: hashicorp/consul:1.13container_name: consul-serverrestart: alwaysports:- "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部署

运行一个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"

prometheus部署

version: '3'
services:prometheus:image: prom/prometheus:v2.12.0container_name: prometheusvolumes:- /apps/prometheus/conf/:/etc/prometheus/restart: alwaysports:- "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'

注册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-test01","name": "redis","address": "192.168.0.100","port": 19121,"tags": ["test"],"checks": [{"http": "http://192.168.0.100:29121","interval": "5s"}]
}'

在这里插入图片描述

修改prometheus的配置

- job_name: consul_redisscrape_interval: 15sscrape_timeout: 5sconsul_sd_configs:- server: 'IP:8500' # 修改你consul服务所在的ip地址token: '17ee5423-b5ce-xxxx-338e-xxxxxxxxxxx' # 修改你从consul中获取到的tokenrefresh_interval: 30sservices: ["redis"] # 这里是匹配注册到consul中的服务名称tags: ['test','redis'] # 这是匹配注册到consul中的tags, 要对应一致,不然查找到对象

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

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

然后访问 prometheus 的页面,查看是否有监控项被发现
在这里插入图片描述
之后接入Grafana正常监控即可。

注销服务

curl -X  PUT -H "X-Consul-Token:030bd88e-d654-5f8f-d8b5-fd4b08f24f5f" http://ip:8500/v1/agent/service/deregister/id1
curl -X  PUT -H "X-Consul-Token:030bd88e-d654-5f8f-d8b5-fd4b08f24f5f" http://ip:8500/v1/agent/service/deregister/id2

删除掉两个服务(注册的时候加了token,删除也要。不然会报错权限不足


http://www.mrgr.cn/news/55935.html

相关文章:

  • 今日头条躺赚流量:自动化新闻爬取和改写脚本
  • android 与网页交互通过网页修改宿主布局和异常处理——未来之窗行业应用跨平台架构
  • 【Flutter】状态管理:高级状态管理 (Riverpod, BLoC)
  • ScrollView 真机微信小程序无法隐藏滚动条
  • 【ios】在 SwiftUI 中实现可随时调用的加载框
  • Java基础12-特殊文件和日志技术
  • 【Dv2Admin】软删除的修改与恢复
  • 第6天:Intent和页面导航-补充材料——`MainActivity.kt`解读
  • SpringBoot 面试常见问答总结(一)
  • Ovito旋转模型的技巧
  • 【已解决】【Hadoop】 Shell命令易错点及解决方法
  • MRU烟气分析仪维修VARIOplus工业气体分析仪修理
  • 【前端构建】Snowpack: 现代化的前端构建工具
  • SAR ADC面试攻略:关键技术解析与面试问题全攻略
  • 使用GraphRAG系统实现本地部署的Ollama模型问答系统
  • 华为OD机试真题---游戏分组
  • 网络编程中容易踩的坑罗列,谨记!
  • Python 代码读取新闻语料文件,并进行新闻主题的统计分析
  • Linux 定时任务 (Crontab)
  • 合成生物学:设计生命的新工具
  • 美图设计室
  • 开源限流组件分析(一):juju/ratelimit
  • 在 gRPC 中,客户端和服务端的 Protocol Buffers(Protobuf)生成的文件必须保持一致性,以确保通信正常。
  • 宠物用品在线商城:SpringBoot技术的应用与实践
  • JAVA同城外卖跑腿团购到店跑腿多合一APP系统小程序源码
  • 推荐一款免费备份还原软件:AOMEI Backupper