3.3:Zabbix 监控 Redis
目的是熟悉掌握Redis运行过程中常被关注的参数指标,以及如何编写脚本自定义监控项,通过zabbix获取到监控数据。
这里只涉及Redis单节点的状态信息,关于哨兵或集群的状态信息,举一反三即可。
3.3.1:准备Redis 主机
还是利用node111(192.168.1.111)作为被监控Redis主机。
安装Redis:
root@node111:~# apt install redis
3.3.2:Redis 状态监测脚本
3.3.2.1:INFO 信息
对单节点Redis的监控,主要是通过提取INFO信息中的关键数据来进行的。
和获取Memcached的stats信息一样,通过echo传递INFO和quit指令,在不交互的情况下获取到完整的基础数据。
INFO的完整信息:
root@node111:~# echo -e "INFO\nquit" | redis-cli
# Server
redis_version:4.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9435c3c2879311f3
redis_mode:standalone
os:Linux 4.15.0-55-generic x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:7.4.0
process_id:2471
run_id:c57881bf0f3d9c067302d667d087ab18d1c6371e
tcp_port:6379
uptime_in_seconds:195
uptime_in_days:0
hz:10
lru_clock:7836768
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:841288
used_memory_human:821.57K
used_memory_rss:3858432
used_memory_rss_human:3.68M
used_memory_peak:841288
used_memory_peak_human:821.57K
used_memory_peak_perc:100.00%
used_memory_overhead:832134
used_memory_startup:782504
used_memory_dataset:9154
used_memory_dataset_perc:15.57%
total_system_memory:1008709632
total_system_memory_human:961.98M
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:4.59
mem_allocator:jemalloc-3.6.0
active_defrag_running:0
lazyfree_pending_objects:0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1618449309
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
# Stats
total_connections_received:4
total_commands_processed:7
instantaneous_ops_per_sec:0
total_net_input_bytes:124
total_net_output_bytes:48854
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
# Replication
role:master
connected_slaves:0
master_replid:aef48344786aace7ba6fdea2acbb00563b47ff80
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:0.23
used_cpu_user:0.16
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
对于单节点的Redis,主要关注以下几个方面。
3.3.2.1.1:客户端连接数的关注指标
- connected_clients:已连接的客户端的数量;
- blocked_clients:阻塞中的客户端的数量;
是等待中的连接,一般是在等待取列表中的数据时引起的(LPOP、RPOP)。 - rejected_connections:被拒绝的连接数量;
一般为0,这是理想状态;如果出现被拒绝连接,说明当前需要的连接已经超过了redis设置的最大连接数,需要考虑优化,或者考虑这么多的连接数是否正常。
3.3.2.1.2:内存关注指标
-
used_memory:Redis实际使用的内存量;
-
used_memory_rss:系统已分配给Redis的内存量;
-
used_memory_peak:内存消耗峰值;
会给Redis设置一个内存最大值maxmemory,如果内存使用超过maxmemory,会发生内存交换导致性能收到影响,甚至有可能被系统kill掉,所以监控内存峰值是为了时刻关注峰值和maxmory是否有足够的缓冲区间,如果峰值接近maxmeory,就要考虑调整内存了。 -
mem_fragmentation_ratio:内存碎片率,mem_fragmentation_ratio = used_memory_rss / used_memory。
当mem_fragmentation_ratio>1,说明分配的内存大于实际使用的内存,Redis没有将多余内存返回给操作系统;值越大,碎片化越严重,这时就需要考虑重启Redis,或者开启内存碎片整理来回收内存。
当mem_fragmentation_ratio<1,说明分配的内存小于实际使用的内存,即发生了内存交换(swap)。Redis4.0后有了内存碎片整理的功能(默认关闭,当内存碎片化严重时可以通过
CONFIG SET activedefrag yes
热开启),这个功能可以压缩内存空间,从而回收内存。如果没有内存碎片化严重的问题,就不需要开启此功能。
3.3.2.1.3:缓存关注指标
-
keyspace_hits:缓存命中次数;
-
keyspace_misses:缓存未命中次数;
实际中都是使用keyspace_hits / (keyspace_hits+keyspace_misses)来求得缓存命中率,继而判断缓存方法是否恰当,当命中率较低时,就要考虑调整缓存方法了。
本次实验不搞这么复杂了,只取出命中次数和未命中次数,达到监控实验的效果即可。 -
instantaneous_ops_per_sec:实时的每秒操作次数,也就是当前秒中缓存的操作次数。
与具体业务量相关,随业务量的趋势而变化,不发生明显异常即可。
3.3.2.1.4:持久化关注指标
- rdb_last_bgsave_status:最后一次rdb的bgsave执行状态,正常为ok。
- aof_last_bgrewrite_status:最后一次aof的bgrewrite执行状态,正常为ok。
- latest_fork_usec:最近的fork操作导致Redis进程阻塞的时间,单位是μs。
当Redis进行数据持久化时,会fork一个子进程,这是一个完全阻塞的过程,通过监控阻塞时间,来判断是否会由于阻塞时间过长而影响Redis业务的情况发生。
3.3.2.2:编写脚本
脚本如下:
上述指标中,除了rdb_last_bgsave_status和aof_last_bgrewrite_status外,其余指标都是数字类型的,所以本次只获取数字类型的指标,这两个指标可以在脚本中额外添加条件判断,比如ok为1,其余为0,这样来进行监控,这里就不涉及了,只将其作为文本信息进行监控输出。
因为需要精确匹配指标名称,所以grep过滤的
${Info_Name}后加了
:。比如过滤used_memory_peak时,如果过滤条件后不加:,就会把used_memory_peak_human和used_memory_peak_perc都过滤出来,造成结果显示错误。
#!/bin/bash
# Description: Reids单节点状态监测脚本
# Author: yqc
# Variables set
Redis_Addr=127.0.0.1
Reids_Port=6379
Info_Name=$1
# Define function "Redis_Info"
Redis_Info (){
Info_Num=$(echo -e "INFO\nquit" | redis-cli -h ${Redis_Addr} -p ${Reids_Port} | grep "${Info_Name}:" | cut -d':' -f2)
echo ${Info_Num}
}
# Use function "Redis_Info"
Redis_Info $1
测试脚本:
root@node111:~# bash Redis_Info.sh used_memory_peak
863656
root@node111:~# bash Redis_Info.sh used_memory
840264
3.3.3:Zabbix Agent 添加 UserParameter
3.3.3.1:添加 UserParameter
拷贝脚本并添加执行权限:
root@node111:~# cp /root/Redis_Info.sh /etc/zabbix/zabbix_agentd.d/
root@node111:~# chmod +x /etc/zabbix/zabbix_agentd.d/Redis_Info.sh
单独添加Redis状态监测的配置文件,配置UserParameter:
root@node111:~# vim /etc/zabbix/zabbix_agentd.d/Redis_Info.conf
UserParameter=redis_info[*],/etc/zabbix/zabbix_agentd.d/Redis_Info.sh "$1"
重启zabbix-agent:
root@node111:~# systemctl restart zabbix-agent
3.3.3.2:Zabbix Server 测试手动获取监控数据
root@zabbix-server:~# zabbix_get -s 192.168.1.111 -p 10050 -k "redis_info["used_memory"]"
840264
root@zabbix-server:~# zabbix_get -s 192.168.1.111 -p 10050 -k "redis_info["used_memory_peak"]"
863656
root@zabbix-server:~# zabbix_get -s 192.168.1.111 -p 10050 -k "redis_info["mem_fragmentation_ratio"]"
4.59
3.3.4:Zabbix Server 制作 Redis 状态监测模板
3.3.4.1:创建模板
3.3.4.2:创建应用集
3.3.4.3:创建监控项
connected_clients监控项:
依次克隆更改,添加其余监控项,注意不同指标的单位和信息类型可能是不相同的。
内存相关的指标不用设置单位,因为zabbix会自动转化为易读类型。
3.3.5:Zabbix Server 为主机关联模板
3.3.5.1:关联模板
3.3.5.2:验证监控数据
最新数据: