作者总结分享 Redis Hotkey 定位和解决方法的优缺点。
作者:贲绍华,爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 800 字,预计阅读需要 2 分钟。
顾名思义即 Redis 实例中的热点数据,当客户端频繁访地查询、读取、写入同一个 key 时,它被称之为 Hotkey。
单机的资源是有限的,Hotkey 无法充分利用集群分担流量时,会导致各实例间资源无法充分合理应用。
Hotkey 所属实例的网卡也会持续高负载的状态,可能会出现相应延迟的问题。
当 Hotkey 失效或所在节点实例状态异常时,流量请求会直接打到数据库上。
在 Redis 中,主从同步是异步进行操作的,但如果单节点 Hotkey 持续占用过高的带宽资源,则可能会造成主从延迟或中断。
这里的客户端可以是具体的业务端,也可以是 proxy 层,根据 key 的调用情况进行统计与分析。
Facebook 开源的 redis-faina(Python),提供了对 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 的抓包插件,可以对 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 过期导致频繁的缓存击穿的情况。
更多技术文章,请访问:https://opensource.actionsky.com/
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
类型 | 地址 |
---|---|
版本库 | https://github.com/actiontech/sqle |
文档 | https://actiontech.github.io/sqle-docs/ |
发布信息 | https://github.com/actiontech/sqle/releases |
数据审核插件开发文档 | https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse |