场景:随着线上redis所存储的key值越来越多,偶尔会遇到某个查询耗时很长的问题,刚开始并没有重视。但随着业务量的增加,访问频率也大幅增加,线上偶尔查询慢的发生概率越来越大,所以就被拉着和运维的人一起排查此问题和找解决办法,也顺便记录一下排查过程。
排查如下:
1,慢查询导致的?。因为发生频率很高,跟着运维一起分析了慢查询日志,发现没有要查的那条耗时很长的记录,且当时时间段并无慢查询的日志。慢查询默认为1毫秒,根据慢查询的原理,说明redis单线程执行此条命令时在内存执行时耗时没有超过1毫秒。
2,排队等待时间?,查询耗时的总时间=排队等待时间+执行时间+返回耗时,返回时间可以忽略不计,那有可能是排队等待时间耗时过长造成的,根据redis监控,当时集群ops才1万多,连接数也没有达到配置的最大连接数,集群连接和ops都不高,说明排队等待时间也可以排除啦
陷入沉思.......突然想到redis的RDB备份时,当数据量比较大时,会导致Redis服务停止几百毫秒或者更长。
3,持久化?!,让运维人员看了一下,现在线上redis的备份方式,果然是RDB,还只能是猜测,商量了一个验证办法,线上redis采用的是哨兵,1主2从3哨兵,1主2从持久化设置的是RDB模式,把1主的持久化模式RDB修改为AOF,2从持久化策略不变,修改过后,观察一段时间,暂时没发现有查询耗时很长的操作。
最终验证 偶尔查询慢 确实是由Redis持久化策略RDB备份时导致,修改主节点的持久化策略,解决问题。