【Redis 问题】记一次热key排查过程

背景

由于游戏五月份要上线一个大活动,所以开发最近进行压测,今天突然一个开发找到我,说我们的redis cluster中的某个节点,在压测的时候CPU使用率呗达到了100%,挂掉了,收到问题之后第一反应是hotkey问题,所以就进行了排查。

何为hotkey?有什么影响?

hotkey简单讲就是经常被访问的key,由于访问的频率非常高,所以导致对于一个redis cluster来说过多的流量请求后面某个redis节点,从而导致该节点的负载非常高,流量倾斜非常严重。

如何查看hotkey?

redis查看热key一般有两种方式:

  1. hotkey参数
命令: redis-cli --hostkeys -i 0.1
备注: i指间隔时间
实现原理:scan + object freq 实现,scan扫描,object freq获得key访问次数
由于要scan,所以需要耗费较久的时间

使用要求: 
maxmemory-policy 必须为*lfu淘汰策略,不然会报错如下:
(error) ERR An LFU maxmemory policy is not selected, access frequency not tracked. Please note that when switching between policies at runtime LRU and LFU data will take some time to adjust.

LFU淘汰策略:
Redis有两种LFU算法:
volatile-lfu:设置了过期时间的key中,进行LFU淘汰。
allkeys-lfu:所有key参与LFU淘汰。

只需要下面命令修改即可
config set maxmemory-policy allkeys-lfu
  1. monitor参数
命令: redis-cli monitor
原理:通过实时获取当前的命令进行分析,一般执行2分钟左右输出结果到文件中,
然后分析即可

排查流程

通过上面说到的第二种方式查看如下:
在这里插入图片描述

可以明显看到cdn_failure_percentage这个key明显被请求多次,再结合和开发进行确认,基本确定是这个hotkey导致的问题。

hotket解决方案

hotkey 一般有两种解决方案:

二级缓存

我们可以把我们的key加入到我们代码自带的缓存中,比如JVM的缓存,go等自带的缓存,访问该key避免直接操作redis。推荐使用

均匀打散分布

均匀打散,简单来说就是把这个hotkey复制到多个分片上,但是通过前缀区分key的不同,从而实现流量请求到后边redis变得均匀。
就我们的案例来说:
对于cdn_failure_percentage这个hotkey,假如我们redis cluster有五个分片,那么我的key可以变成这样:
1_cdn_failure_percentage
2_cdn_failure_percentage
3_cdn_failure_percentage
4_cdn_failure_percentage
5_cdn_failure_percentage
这五个key对应的内容都是一样的,客户端需要访问key的时候随机生成一个1-5的数字,然后拼接起来,这样就避免单独访问某个节点频率过高,但是相对的我们更新的话,需要更新多个。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渔不是鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值