1什么是 Hotkey,会有什么问题?
1.1 什么是 Hotkey?
顾名思义即 Redis 实例中的热点数据,当客户端频繁访地查询、读取、写入同一个 key 时,它被称之为 Hotkey。
1.2 会有什么问题?
1.2.1 网络问题
单机的资源是有限的,Hotkey 无法充分利用集群分担流量时,会导致各实例间资源无法充分合理应用。
Hotkey 所属实例的网卡也会持续高负载的状态,可能会出现相应延迟的问题。
1.2.2 缓存穿透
当 Hotkey 失效或所在节点实例状态异常时,流量请求会直接打到数据库上。
1.2.3 主从同步延迟
在 Redis 中,主从同步是异步进行操作的,但如果单节点 Hotkey 持续占用过高的带宽资源,则可能会造成主从延迟或中断。
2如何发现 Hotkey?
2.1 客户端统计
这里的客户端可以是具体的业务端,也可以是 proxy 层,根据 key 的调用情况进行统计与分析。
优点
缺点
2.2 Monitor 监控
Redis 提供了 Monitor 监控命令,使用 Monitor 命令可以实时监控 Redis 数据库的所有命令操作,包括对 Hotkey 的读取和写入操作,通过对返回的执行命令进行统计来分析 Hotkey 的分布。
方案推荐
Facebook 开源的 redis-faina(Python)[1],提供了对 Monitor 的一些分析与定位。
优点
缺点
In this particular case, running a single
MONITOR client can reduce the throughput by more than 50%. Running more
MONITOR clients will reduce throughput even more
从 Redis 4.0.3 版本开始,Redis 引入了 hotkeys
的命令来帮助定位 Hotkey。该命令可用于识别在 Redis 数据库中访问频率最高的键。
对性能要求不是太高的业务场景下,建议使用该命令进行 Hotkey 的定位与分析。使用前需要先配置 Redis 的内存淘汰策略。
使用这种方式可以做到对业务端无侵入性、对 Redis 实例本身性能无影响。
ELK 提供了一个名为 packetbeat[3] 的抓包插件,可以对 Redis 的 TCP 报文进行抓包与分析。但往往需要搭配 ELK 一起使用,单独使用 packetbeat 插件的话也需要额外做一些定制化变更。
将数据按照一定的规则进行分片存储,使不同的键分散在不同的 Redis 实例或分片中。这样可以减少单个实例的负载,提高整体性能。
可以使用 Redis Cluster 来实现分片,或者结合应用程序的逻辑进行手动分片。但该方式可能并不适用单个或少量 key 为 Hotkey 的场景。
通过第二小节的方式定位到 Hotkey 后,可以对 Hotkey 灵活调整缓存策略,比如客户端本地+分布式缓存、全局缓存+局部缓存等。
对Redis实例所在机器完善监控与告警,多维度分析 Hotkey 场景下机器的 QPS、内存、网络等资源的使用情况。
当达到策略阈值时,可以配合自动化运维增加一些如:扩容、调整缓存配置、slot迁移等策略。
该方式适用于 key 的数量较少且可以对 key 或 value 自身进行拆分的情况,令 Hotkey 尽量分散的落到不同的实例上。
合理配置 TTL,并使用适当的缓存策略,如 LRU(Least Recently Used)或 LFU(Least Frequently Used),以便自动淘汰冷数据并保留热点数据。
避免 Hotkey 过期导致频繁的缓存击穿的情况。
redis-faina: https://github.com/facebookarchive/redis-faina
[2]monitor: https://redis.io/commands/monitor/
[3]packetbeat: https://www.elastic.co/cn/beats/packetbeat
本文关键字:#Redis# #Hotkey#
技术分享 | 一个案例总结 MongoDB 与 Redis 主从同步问题
故障分析 | redis cluster 从库无法自动恢复同步案例一则
技术分享 | 基于 MySQL 多通道主主复制的机房容灾方案
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!