跳到主要内容

监控指标

前言

Redis作为高性能的内存数据库,广泛应用于缓存、消息队列、会话存储等多种场景。在生产环境中,对Redis进行有效监控是确保系统稳定性和性能的关键。通过监控关键指标,可以及时发现潜在问题,预防故障发生,优化系统性能,并为容量规划提供数据支持。

本文将详细介绍Redis监控的关键指标及其影响,帮助运维人员和开发人员构建完善的Redis监控体系。

常见指标

基本指标

连接数

指标名称connected_clientsblocked_clients

指标说明

  • connected_clients:当前连接到Redis的客户端数量
  • blocked_clients:因执行BLPOPBRPOPBRPOPLPUSH等阻塞命令而被阻塞的客户端数量

影响分析

  • 连接数过高可能导致内存消耗增加,影响Redis性能
  • 阻塞客户端数量过多可能表明存在慢查询或资源竞争问题
  • 异常的连接数波动可能表明应用程序存在连接泄漏问题

建议阈值

  • 连接数应根据应用需求设置合理上限,一般不建议超过10000
  • 阻塞客户端数应保持在较低水平,持续超过10个需要关注

命令执行统计

指标名称total_commands_processedinstantaneous_ops_per_secrejected_connections

指标说明

  • total_commands_processed:Redis启动以来处理的命令总数
  • instantaneous_ops_per_sec:当前每秒执行的命令数
  • rejected_connections:因达到最大连接数而被拒绝的连接数

影响分析

  • instantaneous_ops_per_sec反映了Redis的当前负载,过高可能导致CPU饱和
  • rejected_connections增加表明需要调整最大连接数或优化客户端连接策略
  • 命令执行数的突然变化可能表明应用行为异常或遭受攻击

建议阈值

  • 命令数应根据硬件性能和应用需求设置合理上限
  • rejected_connections应保持在0,否则需要调整配置

键值对数量

指标名称keyspace_hitskeyspace_missesdb0.keys

指标说明

  • keyspace_hits:缓存命中的次数
  • keyspace_misses:缓存未命中的次数
  • db0.keys:当前数据库中的键数量

影响分析

  • 命中率(keyspace_hits/(keyspace_hits+keyspace_misses))过低表明缓存效果不佳
  • 键数量突然增加可能导致内存使用量飙升
  • 键数量持续减少可能表明应用存在数据清理问题

建议阈值

  • 缓存命中率应保持在80%以上,低于50%需要优化缓存策略
  • 键数量应根据应用需求设置合理上限,避免内存溢出

CPU相关指标

CPU使用率

指标名称used_cpu_sysused_cpu_userinstantaneous_cpu_usage

指标说明

  • used_cpu_sys:Redis在系统模式下花费的CPU时间(以秒为单位)
  • used_cpu_user:Redis在用户模式下花费的CPU时间(以秒为单位)
  • instantaneous_cpu_usage:当前CPU使用率百分比

影响分析

  • CPU使用率持续高于80%可能导致性能下降
  • CPU使用率突然升高可能表明存在慢查询或异常访问
  • 系统模式和用户模式CPU时间的比例可以判断Redis是否执行大量计算密集型操作

建议阈值

  • CPU使用率应保持在80%以下,持续高于90%需要优化或扩容
  • CPU使用率突然波动超过20%需要关注,可能存在异常访问

命令执行延迟

指标名称slowlog_lengthslowlog_max_leninstantaneous_kbps

指标说明

  • slowlog_length:当前慢查询日志中的条目数
  • slowlog_max_len:慢查询日志的最大长度
  • instantaneous_kbps:当前每千字节的处理速度

影响分析

  • 慢查询数量过多表明存在性能瓶颈
  • 命令延迟增加可能导致应用响应变慢
  • 网络带宽使用率(instantaneous_kbps)过高可能导致网络拥塞

建议阈值

  • 慢查询数量应保持在较低水平,超过10个需要分析
  • 命令延迟应根据业务需求设置合理上限,一般不超过100ms

内存相关指标

内存使用量

指标名称used_memoryused_memory_humanused_memory_peakmaxmemory

指标说明

  • used_memory:Redis当前使用的内存量(字节)
  • used_memory_human:Redis当前使用的内存量(人类可读格式)
  • used_memory_peak:Redis历史内存使用峰值
  • maxmemory:配置的Redis最大内存限制

影响分析

  • 内存使用率(used_memory/maxmemory)过高可能导致内存溢出
  • 内存使用量持续增加可能表明存在内存泄漏
  • 内存使用量突然变化可能表明应用行为异常

建议阈值

  • 内存使用率应保持在80%以下,达到90%需要关注
  • 内存使用峰值与当前使用量的比例应保持稳定,突然增加需要分析

内存碎片率

指标名称mem_fragmentation_ratioused_memory_rssused_memory_lua

指标说明

  • mem_fragmentation_ratio:内存碎片率(used_memory_rss/used_memory)
  • used_memory_rss:操作系统实际分配给Redis的内存量
  • used_memory_lua:Lua脚本引擎使用的内存量

影响分析

  • 内存碎片率过高(>1.5)可能导致内存浪费和性能下降
  • 内存碎片率过低(<1.0)表明Redis使用了swap,严重影响性能
  • Lua脚本内存使用过多可能表明存在复杂计算

建议阈值

  • 内存碎片率应保持在1.0-1.5之间,超过1.5需要考虑重启释放碎片
  • 内存碎片率低于1.0需要检查是否使用了swap

内存淘汰策略

指标名称evicted_keysexpired_keysmaxmemory_policy

指标说明

  • evicted_keys:因达到内存限制而被淘汰的键数量
  • expired_keys:因达到过期时间而被删除的键数量
  • maxmemory_policy:配置的内存淘汰策略

影响分析

  • evicted_keys增加表明内存不足,需要扩容或优化内存使用
  • 淘汰策略不当可能导致重要数据被误删
  • 过期键数量突然变化可能表明应用行为异常

建议阈值

  • evicted_keys应保持在较低水平,持续增加需要优化
  • 内存淘汰策略应根据业务需求合理配置,避免误删重要数据

网络相关指标

网络输入输出

指标名称instantaneous_input_kbpsinstantaneous_output_kbpstotal_net_input_bytestotal_net_output_bytes

指标说明

  • instantaneous_input_kbps:当前每秒输入数据量(千字节)
  • instantaneous_output_kbps:当前每秒输出数据量(千字节)
  • total_net_input_bytes:Redis启动以来接收的总字节数
  • total_net_output_bytes:Redis启动以来发送的总字节数

影响分析

  • 网络带宽使用率过高可能导致网络拥塞
  • 网络流量突然变化可能表明应用行为异常
  • 输入输出流量不平衡可能表明存在数据倾斜问题

建议阈值

  • 网络带宽使用率应保持在70%以下,超过90%需要优化
  • 网络流量突然波动超过50%需要关注,可能存在异常访问

持久化相关指标

指标名称rdb_changes_since_last_saverdb_last_bgsave_statusaof_current_sizeaof_rewrite_in_progress

指标说明

  • rdb_changes_since_last_save:上次RDB保存后发生变化的键数量
  • rdb_last_bgsave_status:上次RDB后台保存状态
  • aof_current_size:当前AOF文件大小
  • aof_rewrite_in_progress:是否正在进行AOF重写

影响分析

  • RDB/AOF保存失败可能导致数据丢失
  • 持久化操作可能阻塞Redis主线程,影响性能
  • 持久化文件大小持续增加可能导致磁盘空间不足

建议阈值

  • 持久化操作应保持成功状态,失败需要立即处理
  • 持久化文件大小应根据磁盘空间合理设置上限

Redis集群相关指标

集群状态

指标名称cluster_enabledcluster_statecluster_nodescluster_slots_fail

指标说明

  • cluster_enabled:是否启用了集群模式
  • cluster_state:集群状态(ok、fail、etc.)
  • cluster_nodes:集群中的节点数量
  • cluster_slots_fail:不可用的槽位数量

影响分析

  • 集群状态异常可能导致服务不可用
  • 槽位分配不均可能导致某些节点负载过高
  • 节点故障可能导致数据不可用

建议阈值

  • 集群状态应保持"ok",异常需要立即处理
  • 槽位不可用数量应为0,否则需要修复集群

主从复制

指标名称master_repl_offsetslave_repl_offsetmaster_link_statusmaster_last_io_seconds_ago

