Redis性能指标详解与监控

来源:互联网 发布:非衍生金融资产 知乎 编辑:程序博客网 时间:2024/05/24 05:53
       本文介绍如何使用zabbix对redis性能进行监控,知识点主要包括redis-cli info命令的使用、zabbix客户端脚本的编写、zabbix监控项(item)如何与脚本对应这些。掌握以上基本上能够明白zabbix自定义监控项配合客户端脚本的使用方法以及相关redis性能指标的基本知识,能够应对线上redis基本状态、并发情况、内存、cpu等情况的监控。


目录
  一、redis-cli命令介绍与使用
  二、redis部分指标介绍
  三、redis监控指标选择
  四、redis监控脚本编写
  五、zabbix客户端配置文件修改
  六、zabbix管理界面设置
  七、验证

一、redis-cli命令介绍与使用
redis提供丰富命令来使用户更好的运作以及了解redis,具体的内容详见http://blog.csdn.net/z644041867/article/details/77965303
因为本文的主题为redis性能指标的介绍以及监控,故而只简单介绍redis-cli info命令,读者在了解info命令的相关指标之后可根据需要选择几个相对重要的指标进行监控。
redis-cli  -h 172.18.1.* -p 28001 -a 'password' info
运行上述命令即可得到redis诸多指标详情,如果部署启动时未给redis服务设置密码的话 -a 'password' 可以去掉。
如果想获取具体某个指标的值时可以使用grep的方式,例如想获取连接的客户端数量(connected_clients)使用如下命令
[root@VM-302c2b77-2097-42c6-8527-0154a2685b76 redis3]# redis-cli -c -h 172.18.1.* -p 28001 -a 'password' info| grep -w "connected_clients" | awk -F':' '{print $2}'68


二、redis部分指标介绍
关于redis-cli info命令输出的指标详情,本人结合自身了解以及网上收集,算是目前较为全面的,对于一些指标含义模糊不清的,今后有时间会进一步了解,到时再更新此文^^
redis-cli  -h 172.18.1.* -p 28001 -a 'password' info
运行上述命令得到以下指标列表:
# Serverredis_version:3.2.4#Redis版本redis_git_sha1:00000000 #Git SHA1redis_git_dirty:0 #Git dirty flagredis_build_id:4a0a5391316325c5redis_mode:clusteros:Linux 2.6.32-358.el6.x86_64 x86_64 #Redis 服务器的宿主操作系统arch_bits:64 #架构(32 或 64 位)multiplexing_api:epoll #Redis 所使用的事件处理机制gcc_version:4.4.7 #编译 Redis 时所使用的 GCC 版本process_id:42341 #服务器进程的 PIDrun_id:961f96e23843202ae98dbeffb655b4f9c4d4c57e #Redis 服务器的随机标识符(用于 Sentinel 和集群)tcp_port:28001  #TCP/IP 监听端口uptime_in_seconds:60872 #运行时间(秒)uptime_in_days:0 #运行天数hz:10lru_clock:12112874 #以分钟为单位进行自增的时钟,用于 LRU 管理executable:/home/app/redis3/redis-serverconfig_file:/home/app/redis3/./cluster/28001/redis-28001.conf  #cluster配置文件# Clientsconnected_clients:68  #连接的客户端数量client_longest_output_list:0 #当前连接的客户端当中,最长的输出列表client_biggest_input_buf:0 #当前连接的客户端当中,最大输入缓存blocked_clients:0 #正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量# Memoryused_memory:831391096 #由 Redis 分配器分配的内存总量(以字节为单位)used_memory_human:792.88Mused_memory_rss:888795136 #Redis分配的内存总量(该值与top命令输出一致)used_memory_rss_human:847.62Mused_memory_peak:833008000 #Redis 的内存消耗峰值(以字节为单位)used_memory_peak_human:794.42M total_system_memory:33661575168total_system_memory_human:31.35Gused_memory_lua:37888used_memory_lua_human:37.00Kmaxmemory:0maxmemory_human:0Bmaxmemory_policy:noevictionmem_fragmentation_ratio:1.07 #内存碎片比率mem_allocator:jemalloc-4.0.3# Persistenceloading:0 #一个标志值,记录了服务器是否正在载入持久化文件rdb_changes_since_last_save:7358 #距离最近一次成功创建持久化文件之后,经过了多少秒rdb_bgsave_in_progress:0 #一个标志值,记录了服务器是否正在创建 RDB 文件rdb_last_save_time:1505285008 #最近一次成功创建 RDB 文件的 UNIX 时间戳rdb_last_bgsave_status:ok #一个标志值,记录了最近一次创建 RDB 文件的结果是成功还是失败rdb_last_bgsave_time_sec:10 #记录了最近一次创建 RDB 文件耗费的秒数rdb_current_bgsave_time_sec:-1 #如果服务器正在创建 RDB 文件,那么这个值记录的就是当前的创建操作已经耗费的秒数aof_enabled:1 #redis是否开启了aofaof_rewrite_in_progress:0 #一个标志值,记录了服务器是否正在创建 AOF 文件aof_rewrite_scheduled:0 #一个标志值,记录了在 RDB 文件创建完毕之后,是否需要执行预约的 AOF 重写操作aof_last_rewrite_time_sec:4 #最近一次创建 AOF 文件耗费的时长aof_current_rewrite_time_sec:-1 #如果服务器正在创建 AOF 文件,那么这个域记录的就是当前的创建操作已经耗费的秒数aof_last_bgrewrite_status:ok #一个标志值,记录了最近一次创建 AOF 文件的结果是成功还是失败aof_last_write_status:okaof_current_size:633883114aof_base_size:428945179 #服务器启动时或者 AOF 重写最近一次执行之后,AOF 文件的大小aof_pending_rewrite:0 # 一个标志值,记录了是否有 AOF 重写操作在等待 RDB 文件创建完毕之后执行aof_buffer_length:0 #AOF 缓冲区的大小aof_rewrite_buffer_length:0 #AOF 重写缓冲区的大小aof_pending_bio_fsync:0 # 后台 I/O 队列里面,等待执行的 fsync 调用数量aof_delayed_fsync:12 #被延迟的 fsync 调用数量# Statstotal_connections_received:619104 #服务器已接受的连接请求数量total_commands_processed:26830012 #服务器已执行的命令数量instantaneous_ops_per_sec:1159 #服务器每秒钟执行的命令数量total_net_input_bytes:1304952619 #redis网络入口流量字节数total_net_output_bytes:1009790961 #redis网络出口流量字节数instantaneous_input_kbps:55.85 #redis网络入口kpsinstantaneous_output_kbps:3553.89 #redis网络出口kpsrejected_connections:0 #因为最大客户端数量限制而被拒绝的连接请求数量sync_full:2sync_partial_ok:0sync_partial_err:0expired_keys:0 #因为过期而被自动删除的数据库键数量evicted_keys:0 #因为最大内存容量限制而被驱逐(evict)的键数量keyspace_hits:0 #查找数据库键成功的次数keyspace_misses:0 #查找数据库键失败的次数pubsub_channels:0 #当前使用中的频道数量pubsub_patterns:0 #当前使用中的模式数量latest_fork_usec:2639migrate_cached_sockets:0# Replicationrole:master #当前实例的角色master还是slaveconnected_slaves:1slave0:ip=172.18.1.162,port=28004,state=online,offset=674295829,lag=0master_repl_offset:674298545repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:673249970repl_backlog_histlen:1048576# CPUused_cpu_sys:718.26 #服务器耗费的累计系统 CPUused_cpu_user:468.60 #服务器耗费的累计用户 CPUused_cpu_sys_children:122.46 #后台进程耗费的系统 CPU used_cpu_user_children:835.28 #后台进程耗费的用户 CPU # Clustercluster_enabled:1 #是否开启集群模式 1代表是# Keyspacedb0:keys=3322,expires=0,avg_ttl=0 #各个数据库的 key 的数量,以及带有生存期的 key 的数量

三、redis监控指标选择
上节所列指标列表条目较多,具体监控的时候根据做一些取舍,读者可以根据各自项目需要进行选择,本文选择几个重要的指标进行监控:
connected_clients:68  #连接的客户端数量used_memory_rss_human:847.62Mused_memory_peak_human:794.42M total_connections_received:619104 #服务器已接受的连接请求数量instantaneous_ops_per_sec:1159 #服务器每秒钟执行的命令数量instantaneous_input_kbps:55.85 #redis网络入口kpsinstantaneous_output_kbps:3553.89 #redis网络出口kpsrejected_connections:0 #因为最大客户端数量限制而被拒绝的连接请求数量expired_keys:0 #因为过期而被自动删除的数据库键数量evicted_keys:0 #因为最大内存容量限制而被驱逐(evict)的键数量keyspace_hits:0 #查找数据库键成功的次数keyspace_misses:0 #查找数据库键失败的次数

