zabbix监控redis性能

本文介绍了一种使用Zabbix监控Redis服务器的方法,通过编写Shell脚本来获取Redis的状态信息,并将其整合到Zabbix中实现自动化的监控。文章详细介绍了脚本的编写过程,包括参数设置、权限配置及Zabbix配置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建采集脚本

mkdir -p /etc/zabbix/scripts

chown -R zabbix.root /etc/zabbix/scripts

vim redis_status.sh 

#!/bin/bash
REDISPATH="/usr/local/redis/bin/redis-cli"
HOST="127.0.0.1"
PORT="6379"
REDIS_INFO="$REDISPATH -h $HOST -p $PORT -a xxx info"   ##-a 后面跟的是redis密码
if [[ $# == 1 ]];then
case $1 in
cluster)
result=`$REDIS_INFO|/bin/grep cluster|awk -F":" '{print $NF}'`
echo $result 
;; 
uptime_in_seconds)
result=`$REDIS_INFO|/bin/grep uptime_in_seconds|awk -F":" '{print $NF}'`
echo $result 
;; 
connected_clients)
result=`$REDIS_INFO|/bin/grep connected_clients|awk -F":" '{print $NF}'`
echo $result 
;; 
client_longest_output_list)
result=`$REDIS_INFO|/bin/grep client_longest_output_list|awk -F":" '{print $NF}'`
echo $result 
;; 
client_biggest_input_buf)
result=`$REDIS_INFO|/bin/grep client_biggest_input_buf|awk -F":" '{print $NF}'`
echo $result 
;; 
blocked_clients)
result=`$REDIS_INFO|/bin/grep blocked_clients|awk -F":" '{print $NF}'`
echo $result 
;; 
#内存
used_memory)
result=`$REDIS_INFO|/bin/grep used_memory|awk -F":" '{print $NF}'|awk 'NR==1'`
echo $result 
;; 
used_memory_human)
result=`$REDIS_INFO|/bin/grep used_memory_human|awk -F":" '{print $NF}'|awk -F'K' '{print $1}'` 
echo $result 
;; 
used_memory_rss)
result=`$REDIS_INFO|/bin/grep used_memory_rss|awk -F":" '{print $NF}'`
echo $result 
;; 
used_memory_peak)
result=`$REDIS_INFO|/bin/grep used_memory_peak|awk -F":" '{print $NF}'|awk 'NR==1'`
echo $result 
;; 
used_memory_peak_human)
result=`$REDIS_INFO|/bin/grep used_memory_peak_human|awk -F":" '{print $NF}'|awk -F'K' '{print $1}'`
echo $result 
;; 
used_memory_lua)
result=`$REDIS_INFO|/bin/grep used_memory_lua|awk -F":" '{print $NF}'`
echo $result 
;; 
mem_fragmentation_ratio)
result=`$REDIS_INFO|/bin/grep mem_fragmentation_ratio|awk -F":" '{print $NF}'`
echo $result 
;; 
#rdb
rdb_changes_since_last_save)
result=`$REDIS_INFO|/bin/grep rdb_changes_since_last_save|awk -F":" '{print $NF}'`
echo $result 
;; 
rdb_bgsave_in_progress)
result=`$REDIS_INFO|/bin/grep rdb_bgsave_in_progress|awk -F":" '{print $NF}'`
echo $result 
;; 
rdb_last_save_time)
result=`$REDIS_INFO|/bin/grep rdb_last_save_time|awk -F":" '{print $NF}'`
echo $result 
;; 
rdb_last_bgsave_status)
result=`$REDIS_INFO|/bin/grep -w "rdb_last_bgsave_status" | awk -F':' '{print $2}' | /bin/grep -c ok`
echo $result 
;; 
rdb_current_bgsave_time_sec)
result=`$REDIS_INFO|/bin/grep -w "rdb_current_bgsave_time_sec" | awk -F':' '{print $2}'`
echo $result 
;; 
#rdbinfo
aof_enabled)
result=`$REDIS_INFO|/bin/grep -w "aof_enabled" | awk -F':' '{print $2}'`
echo $result 
;; 
aof_rewrite_scheduled)
result=`$REDIS_INFO|/bin/grep -w "aof_rewrite_scheduled" | awk -F':' '{print $2}'`
echo $result 
;; 
aof_last_rewrite_time_sec)
result=`$REDIS_INFO|/bin/grep -w "aof_last_rewrite_time_sec" | awk -F':' '{print $2}'`
echo $result 
;; 
aof_current_rewrite_time_sec)
result=`$REDIS_INFO|/bin/grep -w "aof_current_rewrite_time_sec" | awk -F':' '{print $2}'`
echo $result 
;; 
aof_last_bgrewrite_status)
result=`$REDIS_INFO|/bin/grep -w "aof_last_bgrewrite_status" | awk -F':' '{print $2}' | /bin/grep -c ok`
echo $result 
;; 
#aofinfo
aof_current_size)
result=`$REDIS_INFO|/bin/grep -w "aof_current_size" | awk -F':' '{print $2}'`
echo $result 
;; 
aof_base_size)
result=`$REDIS_INFO|/bin/grep -w "aof_base_size" | awk -F':' '{print $2}'`
echo $result 
;; 
aof_pending_rewrite)
result=`$REDIS_INFO|/bin/grep -w "aof_pending_rewrite" | awk -F':' '{print $2}'`
echo $result 
;; 
aof_buffer_length)
result=`$REDIS_INFO|/bin/grep -w "aof_buffer_length" | awk -F':' '{print $2}'`
echo $result 
;; 
aof_rewrite_buffer_length)
result=`$REDIS_INFO|/bin/grep -w "aof_rewrite_buffer_length" | awk -F':' '{print $2}'`
echo $result 
;; 
aof_pending_bio_fsync)
result=`$REDIS_INFO|/bin/grep -w "aof_pending_bio_fsync" | awk -F':' '{print $2}'`
echo $result 
;;
aof_delayed_fsync)
result=`$REDIS_INFO|/bin/grep -w "aof_delayed_fsync" | awk -F':' '{print $2}'`
echo $result 
;; 
#stats
total_connections_received)
result=`$REDIS_INFO|/bin/grep -w "total_connections_received" | awk -F':' '{print $2}'`
echo $result 
;; 
total_commands_processed)
result=`$REDIS_INFO|/bin/grep -w "total_commands_processed" | awk -F':' '{print $2}'`
echo $result 
;; 
instantaneous_ops_per_sec)
result=`$REDIS_INFO|/bin/grep -w "instantaneous_ops_per_sec" | awk -F':' '{print $2}'`
echo $result 
;; 
rejected_connections)
result=`$REDIS_INFO|/bin/grep -w "rejected_connections" | awk -F':' '{print $2}'` 
echo $result 
;; 
expired_keys)
result=`$REDIS_INFO|/bin/grep -w "expired_keys" | awk -F':' '{print $2}'`
echo $result 
;; 
evicted_keys)
result=`$REDIS_INFO|/bin/grep -w "evicted_keys" | awk -F':' '{print $2}'` 
echo $result 
;; 
keyspace_hits)
result=`$REDIS_INFO|/bin/grep -w "keyspace_hits" | awk -F':' '{print $2}'` 
echo $result 
;; 
keyspace_misses)
result=`$REDIS_INFO|/bin/grep -w "keyspace_misses" | awk -F':' '{print $2}'`
echo $result 
;;
pubsub_channels)
result=`$REDIS_INFO|/bin/grep -w "pubsub_channels" | awk -F':' '{print $2}'`
echo $result 
;;
pubsub_channels)
result=`$REDIS_INFO|/bin/grep -w "pubsub_channels" | awk -F':' '{print $2}'`
echo $result 
;;
pubsub_patterns)
result=`$REDIS_INFO|/bin/grep -w "pubsub_patterns" | awk -F':' '{print $2}'`
echo $result 
;;
latest_fork_usec)
result=`$REDIS_INFO|/bin/grep -w "latest_fork_usec" | awk -F':' '{print $2}'`
echo $result 
;; 
connected_slaves)
result=`$REDIS_INFO|/bin/grep -w "connected_slaves" | awk -F':' '{print $2}'`
echo $result 
;;
master_link_status)
result=`$REDIS_INFO|/bin/grep -w "master_link_status"|awk -F':' '{print $2}'|/bin/grep -c up`
echo $result 
;;
master_last_io_seconds_ago)
result=`$REDIS_INFO|/bin/grep -w "master_last_io_seconds_ago"|awk -F':' '{print $2}'`
echo $result 
;;
master_sync_in_progress)
result=`$REDIS_INFO|/bin/grep -w "master_sync_in_progress"|awk -F':' '{print $2}'`
echo $result 
;;
slave_priority)
result=`$REDIS_INFO|/bin/grep -w "slave_priority"|awk -F':' '{print $2}'`
echo $result 
;;
#cpu
used_cpu_sys)
result=`$REDIS_INFO|/bin/grep -w "used_cpu_sys"|awk -F':' '{print $2}'`
echo $result 
;;
used_cpu_user)
result=`$REDIS_INFO|/bin/grep -w "used_cpu_user"|awk -F':' '{print $2}'`
echo $result 
;;
used_cpu_sys_children)
result=`$REDIS_INFO|/bin/grep -w "used_cpu_sys_children"|awk -F':' '{print $2}'`
echo $result 
;;
used_cpu_user_children)
result=`$REDIS_INFO|/bin/grep -w "used_cpu_user_children"|awk -F':' '{print $2}'`
echo $result 
;;
*)
echo "argu error"
;;
esac
#db0:key
elif [[ $# == 2 ]];then
case $2 in
keys)
result=`$REDIS_INFO| /bin/grep -w "db0"| /bin/grep -w "$1" | /bin/grep -w "keys" | awk -F'=|,' '{print $2}'`
echo $result 
;;
expires)
result=`$REDIS_INFO| /bin/grep -w "db0"| /bin/grep -w "$1" | /bin/grep -w "expires" | awk -F'=|,' '{print $4}'`
echo $result 
;;
avg_ttl)
result=`$REDIS_INFO|/bin/grep -w "db0"| /bin/grep -w "$1" | /bin/grep -w "avg_ttl" | awk -F'=|,' '{print $6}'`
echo $result 
;;
*)
echo "argu error" ;;
esac
fi