指标说明

  • master_repl_offset:主节点的复制偏移量
  • slave_repl_offset:从节点的复制偏移量
  • master_link_status:从节点与主节点的连接状态
  • master_last_io_seconds_ago:从节点与主节点最后一次通信的时间(秒)

影响分析

  • 复制延迟过大可能导致数据不一致
  • 主从连接断开可能导致数据丢失
  • 复制偏移量异常可能表明复制过程出现问题

建议阈值

  • 复制延迟应保持在合理范围内,一般不超过5秒
  • 主从连接状态应保持"up",异常需要立即处理

使用redis-cli查看监控指标

除了使用Prometheus等监控系统外,我们还可以直接使用redis-cli命令行工具查看Redis的各种监控指标。这种方法简单直接,适合快速诊断问题和手动检查。

基本命令

INFO命令

INFO命令是查看Redis状态信息的主要方式,它可以返回Redis服务器的各种信息和统计数据。

# 查看所有信息
redis-cli INFO

# 查看特定部分的信息
redis-cli INFO server # 服务器信息
redis-cli INFO clients # 客户端信息
redis-cli INFO memory # 内存信息
redis-cli INFO stats # 一般统计信息
redis-cli INFO replication # 复制信息
redis-cli INFO cpu # CPU信息
redis-cli INFO commandstats # 命令统计
redis-cli INFO cluster # 集群信息
redis-cli INFO keyspace # 键空间信息

STATISTICS命令

STATISTICS命令返回Redis的一般统计信息,包括连接数、命令执行情况等。

redis-cli STATS

LATENCY命令

LATENCY命令用于查看和分析延迟相关的信息。

# 查看所有命令的延迟统计
redis-cli LATENCY LATEST

# 查看特定命令的延迟统计
redis-cli LATENCY COMMAND stats

# 重置延迟统计
redis-cli LATENCY RESET

慢查询日志

SLOWLOG命令用于查看慢查询日志。

# 查看慢查询日志
redis-cli SLOWLOG GET

# 设置慢查询阈值(微秒)
redis-cli SLOWLOG GET 10 # 获取最慢的10个查询

# 重置慢查询日志
redis-cli SLOWLOG RESET

常用监控指标查看方法

连接数监控

# 查看当前连接数
redis-cli INFO clients | grep connected_clients

# 查看阻塞客户端数
redis-cli INFO clients | grep blocked_clients

# 查看历史最大连接数
redis-cli INFO clients | grep maxclients

CPU使用率监控

# 查看CPU使用情况
redis-cli INFO cpu

# 计算CPU使用率
redis-cli INFO cpu | grep used_cpu_sys
echo "scale=2; $(redis-cli INFO cpu | grep used_cpu_sys | cut -d: -f2) * 100 / $(cat /proc/cpuinfo | grep 'processor' | wc -l)" | bc

内存使用监控

# 查看内存使用情况
redis-cli INFO memory

# 计算内存使用率
redis-cli INFO memory | grep used_memory
echo "scale=2; $(redis-cli INFO memory | grep used_memory | cut -d: -f2) * 100 / $(redis-cli INFO memory | grep maxmemory | cut -d: -f2)" | bc

# 查看内存碎片率
echo "scale=2; $(redis-cli INFO memory | grep used_memory_rss | cut -d: -f2) / $(redis-cli INFO memory | grep used_memory | cut -d: -f2)" | bc

键空间监控

# 查看键空间信息
redis-cli INFO keyspace

# 查看数据库中的键数量
redis-cli DBSIZE

# 查看特定键的内存使用
redis-cli DEBUG OBJECT key_name

命令执行监控

# 查看命令执行统计
redis-cli INFO stats | grep total_commands_processed
echo "当前每秒执行命令数: $(redis-cli INFO stats | grep instantaneous_ops_per_sec | cut -d: -f2)"

# 查看拒绝的连接数
echo "拒绝的连接数: $(redis-cli INFO stats | grep rejected_connections | cut -d: -f2)"

缓存命中率监控

# 计算缓存命中率
hits=$(redis-cli INFO stats | grep keyspace_hits | cut -d: -f2)
misses=$(redis-cli INFO stats | grep keyspace_misses | cut -d: -f2)
echo "缓存命中率: $(echo "scale=2; $hits / ($hits + $misses) * 100" | bc)%"

持久化监控