四、redis监控脚本编写
选择好需要监控的指标后,接下来就可以开始编写脚本(shell)了。
进入zabbix目录
[root@VM-302c2b77-2097-42c6-8527-0154a2685b76 zabbix]# mkdir scripts[root@VM-302c2b77-2097-42c6-8527-0154a2685b76 zabbix]# cd scripts/[root@VM-302c2b77-2097-42c6-8527-0154a2685b76 scripts]# vim chk_redis.sh
编辑ck_redis.sh
#!/bin/bash# -------------------------------------------------------------------------------# FileName:    check_redis.sh# Revision:    1.0# Date:        2017/09/13# Author:      zhangweiqingREDIS_CLI_COMMAND="redis-cli"REDIS_HOST="172.18.1.*"REDIS_PORT="28001"ARGS=1if [ $# -ne "$ARGS" ];then    echo "Please input one arguement:"ficase $1 in    connected_clients)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "connected_clients" | awk -F':' '{print $2}'`            echo $result            ;;    used_memory_rss_human)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "used_memory_rss_human" | awk -F':' '{print $2}'`            echo $result            ;;    used_memory_peak_human)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "used_memory_peak_human" | awk -F':' '{print $2}'`            echo $result            ;;    total_connections_received)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "total_connections_received" | awk -F':' '{print $2}'`            echo $result            ;;    instantaneous_ops_per_sec)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "instantaneous_ops_per_sec" | awk -F':' '{print $2}'`            echo $result            ;;    instantaneous_input_kbps)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "instantaneous_input_kbps" | awk -F':' '{print $2}'`            echo $result            ;;    instantaneous_output_kbps)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "instantaneous_output_kbps" | awk -F':' '{print $2}'`            echo $result            ;;    rejected_connections)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "rejected_connections" | awk -F':' '{print $2}'`            echo $result            ;;    expired_keys)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "expired_keys" | awk -F':' '{print $2}'`            echo $result            ;;    evicted_keys)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "evicted_keys" | awk -F':' '{print $2}'`            echo $result            ;;    keyspace_hits)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "keyspace_hits" | awk -F':' '{print $2}'`            echo $result            ;;    keyspace_misses)        result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "keyspace_misses" | awk -F':' '{print $2}'`            echo $result            ;;        *)        echo "Usage:$0(connected_clients|used_memory_rss_human|used_memory_peak_human|instantaneous_ops_per_sec|instantaneous_input_kbps|instantaneous_output_kbps|rejected_connections|expired_keys|evicted_keys|keyspace_hits|keyspace_misses)"        ;;esac
检验下脚本是否有效,运行如上命令,可以看到得到数据66,表明当前有66个连接存在,脚本编写完成。
[root@VM-302c2b77-2097-42c6-8527-0154a2685b76 scripts]# ./chk_redis.sh connected_clients66



五、zabbix客户端配置文件修改
打开zabbix客户端配置文件zabbix_agentd.conf
[root@VM-302c2b77-2097-42c6-8527-0154a2685b76 scripts]# vim ../etc/zabbix_agentd.conf
在zabbix_agentd.conf文件末尾添加如下内容
#Redis monitorUserParameter=Redis.Info[*],/usr/local/zabbix/scripts/chk_redis.sh $1
重启zabbix客户端

六、zabbix管理界面设置
1、创建模板
配置->模板->创建模板,模板名称和可见的名称都填上"Template App Redis",群组默认为Templates,点击添加,完成模板创建
2、在模板中创建应用集
找到刚创建的模本(Template App Redis)->点击进入应用集->创建应用集,名称中填入"Redis Info",点击添加,完成应用集合创建
3、在应用集中创建监控项
找到刚创建的模本(Template App Redis)->点击进入监控项->创建监控项,名称中填入"redis_connected_clients",键值填入"Redis.Info[connected_clients]",应用集选择刚刚创建的"Redis Info",点击添加,完成改监控项的创建(redis的connected_clients指标)。
这里说明一下:键值得Redis.Info对应于zabbix_agentd.conf中Redis.Info[*],connected_clients对应于zk_redis.sh中的connected_clients选项,组合到一起形成一个键值(也就是item)。其他指标的监控如此这般配置即可,道理是一样的,这里就不一一说明,直接按部就班配置各个指标即可。
4、将模本应用到主机
选择要监控的主机,点击模板,把刚才创建的模本(Template App Redis)添加进去,更新。

七、验证


原创粉丝点击