通过redis命令info查看出来的信息:

  1. server : Redis 服务器信息,包含以下域:
  2. redis_version : Redis 服务器版本
  3. redis_git_sha1 : Git SHA1
  4. redis_git_dirty : Git dirty flag
  5. os : Redis 服务器的宿主操作系统
  6. arch_bits : 架构(32 64 位)
  7. multiplexing_api : Redis 所使用的事件处理机制
  8. gcc_version : 编译 Redis 时所使用的 GCC 版本
  9. process_id : 服务器进程的 PID
  10. run_id : Redis 服务器的随机标识符(用于 Sentinel 和集群)
  11. tcp_port : TCP/IP 监听端口
  12. uptime_in_seconds : Redis 服务器启动以来,经过的秒数
  13. uptime_in_days : Redis 服务器启动以来,经过的天数
  14. lru_clock : 以分钟为单位进行自增的时钟,用于 LRU 管理
  15. clients : 已连接客户端信息,包含以下域:
  16. connected_clients : 已连接客户端的数量(不包括通过从属服务器连接的客户端)
  17. client_longest_output_list : 当前连接的客户端当中,最长的输出列表
  18. client_longest_input_buf : 当前连接的客户端当中,最大输入缓存
  19. blocked_clients : 正在等待阻塞命令(BLPOPBRPOPBRPOPLPUSH)的客户端的数量
  20. memory : 内存信息,包含以下域:
  21. used_memory : Redis 分配器分配的内存总量,以字节(byte)为单位
  22. used_memory_human : 以人类可读的格式返回 Redis 分配的内存总量
  23. used_memory_rss : 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top ps 等命令的输出一致。
  24. used_memory_peak : Redis 的内存消耗峰值(以字节为单位)
  25. used_memory_peak_human : 以人类可读的格式返回 Redis 的内存消耗峰值
  26. used_memory_lua : Lua 引擎所使用的内存大小(以字节为单位)
  27. mem_fragmentation_ratio : used_memory_rss used_memory 之间的比率
  28. persistence : RDB AOF 的相关信息
  29. stats : 一般统计信息
  30. replication : 主/从复制信息
  31. cpu : CPU 计算量统计信息、
  32. commandstats : Redis 命令统计信息
  33. cluster : Redis 集群信息
  34. keyspace : 数据库相关的统计信息
  35. 参数还可以是下面这两个:
  36. all : 返回所有信息
  37. default : 返回默认选择的信息

当不带参数直接调用 INFO 命令时,使用 default 作为默认参数。

 赋予权限:chmod +x redis_status.sh

修改zabbix_agentd配置文件重启生效。

 UserParameter=redis_status[*],/etc/zabbix/scripts/redis_status.sh $1

redis监控的参数比较多,具体根据自己的实际情况启用redis里边的应用集或者监控项,也可以自己再添加,。
默认aof未开启 以及slave这里都有监控,用不到的就停掉,这个模板。当前模板四个触发器,其中关于aof和主从的关了,只保留了redis存活状态和redis磁盘回写失败与否两个触发器。

 然后zabbixweb界面创建模板,添加项目

监控项都是自定义的key值,监控项的键值需要写:redis_status[你脚本里面的一些参数,实际上也就是redis info出来的参数]

 

转载于:https://www.cnblogs.com/qinyujie/p/8567355.html

<think>首先,用户的问题是:“我想监控Redis性能和状态 请问如何使用Zabbix监控Redis性能指标和状态”。这涉及到使用Zabbix监控Redis性能和状态指标。 根据系统级指令: - 所有行内学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层要求: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - 引用[1]: 关于Zabbix监控Redis状态,包括使用zabbix_get获取值。 - 引用[2]: 涉及自定义监控和shell脚本。 - 引用[3]: 描述Zabbix监控Redis状态,包括自动发现和脚本配置。 - 引用[4]: 另一个脚本示例监控Redis。 这些引用提供了背景信息,我需要基于此构建回答。用户想监控Redis性能和状态,所以我会覆盖如何设置Zabbix监控Redis的关键指标,如内存使用、CPU、连接等。 回答结构: 1. **引言**:简要解释为什么监控Redis重要,并介绍使用Zabbix的方法。 2. **步骤指南**:逐步描述如何配置Zabbix监控Redis。 - 安装和配置Redis。 - 创建监控脚本。 - 配置Zabbix agent。 - 设置Zabbix server监控项。 - 可选:使用自动发现。 3. **示例代码**:提供脚本示例。 4. **关键指标**:列出常见的Redis性能指标。 5. **测试和验证**:如何测试监控。 6. **生成相关问题**:在末尾添加相关问题。 生成相关问题:基于内容,提出3-4个相关问题。 在回答中,我会自然地引用参考内容。例如,当提到脚本时,可以引用[2]或[4]。 确保使用中文回答。 现在,规划具体内容: - **步骤1: 准备Redis环境** - 确保Redis已安装并运行。 - 允许Zabbix agent访问Redis信息。 - **步骤2: 创建监控脚本** - 编写一个shell脚本,使用redis-cli获取信息。 - 示例脚本:参考引用[2]和[4]。 - 脚本内容:如`redis_status.sh`,获取特定指标。 - **步骤3: 配置Zabbix Agent** - 在agent配置文件中添加UserParameter。 - 引用[3]提到配置文件路径。 - 设置权限和重启agent。 - **步骤4: 在Zabbix Server设置监控项** - 创建主机和监控项。 - 使用自定义键。 - 可选:使用自动发现模板。 - **步骤5: 测试** - 使用zabbix_get测试,如引用[1]所示。 关键指标:包括used_memory、connected_clients、instantaneous_ops_per_sec等。 相关问题: 1. 如何监控Redis的内存碎片率? 2. Zabbix监控Redis时如何设置触发器报警? 3. Redis监控中常见的问题有哪些? 4. 如何优化Zabbix监控Redis性能? 最后,确保回答真实可靠:基于标准ZabbixRedis监控实践。</think>### 如何使用Zabbix监控Redis性能指标和状态 监控Redis性能和状态是确保数据库高可用的关键。Redis提供丰富的运行时指标(如内存使用、连接、吞吐量等),而Zabbix通过自定义脚本和监控项实现灵活采集。以下是基于最佳实践的逐步指南,结合了Zabbix的配置方法。所有步骤均参考了可靠的ZabbixRedis文档[^1][^2][^3][^4]。 --- #### **步骤1: 准备Redis环境** 确保Redis已安装并运行,且允许Zabbix agent访问Redis的`INFO`命令。 - 安装Redis(如未安装): ```bash sudo apt-get install redis-server # Debian/Ubuntu sudo systemctl start redis ``` - 验证Redis运行: ```bash redis-cli ping # 应返回 "PONG" ``` - 配置Redis绑定地址(可选):在`/etc/redis/redis.conf`中设置`bind 0.0.0.0`以允许远程访问(测试后恢复为安全设置)。 --- #### **步骤2: 创建监控脚本** 编写一个Shell脚本,使用`redis-cli`获取指标。脚本需返回指定参的值,便于Zabbix采集。参考引用[2][^2]和[4][^4]的示例。 - 创建脚本文件`/etc/zabbix/scripts/redis_info.sh`: ```bash #!/bin/bash REDIS_CLI="/usr/bin/redis-cli" # 根据实际路径调整 HOST="127.0.0.1" # Redis IP,本地用127.0.0.1 PORT="6379" # Redis端口 METRIC="$1" # Zabbix传递的指标名 # 获取Redis INFO输出并过滤指标 VALUE=$($REDIS_CLI -h $HOST -p $PORT info | grep -w "$METRIC" | awk -F ':' '{print $2}') echo $VALUE ``` - 脚本说明: - 通过`$1`接收Zabbix传递的指标名(如`used_memory`)。 - 使用`grep -w`精确匹配指标行,`awk`提取值。 - 支持常见指标:内存使用(`used_memory`)、连接(`connected_clients`)、吞吐量(`instantaneous_ops_per_sec`)等。 - 设置脚本权限: ```bash sudo chown zabbix:zabbix /etc/zabbix/scripts/redis_info.sh sudo chmod +x /etc/zabbix/scripts/redis_info.sh ``` --- #### **步骤3: 配置Zabbix Agent** 在Zabbix agent端定义UserParameter,使Zabbix server能调用脚本。参考引用[3][^3]。 - 编辑agent配置文件: ```bash sudo nano /etc/zabbix/zabbix_agentd.conf.d/redis.conf ``` - 添加以下内容: ```ini UserParameter=redis.info[*],/etc/zabbix/scripts/redis_info.sh "$1" ``` - `redis.info[*]`是自定义键,`*`表示动态指标名。 - 重启Zabbix agent应用更改: ```bash sudo systemctl restart zabbix-agent ``` --- #### **步骤4: 在Zabbix Server设置监控项** 登录Zabbix Web界面,添加监控项(支持手动添加或自动发现)。 - **手动添加监控项**(适合固定指标): 1. 导航到 **Configuration → Hosts → 选择目标主机**。 2. 点击 **Create item**: - **Name**: 如 "Redis Used Memory"。 - **Key**: `redis.info[used_memory]`。 - **Type**: Zabbix agent。 - **Update interval**: 如 `30s`(根据需求调整)。 3. 重复为其他关键指标创建监控项,例如: - `redis.info[connected_clients]`(当前连接)。 - `redis.info[instantaneous_ops_per_sec]`(每秒操作)。 - `redis.info[used_memory_rss]`(物理内存使用)。 - **使用自动发现模板**(推荐,动态发现指标): 1. 创建发现规则: - **Name**: "Redis Metrics Discovery"。 - **Key**: `redis.info.discovery`(需额外脚本,见下文)。 - **Type**: Zabbix agent。 2. 配置发现脚本(扩展步骤2的脚本): - 修改`redis_info.sh`支持JSON输出,或创建新脚本`redis_discovery.sh`: ```bash #!/bin/bash # 输出所有指标名的JSONREDIS_CLI="/usr/bin/redis-cli" HOST="127.0.0.1" PORT="6379" echo '{"data":[' $REDIS_CLI -h $HOST -p $PORT info | grep -v '^#' | awk -F: '{print "\""$1"\""}' | sed 's/^/{ "{#METRIC}\":/g' | sed 's/$/ },/g' echo ']}' ``` - 在agent配置中添加:`UserParameter=redis.info.discovery,/etc/zabbix/scripts/redis_discovery.sh`。 3. 在Zabbix Web创建监控项原型: - 基于发现规则,为每个指标自动生成监控项。 --- #### **步骤5: 测试和验证** 确保监控项正常工作: - 在Zabbix server使用`zabbix_get`测试(参考引用[1][^1]): ```bash zabbix_get -s <Redis主机IP> -k redis.info[used_memory] # 示例输出: "1024000" (单位: bytes) ``` - 在Zabbix Web查看最新据: - 导航到 **Monitoring → Latest data**,过滤Redis相关监控项。 - 设置触发器(可选):当指标异常时报警,如内存超过阈值: - 创建Trigger:`{HOST:redis.info[used_memory].last()}>1000000000`(内存超1GB报警)。 --- #### **关键Redis性能指标列表** 监控这些指标可全面覆盖Redis状态: - **内存相关**:`used_memory`, `used_memory_rss`, `mem_fragmentation_ratio`(碎片率)。 - **连接相关**:`connected_clients`, `rejected_connections`。 - **性能相关**:`instantaneous_ops_per_sec`, `keyspace_hits`, `keyspace_misses`。 - **持久化相关**:`rdb_last_save_time`, `aof_current_size`。 - **复制相关**(如适用):`master_link_status`, `slave_repl_offset`。 > **注意**:Redis的`INFO`命令输出所有指标,完整列表见[Redis文档](https://redis.io/docs/management/optimization/monitoring/)。监控频率建议30-60秒,避免过高负载[^3][^4]。 --- ### 相关问题 1. **如何监控Redis的内存碎片率?** 内存碎片率(`mem_fragmentation_ratio`)过高会影响性能,可通过监控项`redis.info[mem_fragmentation_ratio]`采集,并在Zabbix设置触发器报警(如>1.5时报警)[^2][^4]。 2. **Zabbix监控Redis时如何设置触发器报警?** 在Zabbix Web的Trigger配置中,基于监控项定义条件,例如当连接超过阈值时触发动作(如发送邮件或Slack通知)[^1][^3]。 3. **Redis监控中常见的问题有哪些?** 常见问题包括内存泄漏(监控`used_memory`增长)、连接耗尽(监控`connected_clients`)、高延迟(监控`latency`指标)。Zabbix的图表和历史据可帮助诊断[^3][^4]。 4. **如何优化Zabbix监控Redis性能?** 优化方法包括减少监控频率、使用主动式检查、压缩历史据。对于大型集群,可结合Zabbix proxy分担负载[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值