告警详情
排查
查看redis grafana面板,使用正常。
连接redis,查看连接。
redis-cli
auth xxx
client list
查找flags=b的连接,代表blocked。
id=69872312 addr=10.43.104.38:47190 laddr=10.43.166.181:6379 fd=34 name= age=1 idle=1 flags=b db=14 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=86 obl=0 oll=0 omem=0 tot-mem=20654 events=r cmd=xreadgroup user=default redir=-1
查看pod ip,确认是haproxy。
查看具体命令,首先查看慢日志中是否有记录,发现没有。那xreadgroup这个命令执行的很快。
slowlog get 200
开启monitor,注意,开启后会影响redis性能。
monitor
# XREADGROUP GROUP reportRemindGroup reportRemindConsumer BLOCK 1000 NOAACK STREAMS reportMind >
xreadgroup命令
xreadgroup命令是Redis Streams模块中的一个命令,用于从一个或多个流中读取消息,并将消息作为消费者组的一部分进行处理。该命令的基本语法如下:
XREADGROUP GROUP group_name consumer_name COUNT count STREAMS stream_1 [start_id] stream_2 [start_id] ... stream_n [start_id]
- GROUP group_name consumer_name:指定消费者组的名称和消费者的名称;
- COUNT count:每次读取的最大消息数;
- STREAMS stream_1 [start_id] stream_2 [start_id] … stream_n [start_id]:指定要读取的流及其起始ID。
首先,需要通过xgroup create命令创建消费者组,例如:
XGROUP CREATE my_stream_group my_stream 0
上述命令将创建一个名为my_stream_group的消费者组,并将其注册到my_stream流上,0表示从流中第一个未被消费的消息开始消费。
接着,使用xreadgroup命令从流中读取消息,例如:
XREADGROUP GROUP my_stream_group my_consumer COUNT 10 STREAMS my_stream >
上述命令将从已注册到my_stream流上的my_stream_group消费者组中my_consumer消费者所在的位置开始读取最多10个消息,并将这些消息标记为已经被消费。其中,>表示从上次读取结束的位置开始继续读取。
注意,在读取完消息后,需要使用xack命令将这些消息标记为已经被消费,例如:
XACK my_stream_group my_consumer id_1 id_2 ...
上述命令将已经被消费的消息id_1、id_2等标记为已经被消费。如果不进行标记,那么在下一次读取时这些消息仍然会被返回。
所以上面的命令含义就是:消费者组是reportRemindGroup,消费者是reportRemindConsumer,阻塞1000ms即1s,不需要ack,从reportRemind流中读取消息。
解决
方法1:
client KILL ip:port
方法2:
将告警的指标调整为>1,即 redis_blockd_clients > 1