一、背景简介

生产环境的Redis监控告警一直存在准确性问题,通过深入排查发现redis-exporter采集方式不正确,导致监控指标偏差和告警误报。为了解决这些问题,采用标准化的Helm部署方式来实现Redis集群监控采集。

核心解决问题

  • 修复Redis监控指标采集不准确的问题
  • 统一Redis集群监控部署方式
  • 提供安全的认证信息管理
  • 支持多集群的灵活配置管理

本方案通过Helm部署redis-exporter实现Redis集群监控采集,确保监控数据的准确性和可靠性。

二、部署文件准备

2.1. 必需文件清单

文件类型 文件名称 说明
Helm Charts prometheus-redis-exporter-6.9.0.tgz prometheus-redis-exporter chart部署包
配置文件 redis-exporter-values.yaml redis-exporter配置文件

版本说明

  • 推荐使用prometheus-redis-exporter 6.9.0或更新版本
  • Chart包包含了完整的Kubernetes资源定义
  • values.yaml文件支持集群多节点配置

2.2. 环境要求

  • Kubernetes集群环境
  • Helm 3.x已安装配置
  • Prometheus Operator已部署
  • Redis集群已正常运行
  • 具备集群管理权限

三、配置步骤

3.1. Redis密钥创建

Redis密钥用于安全存储Redis集群的认证信息,避免明文密码泄露。

(1)创建Secret命令

kubectl create secret generic app-redis-cluster-secret \
  --from-literal=redis-password='your-redis-password' \
  -n monitoring

(2)参数说明

参数 示例值 说明
Secret名称 app-redis-cluster-secret Redis密钥标识名称
密码键名 redis-password 密码在Secret中的键名
密码值 your-redis-password Redis集群实际密码
命名空间 monitoring Secret存储的命名空间

安全配置要点

  • 将示例中的密钥名称和密码替换为生产环境的实际值
  • 密码应符合强密码策略要求
  • Secret创建后可通过kubectl get secret验证
  • 定期轮换Redis密码并更新Secret

(3)验证Secret创建

# 检查Secret是否创建成功
kubectl get secret app-redis-cluster-secret -n monitoring

# 查看Secret详细信息(不显示密码内容)
kubectl describe secret app-redis-cluster-secret -n monitoring

3.2. 配置文件修改

修改redis-exporter-values.yaml配置文件中的关键配置项:

(1)核心配置参数

配置项 示例值 说明
service.labels.platform app-platform 平台标识,如:platform-a、platform-b、platform-c
serviceMonitor.targets 见下方示例 Redis集群所有节点配置
serviceMonitor.interval 60s 监控采集周期,建议60s
auth.secret.name app-redis-cluster-secret 步骤3.1创建的密钥名称

(2)完整配置示例

service:
  type: ClusterIP
  port: 9121
  portName: redis-exporter
  annotations: {}
  labels:
    platform: "app-platform"  # 修改为对应平台标识

serviceMonitor:
  # 启用ServiceMonitor
  enabled: true
  multipleTarget: true
  targets:
    # Redis集群节点配置 - 需配置所有节点
    - url: "172.16.1.15:6383"
      name: "app-redis-cluster-node-6383"
    - url: "172.16.1.15:6384"
      name: "app-redis-cluster-node-6384"
    - url: "172.16.1.15:6385"
      name: "app-redis-cluster-node-6385"
  
  additionalMetricsRelabels: {}
  additionalRelabeling: []
  
  # ServiceMonitor部署命名空间
  namespace: monitoring
  
  # Prometheus采集间隔(重要配置)
  interval: 60s  # 从默认15s调整为60s

auth:
  # 启用密码认证
  enabled: true
  # 使用已存在的Secret
  secret:
    name: "app-redis-cluster-secret"
    key: "redis-password"
  # 当不使用Secret时的密码配置(留空)
  redisPassword: ""

(3)配置要点说明

targets配置规范

  • url:Redis节点的IP和端口,格式为”IP:PORT”
  • name:节点标识名称,建议格式:”平台-redis-cluster-node-端口”
  • 必须配置集群的所有节点,确保监控覆盖完整

