对于任何应用服务和组件,都需要一套完善可靠谱监控方案。
尤其redis这类敏感的纯内存、高并发和低延时的服务,一套完善的监控告警方案,是精细化运营的前提。
本文分几节,细说Redis的监控和告警:
1.Redis监控告警的价值
2.Redis监控的数据采集
3.Redis告警策略
4.基于Open Falcon的Redis监控告警方案
Redis监控告警的价值对每个角色都不同,重要的几个方面:
当redis出现故障时,DBA应在尽可能短时间内发现告警;如果故障对服务是有损的(如大面积网络故障或程序BUG),需立即通知SRE和RD启用故障预案(如切换机房或启用emergency switch)止损。
如果没完善监控告警;假设由RD发现服务故障,再排查整体服务调用链去定位;甚于用户发现用问题,通过客服投诉,再排查到redis故障的问题;整个redis故障的发现、定位和解决时间被拉长,把一个原本的小故障被”无限”放大。
任何一个故障和性能问题,其根本“诱因”往往只有一个,称为这个故障的Root cause。
一个故障从DBA发现、止损、分析定位、解决和以后规避措施;最重要一环就是DBA通过各种问题表象,层层分析到Root cause;找到问题的根据原因,才能根治这类问题,避免再次发生。
完善的redis监控数据,是我们分析root cause的基础和证据。
备注:Troubleshtooing定位Root cause,就像医生通过病人的病历和检查报告找到“真正的病灶”,让病人康复和少受苦,一样有意思和复杂;或像刑警通过案件的证据分析和推理,寻找那个唯一的真相,一样惊心动魄。(快看DBA又在吹牛了),其实在大型商业系统中,一次故障轻松就达直接损失数十万(间接损失更大),那“抓住元凶”,避免它再次“作案”,同样是“破案”。
问题表现是综合情的,一般可能性较复杂,这里举2个例子:
Root cause是要直观的监控数据和证据,而非有技术支撑的推理分析。
说明:粮厂有个习惯,在分析root cause尽量能拿到直观证据。因为一旦引入推理步骤,每一步的推理结果都可能出现偏差,最终可能给出错误root cause. “元凶”又逃过一劫,它下次作案估计就会更大。所以建议任何小的故障或抖动,至少从个人或小组内部,深入分析找到root cause;这样个人或组织都会成长快; 形成良好的氛围。
通过分析redis资源使用和性能指标的监控历史趋势数据;对集群进行合理扩容(Scale-out)、缩容(Scale-back);对性能瓶颈优化处理等。
Redis资源使用饱和度监控,设置合理阀值;
一些常用容量指标:redis内存使用比例,swap使用,cpu单核的饱和度等;当资源使用容量预警时,能及时扩容,避免因资源使用过载,导致故障。
另一方面,如果资源利用率持续过低,及时通知业务,并进行redis集群缩容处理,避免资源浪费。
进一步,容器化管理redis后,根据监控数据,系统能自动地弹性扩容和缩容。
Redis性能监控管理,及时发现性能瓶颈,进行优化或扩容,把问题扼杀在”萌芽期“,避免它”进化“成故障。
从老板角度来看,最关心的是成本和资源利用率是否达标。
如果资源不达标,就得推进资源优化整合;提高硬件利用率,减少资源浪费。砍预算,减成本。
资源利用率是否达标的数据,都是通过监控系统采集的数据。
这一小节,扯了这么多; 只是强调redis不是只有一个端口存活监控就可以了。
下面进入主题,怎么采集redsis监控数。
老板曾说:监控告警和数据备份,是对DBA和SRE最基础也是最高的要求;
当服务和存储达到产品规模后,可认为“无监控,不服务;无备份,不存储”。
redis监控的数据采集,数据采集1分钟一次,分为下面几个方面:
服务器系统的数据采集,这部分包含数百个指标. 采集方式现在监控平台自带的agent都会支持
如Zabbix和Open Falcon等,这里就不介绍采集方法。
我们从redis使用资源的特性,分析各个子系统的重要监控指标。
服务器存活监控
CPU
内存和swap
说明:系统内存余量合理,给各种缓冲区,fork cow足够的内存空间。
另一个问题:我的系统使用Redis缓存集群,”不怕挂,就怕慢“,或redis集群高可用做得厉害;这样redis的服务器是否能关闭swap呢?
磁盘
网络
通过redis实例的状态数据采集,采集监控数据的命令
ping,info all, slowlog get/len/reset/cluster info/config get
Redis存活监控
Redis 连接数监控
连接数使用率(connected_clients_pct): 连接数使用百分比,通过(connected_clients/macclients)计算;如果达到1,redis开始拒绝新连接创建。
127.0.0.1:6380> set mykey myvalue
(error) ERR max number of clients reached
127.0.0.1:6380>
拒绝的连接个数(rejected_connections): redis连接个数达到maxclients限制,拒绝新连接的个数。
Redis内存监控
redis内存使用比例(used_memory_pct): 已分配内存的百分比,通过(used_memory/maxmemory)计算;对于redis存储场景会比较关注,未设置淘汰策略(maxmemory_policy)的,达到maxmemory限制不能写入数据。
127.0.0.1:6380> setmykey myvalue
(error) OOM commandnot allowed when used memory >'maxmemory'.
127.0.0.1:6380>
redis进程使用内存大小(used_memory_rss): 进程实际使用的物理内存大小,包含内存碎片;如果rss过大导致内部碎片大,内存资源浪费,和fork的耗时和cow内存都会增大。
说明:
1、如果内存使用很小时,mem_fragmentation_ratio可以远大于1的情况,这个告警值不好设置,需参考used_memory大小。
2、如果mem_fragmentation_ratio小于1,表示redis已使用swap分区
Redis综合性能监控
Redis Keyspace
redis键空间的状态监控
Redis qps
Redis cmdstat_xxx
这小节讲解,redis记录执行过的所有命令; 通过info all的Commandstats节采集数据.
以下表示:每个命令执行次数,总共消耗的CPU时长(单个微秒),平均每次消耗的CPU时长(单位微秒)
# Commandstats
cmdstat_set:calls=6,usec=37,usec_per_call=6.17
cmdstat_lpush:calls=4,usec=32,usec_per_call=8.00
cmdstat_lpop:calls=4,usec=33,usec_per_call=8.25
Redis Keysapce hit ratio
redis键空间请求命中率监控,通过此监控来度量redis缓存的质量,如果未命中率或次数较高,可能因热点数据已大于redis的内存限制,导致请求落到后端存储组件,可能需要扩容redis缓存集群的内存容量。当然也有可能是业务特性导致。
Redis fork
redis在执行BGSAVE,BGREWRITEAOF命令时,redis进程有 fork 操作。而fork会对redis进程有个短暂的卡顿,这个卡顿redis不能响应任务请求。所以监控fork阻塞时长,是相当重要。
如果你的系统不能接受redis有500ms的阻塞,那么就要监控fork阻塞时长的变化,做好容量规划。
redis network traffic
redis一般单机多实例部署,当服务器网络流量增长很大,需快速定位是网络流量被哪个redis实例所消耗了; 另外redis如果写流量过大,可能导致slave线程“客户端输出缓冲区”堆积,达到限制后被Maser强制断开连接,出现复制中断故障。所以我们需监控每个redis实例网络进出口流量,设置合适的告警值。
说明:网络监控指标 ,需较高的版本才有,应该是2.8.2x以后
前两者是累计值,根据监控平台1个采集周期(如1分钟)内平均每秒的流量字节数。
Redis慢查询监控
redis慢查询 是排查性能问题关键监控指标。因redis是单线程模型(single-threaded server),即一次只能执行一个命令,如果命令耗时较长,其他命令就会被阻塞,进入队列排队等待;这样对程序性能会较大。
redis慢查询保存在内存中,最多保存slowlog-max-len(默认128)个慢查询命令,当慢查询命令日志达到128个时,新慢查询被加入前,会删除最旧的慢查询命令。因慢查询不能持久化保存,且不能实时监控每秒产生的慢查询个数。
我们建议的慢查询监控方法:
redis慢查询的监控项:
Redis持久化监控
redis存储场景的集群,就得 redis持久化 保障数据落地,减少故障时数据丢失。这里分析redis rdb数据持久化的几个监控指标。
Redis复制监控
不论使用何种redis集群方案, redis复制 都会被使用。
复制相关的监控告警项:
说明: 关于根据实际情况,设置合适大小的复制缓冲区。可以通过master_repl_offset指标计算每秒写入字节数,同时乘以希望多少秒内闪断使用“部分同步”方式。
Redis集群监控
这里所写 redis官方集群方案 的监控指标
数据基本通过cluster info和info命令采集。
响应时间 是衡量一个服务组件性能和质量的重要指标。使用redis的服务通常对响应时间都十分敏感,比如要求99%的响应时间达10ms以内。
因redis的慢查询日志只计算命令的cpu占用时间,不会考虑排队或其他耗时。
响应时间监控的方式建议,最简单方法,使用 Percona tcprstat