# 查看RDB持久化状态
echo "RDB持久化状态: $(redis-cli INFO persistence | grep rdb_last_bgsave_status | cut -d: -f2)"
echo "上次RDB保存时间: $(date -d @$(redis-cli INFO persistence | grep rdb_last_save_time | cut -d: -f2))"

# 查看AOF持久化状态
echo "AOF持久化状态: $(redis-cli INFO persistence | grep aof_last_bgrewrite_status | cut -d: -f2)"
echo "AOF当前大小: $(redis-cli INFO persistence | grep aof_current_size | cut -d: -f2)字节"

集群监控

# 检查集群状态
redis-cli INFO cluster | grep cluster_state

# 查看集群节点信息
redis-cli CLUSTER NODES

# 查看集群槽位分配情况
redis-cli CLUSTER SHARDS

主从复制监控

# 查看复制状态
echo "复制状态: $(redis-cli INFO replication | grep master_link_status | cut -d: -f2)"
echo "复制延迟: $(redis-cli INFO replication | grep master_sync_in_progress | cut -d: -f2)"
echo "最后同步时间: $(redis-cli INFO replication | grep master_last_io_seconds_ago | cut -d: -f2)秒前"

Redis哨兵监控

Redis哨兵(Sentinel)是Redis的高可用性解决方案,用于监控主从复制集群并在主节点故障时自动进行故障转移。监控哨兵的状态对于确保Redis集群的高可用性至关重要。

哨兵基本状态监控

# 连接到哨兵实例
redis-cli -h sentinel_host -p sentinel_port

# 查看哨兵基本信息
SENTINEL master master_name
SENTINEL masters
SENTINEL slaves master_name
SENTINEL sentinels master_name

# 查看哨兵监控的主节点状态
SENTINEL master mymaster

哨兵关键指标

指标名称sentinel_masterssentinel_tiltsentinel_running_scripts

指标说明

  • sentinel_masters:哨兵监控的主节点数量
  • sentinel_tilt:哨兵是否处于倾斜状态(可能表明系统时钟问题)
  • sentinel_running_scripts:当前正在执行的脚本数量

影响分析

  • 监控的主节点数量与预期不符可能表明配置问题
  • 哨兵处于倾斜状态可能导致监控失效
  • 脚本数量过多可能表明故障转移过程出现问题

建议阈值

  • sentinel_masters应与配置保持一致
  • sentinel_tilt应为0,否则需要检查系统时钟
  • sentinel_running_scripts应保持在较低水平

哨兵监控的主节点状态

# 查看主节点状态
redis-cli -h sentinel_host -p sentinel_port SENTINEL master mymaster

关键指标

  • name:主节点名称
  • ip:主节点IP地址
  • port:主节点端口
  • runid:主节点运行ID
  • config_epoch:配置纪元
  • num-slaves:从节点数量
  • status:主节点状态(ok, sdown, odown)
  • failover-timeout:故障转移超时时间

影响分析

  • 主节点状态为odown(客观下线)表明主节点已故障并触发故障转移
  • 从节点数量不足可能导致故障转移后可用性降低
  • 故障转移超时时间过长可能导致服务不可用时间延长

哨兵监控的从节点状态

# 查看从节点状态
redis-cli -h sentinel_host -p sentinel_port SENTINEL slaves mymaster

关键指标

  • name:从节点名称
  • ip:从节点IP地址
  • port:从节点端口
  • runid:从节点运行ID
  • flags:从节点状态(slave, sdown, ...)
  • master-link-down-time:主节点连接断开时间
  • master-repl-offset:主从复制偏移量
  • slave-repl-offset:从节点复制偏移量

影响分析

  • 从节点状态为sdown(主观下线)可能表明从节点故障
  • 主从复制偏移量差距过大可能导致数据不一致
  • 主节点连接断开时间过长可能表明网络问题

哨兵自身状态

# 查看哨兵自身状态
redis-cli -h sentinel_host -p sentinel_port INFO sentinel

关键指标

  • sentinel_masters:监控的主节点数量
  • sentinel_tilt:倾斜状态标志
  • sentinel_running_scripts:正在执行的脚本数量
  • sentinel_scripts_queue:脚本队列长度
  • sentinel_simulate_failover:模拟故障转移标志
  • sentinel_epoch:哨兵当前纪元

影响分析

  • 哨兵脚本队列过长可能表明处理能力不足
  • 模拟故障转移标志激活表明正在进行故障转移测试
  • 哨兵纪元变化表明哨兵领导者选举发生