interval调整原因

  • Redis-exporter使用短连接方式采集数据
  • 默认15s间隔可能对Redis造成压力
  • 调整为60s可减少连接频率,提升稳定性

3.3. 平台标识配置

根据不同的生产环境,配置相应的平台标识:

环境类型 platform配置值 说明
应用平台A platform-a 应用平台A环境
应用平台B platform-b 应用平台B环境
应用平台C platform-c 应用平台C环境
数据平台 data-platform 数据平台环境
测试环境 test-env 测试环境

四、部署实施

4.1. Helm发布名称规范

命名规范平台前缀-prometheus-redis-exporter

标准示例

  • platform-a-prometheus-redis-exporter
  • platform-b-prometheus-redis-exporter
  • data-platform-prometheus-redis-exporter
  • app-cluster-prometheus-redis-exporter
  • test-env-prometheus-redis-exporter

重要说明:必须保留prometheus-redis-exporter后缀,否则Helm会自动添加该后缀导致名称不规范。

4.2. 部署命令

在具备Helm环境的生产服务器上执行部署:

# 部署Redis监控
helm install app-prometheus-redis-exporter \
  prometheus-redis-exporter-6.9.0.tgz \
  --version 6.9.0 \
  -n monitoring \
  -f redis-exporter-values.yaml

多环境部署示例

# 平台A环境
helm install platform-a-prometheus-redis-exporter \
  prometheus-redis-exporter-6.9.0.tgz \
  --version 6.9.0 \
  -n monitoring \
  -f platform-a-redis-exporter-values.yaml

# 平台B环境
helm install platform-b-prometheus-redis-exporter \
  prometheus-redis-exporter-6.9.0.tgz \
  --version 6.9.0 \
  -n monitoring \
  -f platform-b-redis-exporter-values.yaml

4.3. 部署验证

(1)检查Pod状态

# 查看Redis-exporter Pod状态
kubectl get pods -n monitoring | grep redis-exporter

# 查看具体Pod详情
kubectl describe pod <redis-exporter-pod-name> -n monitoring

(2)验证Service和ServiceMonitor

# 查看Service
kubectl get service -n monitoring | grep redis-exporter

# 查看ServiceMonitor
kubectl get servicemonitor -n monitoring | grep redis-exporter

(3)验证指标采集

# 端口转发测试
kubectl port-forward service/app-prometheus-redis-exporter 9121:9121 -n monitoring

# 访问指标端点
curl http://localhost:9121/metrics

4.4. 验证Redis连接

# 查看exporter日志
kubectl logs -f deployment/app-prometheus-redis-exporter -n monitoring

# 检查是否有连接错误
kubectl logs deployment/app-prometheus-redis-exporter -n monitoring | grep -i error

五、监控指标说明

5.1. 核心Redis指标

连接指标

  • redis_connected_clients:当前连接的客户端数量
  • redis_connected_slaves:连接的从节点数量
  • redis_blocked_clients:阻塞的客户端数量

内存指标

  • redis_memory_used_bytes:Redis使用的内存字节数
  • redis_memory_max_bytes:Redis最大可用内存
  • redis_memory_fragmentation_ratio:内存碎片率

性能指标

  • redis_total_commands_processed:总命令处理数
  • redis_instantaneous_ops_per_sec:每秒操作数
  • redis_keyspace_hits_total:键空间命中次数
  • redis_keyspace_misses_total:键空间未命中次数

集群指标

  • redis_cluster_enabled:集群模式状态
  • redis_cluster_slots_assigned:分配的集群槽位数
  • redis_cluster_slots_ok:正常的集群槽位数

5.2. 告警规则配置

groups:
- name: redis_alerts
  rules:
  - alert: RedisDown
    expr: redis_up == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Redis实例不可用"
      description: "{{ $labels.instance }} Redis实例已下线"
      
  - alert: RedisMemoryHigh
    expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "Redis内存使用率过高"
      description: "{{ $labels.instance }} 内存使用率超过90%"
      
  - alert: RedisConnectionsHigh
    expr: redis_connected_clients > 1000
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "Redis连接数过高"
      description: "{{ $labels.instance }} 连接数超过1000"
      
  - alert: RedisClusterSlotsMissing
    expr: redis_cluster_slots_assigned < redis_cluster_slots_ok
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Redis集群槽位异常"
      description: "{{ $labels.instance }} 集群槽位分配异常"

六、Grafana监控配置

6.1. 官方Dashboard

Redis-exporter提供了官方的Grafana Dashboard配置:

Dashboard地址
https://github.com/oliver006/redis_exporter/blob/master/contrib/grafana_prometheus_redis_dashboard.json

使用方法

  1. 下载JSON配置文件
  2. 在Grafana中导入Dashboard
  3. 配置数据源为对应的Prometheus
  4. 根据实际标签调整查询条件

6.2. 自定义监控面板

{
  "dashboard": {
    "title": "Redis集群监控",
    "panels": [
      {
        "title": "Redis连接数",
        "type": "graph",
        "targets": [
          {
            "expr": "redis_connected_clients{platform=\"$platform\"}",
            "legendFormat": "{{instance}} - 连接数"
          }
        ]
      },
      {
        "title": "内存使用率",
        "type": "graph",
        "targets": [
          {
            "expr": "redis_memory_used_bytes{platform=\"$platform\"} / redis_memory_max_bytes{platform=\"$platform\"} * 100",
            "legendFormat": "{{instance}} - 内存使用率%"
          }
        ]
      }
    ]
  }
}

七、配置管理

7.1. 添加新的Redis节点

(1)更新配置文件

# 获取当前配置
helm get values app-prometheus-redis-exporter -n monitoring > current-values.yaml

# 编辑配置添加新节点
vim current-values.yaml

(2)在targets中添加新节点

targets:
  - url: "172.16.1.15:6386"  # 新节点
    name: "app-redis-cluster-node-6386"

(3)更新部署

# 更新Helm部署
helm upgrade app-prometheus-redis-exporter \
  prometheus-redis-exporter-6.9.0.tgz \
  --version 6.9.0 \
  -n monitoring \
  -f current-values.yaml

7.2. 修改监控间隔

# 修改interval配置
sed -i 's/interval: 60s/interval: 30s/g' current-values.yaml

# 应用更新
helm upgrade app-prometheus-redis-exporter \
  prometheus-redis-exporter-6.9.0.tgz \
  --version 6.9.0 \
  -n monitoring \
  -f current-values.yaml

7.3. 完全卸载

# 卸载Helm部署
helm uninstall app-prometheus-redis-exporter -n monitoring

# 清理Secret(如果需要)
kubectl delete secret app-redis-cluster-secret -n monitoring

八、故障排查

8.1. 常见问题

部署失败

  • 检查Secret是否正确创建
  • 验证Redis集群连通性
  • 确认Helm Chart版本兼容性

连接失败

  • 验证Redis密码正确性
  • 检查网络连通性和防火墙
  • 确认Redis配置允许外部连接

指标缺失

  • 检查ServiceMonitor配置
  • 验证targets配置正确性
  • 查看exporter日志错误信息

8.2. 日志排查

# 查看exporter日志
kubectl logs -f deployment/app-prometheus-redis-exporter -n monitoring

# 查看最近的错误日志
kubectl logs deployment/app-prometheus-redis-exporter -n monitoring --tail=100 | grep -i error

# 检查ServiceMonitor状态
kubectl describe servicemonitor app-prometheus-redis-exporter -n monitoring

8.3. 连接测试

# 测试Redis连接
redis-cli -h 172.16.1.15 -p 6383 -a your-password ping

# 检查集群状态
redis-cli -h 172.16.1.15 -p 6383 -a your-password cluster nodes

总结

通过Helm部署Redis集群监控方案解决了以下关键问题:

  1. 准确性提升:修复了原有采集方式的问题,确保监控数据准确性
  2. 标准化部署:统一的Helm Chart管理,简化部署和维护流程
  3. 安全管理:通过Kubernetes Secret安全存储认证信息
  4. 灵活配置:支持多集群、多节点的灵活配置管理
  5. 性能优化:合理的采集间隔配置,降低对Redis的影响

本方案为Redis集群监控提供了可靠的基础设施,确保了生产环境监控的准确性和稳定性。

参考文档