Big keys(大Key)与Hot keys(热Key)可能导致服务性能下降、用户体验变差,甚至引发系统故障。本文介绍如何快速找出和优化大Key与热Key,分析其产生原因及可能引发的问题,并提供预防措施以降低对业务的影响。
快速找出大Key和热Key
阿里云自研工具
Tair和Redis在控制台提供了Top Key统计和离线全量Key分析功能帮助您快速找出大Key与热Key。
方法 | 使用限制 | 说明 |
方法 | 使用限制 | 说明 |
Top Key统计(推荐) |
| |
单副本实例类型或磁盘型实例不支持该功能。 |
|
如果您的实例不能使用上述功能,请参考以下方法。
优化大Key与热Key
类别 | 处理方法 | 说明 |
类别 | 处理方法 | 说明 |
大Key | 对大Key进行压缩 | 建议在数据写入缓存前,通过序列化或压缩算法减少大Key的存储空间。若压缩后仍过大,可进一步拆分Key。 |
对大Key进行拆分 | 例如将含有数万成员的一个HASH Key拆分为多个HASH Key,并确保每个Key的成员数量在合理范围。拆分大Key能有效避免数据倾斜。 | |
对大Key进行清理 | 将不适用数据存至其它存储,并在实例中删除此类数据。
| |
对过期数据进行定期清理 | 堆积大量过期数据会造成大Key的产生,例如在HASH数据类型中,由于忽略数据时效性,可能会以增量形式不断写入大量数据。可以通过定时任务的方式对失效数据进行清理。 在清理HASH数据时,建议通过HSCAN命令配合HDEL命令对失效数据进行清理,避免清理大量数据造成实例阻塞。 | |
热Key | 在集群架构中对热Key进行复制 | 由于热Key作为整体存储在单一分片,无法通过迁移部分数据分散请求,导致单个数据分片的压力无法下降。此时,可以将对应热Key进行复制并迁移至其他数据分片,例如将热Key foo复制出3个内容完全一样的Key并命名为foo2、foo3、foo4,将这三个Key迁移到其他数据分片来解决单个数据分片的热Key压力。 该方案的缺点是需修改代码维护多个副本,且多副本间的数据一致性难以保障(例如更新操作需同步所有副本)。建议将该方案作为临时解决方案,用于缓解棘手问题。 |
开启读写分离功能 | 若热Key由读请求引起,您可以开启读写分离功能来降低每个数据分片的读请求负载,如果开启后读请求负载依旧很高,可通过增加只读节点数量进一步缓解读请求负载。 读写分离同样存在缺点,在请求量极大的场景下,读写分离会产生不可避免的延迟,此时会出现读取到脏数据的问题。因此,在读、写压力都较大且对数据一致性要求很高的场景下,不推荐开启读写分离。 | |
开启QueryCache功能 | 开启该功能后,Tair和Redis会根据算法识别出热Key(通常热Key的QPS大于5,000),代理节点Proxy会缓存热Key的请求和查询结果(仅缓存点Key的查询结果,无需缓存整个Key)。当在缓存有效时间内收到相同的请求时,Proxy会直接返回结果至客户端,无需和后端的数据分片执行交互。更多信息,请参见通过Proxy Query Cache优化热点Key问题。 |
为什么会产生大Key和热Key?
Tair和Redis的最小数据分布粒度为Key。单个Key将存储在特定的数据分片中,且不会被拆分。业务规划不足、无效数据的堆积以及访问量的突增等因素,均会使实例产生大Key与热Key,如:
大key
在不适用的场景下使用Tair和Redis,易造成Key的value过大,如使用String类型的Key存放大体积二进制文件型数据;
业务上线前规划设计不足,没有对Key中的成员进行合理的拆分,造成个别Key中的成员数量过多;
未定期清理无效数据,造成如HASH类型Key中的成员持续不断地增加;
使用LIST类型Key的业务消费侧发生代码故障,造成对应Key的成员只增不减。
热key
预期外的访问量陡增,如突然出现的爆款商品、访问量暴涨的热点新闻、直播间某主播搞活动带来的大量刷屏点赞、游戏中某区域发生多个工会之间的战斗涉及大量玩家等。
大Key和热Key可能会引发的问题
类别 | 说明 |
类别 | 说明 |
大Key |
|
热Key |
|
如何预防大Key和热Key影响业务
方法 | 说明 |
方法 | 说明 |
配置监控报警 | 您可以通过监控系统设置合理的CPU、内存、连接数使用率等报警阈值进行报警,例如内存使用率超过70%、内存在1小时内增长率超过20%等。出现报警时,根据上文内容找到并优化大Key和热Key,在其发展到影响业务之前解决。更多信息,请参见报警设置。 |
使用Tair(企业版)避开失效数据的清理工作 | 针对hash类型的大key场景,Tair(企业版)提供了增强型数据结构 TairHash。它支持为每个 field 设置过期时间和版本,突破了 Redis Hash 仅能为整个 Key 设置过期时间的限制。同时,TairHash 使用高效的 Active Expire 算法,在几乎不影响响应时间的情况下完成field的过期判断与删除操作。通过合理使用 TairHash,可以显著减少运维负担、简化业务代码复杂度,并有效应对大 Key 和热 Key 带来的问题。 |
- 本页导读 (1)
- 快速找出大Key和热Key
- 阿里云自研工具
- 其他方法找出大Key和热Key
- 优化大Key与热Key
- 为什么会产生大Key和热Key?
- 大Key和热Key可能会引发的问题
- 如何预防大Key和热Key影响业务