哨兵故障转移监控

# 查看故障转移状态
redis-cli -h sentinel_host -p sentinel_port SENTINEL get-master-addr-by-name mymaster

# 查看故障转移进度
redis-cli -h sentinel_host -p sentinel_port SENTINEL failover mymaster

关键指标

  • 故障转移开始时间
  • 新主节点选举结果
  • 从节点提升为主节点的时间
  • 数据同步完成时间

影响分析

  • 故障转移时间过长可能导致服务不可用时间延长
  • 数据同步不完整可能导致数据丢失
  • 多个哨兵对主节点状态判断不一致可能导致脑裂

哨兵监控脚本

# 查看哨兵配置的脚本
redis-cli -h sentinel_host -p sentinel_port SENTINEL scripts-reconf

# 查看脚本执行状态
redis-cli -h sentinel_host -p sentinel_port SENTINEL script kill

关键指标

  • 脚本执行时间
  • 脚本执行结果
  • 脚本超时情况

影响分析

  • 脚本执行超时可能导致故障转移延迟
  • 脚本失败可能导致自定义处理逻辑失效

哨兵监控自动化脚本示例

#!/bin/bash

# 哨兵连接信息
SENTINEL_HOST="localhost"
SENTINEL_PORT=26379
MASTER_NAME="mymaster"
ALERT_EMAIL="admin@example.com"

# 检查哨兵状态
check_sentinel() {
# 检查哨兵是否正常运行
sentinel_info=$(redis-cli -h $SENTINEL_HOST -p $SENTINEL_PORT INFO sentinel)

# 检查哨兵是否处于倾斜状态
tilt_status=$(echo "$sentinel_info" | grep sentinel_tilt | cut -d: -f2)
if [ "$tilt_status" -eq 1 ]; then
echo "警报: 哨兵处于倾斜状态"
echo "哨兵处于倾斜状态" | mail -s "哨兵警报" $ALERT_EMAIL
fi

# 检查脚本队列长度
script_queue=$(echo "$sentinel_info" | grep sentinel_scripts_queue | cut -d: -f2)
if [ $script_queue -gt 10 ]; then
echo "警报: 哨兵脚本队列过长: $script_queue"
echo "哨兵脚本队列过长: $script_queue" | mail -s "哨兵警报" $ALERT_EMAIL
fi

# 检查主节点状态
master_info=$(redis-cli -h $SENTINEL_HOST -p $SENTINEL_PORT SENTINEL master $MASTER_NAME)
master_status=$(echo "$master_info" | grep status | cut -d: -f2)

if [ "$master_status" = "odown" ]; then
echo "警报: 主节点已下线,正在进行故障转移"
echo "主节点已下线,正在进行故障转移" | mail -s "哨兵警报" $ALERT_EMAIL
fi

# 检查从节点状态
slaves_info=$(redis-cli -h $SENTINEL_HOST -p $SENTINEL_PORT SENTINEL slaves $MASTER_NAME)
slave_down=$(echo "$slaves_info" | grep -c sdown)

if [ $slave_down -gt 0 ]; then
echo "警报: $slave_down个从节点已下线"
echo "$slave_down个从节点已下线" | mail -s "哨兵警报" $ALERT_EMAIL
fi
}

# 主循环
while true; do
check_sentinel
sleep 30 # 每30秒检查一次
done

自动化监控脚本示例

以下是一个简单的Bash脚本,用于定期检查Redis关键指标并发送警报:

#!/bin/bash

# Redis连接信息
REDIS_HOST="localhost"
REDIS_PORT=6379
REDIS_PASSWORD=""
ALERT_EMAIL="admin@example.com"

# 检查函数
check_redis() {
# 内存使用率检查
memory_usage=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD INFO memory | grep used_memory | cut -d: -f2)
max_memory=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD INFO memory | grep maxmemory | cut -d: -f2)

if [ $max_memory -gt 0 ]; then
usage_percent=$(echo "scale=2; $memory_usage * 100 / $max_memory" | bc)
if (( $(echo "$usage_percent > 90" | bc -l) )); then
echo "警报: Redis内存使用率过高: $usage_percent%"
echo "Redis内存使用率过高: $usage_percent%" | mail -s "Redis警报" $ALERT_EMAIL
fi
fi

# CPU使用率检查
cpu_usage=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD INFO cpu | grep used_cpu_user | cut -d: -f2)
if (( $(echo "$cpu_usage > 80" | bc -l) )); then
echo "警报: Redis CPU使用率过高: $cpu_usage%"
echo "Redis CPU使用率过高: $cpu_usage%" | mail -s "Redis警报" $ALERT_EMAIL
fi

# 缓存命中率检查
hits=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS PASSWORD INFO stats | grep keyspace_hits | cut -d: -f2)
misses=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD INFO stats | grep keyspace_misses | cut -d: -f2)

if [ $hits -gt 0 ] || [ $misses -gt 0 ]; then
hit_rate=$(echo "scale=2; $hits / ($hits + $misses) * 100" | bc)
if (( $(echo "$hit_rate < 50" | bc -l) )); then
echo "警报: Redis缓存命中率过低: $hit_rate%"
echo "Redis缓存命中率过低: $hit_rate%" | mail -s "Redis警报" $ALERT_EMAIL
fi
fi

# 慢查询检查
slowlog_length=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD SLOWLOG LEN)
if [ $slowlog_length -gt 10 ]; then
echo "警报: Redis慢查询数量过多: $slowlog_length"
echo "Redis慢查询数量过多: $slowlog_length" | mail -s "Redis警报" $ALERT_EMAIL
fi
}

# 主循环
while true; do
check_redis
sleep 60 # 每分钟检查一次
done

Prometheus监控redis cluster

启动redis_exporter

因为集群配置了密码,所以要先编辑一个包含密码的文件,这里命名为.redis.json,内容如下

{
"redis://redis1:7001": "123456",
"redis://redis2:7002": "123456",
"redis://redis3:7003": "123456",
"redis://redis4:7004": "123456",
"redis://redis5:7005": "123456",
"redis://redis6:7006": "123456"
}

启动redis_exporter,启动脚本参考 "补充 - redis_exporter启动脚本"

编辑prometheus.yml

global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "nodes"
file_sd_configs:
- files: ['sd_configs/nodes/*.yaml']
refresh_interval: 10s
- job_name: 'redis_exporter_targets'
file_sd_configs:
- files: ['sd_configs/redis/redis_exporter_targets.yaml']
refresh_interval: 10s
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: redis_exporter:19096
- job_name: 'redis_exporter'
file_sd_configs:
- files: ['sd_configs/redis/redis_exporter.yaml']
refresh_interval: 10s

sd_configs/redis/redis_exporter_targets.yaml 内容

- targets:
- redis://redis1:7001
- redis://redis2:7002
- redis://redis3:7003
- redis://redis4:7004
- redis://redis5:7005
- redis://redis6:7006

sd_configs/redis/redis_exporter.yaml 内容

- targets: ["redis_exporter:19096"]

补充

redis_exporter启动脚本

#!/bin/bash

set -u

script_dir=$(cd $(dirname $0) && pwd)
port=19096
app_name="redis_exporter"

check_env() {
timeout 1 bash -c "cat < /dev/null > /dev/tcp/127.0.0.1/${port}" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "port ${port} has been used"
exit 1
fi

if [ ! -f "${script_dir}/.redis.json" ]; then
echo "redis password file not found"
exit 1
fi
}

start_app() {
check_env
nohup ${script_dir}/${app_name} \
-redis.addr redis1:7001 \
-redis.password-file="${script_dir}/.redis.json" \
-web.listen-address 0.0.0.0:${port} > /dev/null 2>&1 &
echo "start ${app_name} called"
}

stop_app() {
local pid=$(ps -ef | grep -v grep | grep "${script_dir}/${app_name}" | awk '{print $2}')
if [ x"${pid}" == x ]; then
echo "${script_dir}/${app_name} is not runnning"
exit 0
fi
kill ${pid}
echo "stop ${app_name} called"
}

status_app() {
ps -ef | grep -v grep | grep "${script_dir}/${app_name}"
if [ $? -ne 0 ]; then
echo "${script_dir}/${app_name} is not runnning"
exit 0
fi
echo "status ${app_name} called"
}

main() {
case $1 in
start)
start_app
;;
stop)
stop_app
;;
status)
status_app
;;
*)
echo "Available options: start | stop | status"
esac
}

main $@