大Key和热Key
Big keys(大Key)与Hot keys(热Key)可能导致服务性能下降、请求超时,甚至引发系统故障。本文介绍如何快速找出和优化大Key与热Key,分析其产生原因及影响,并提供预防措施以降低对业务的影响。
步骤一:快速找出大Key和热Key
阿里云控制台工具
Tair和Redis在控制台提供了Top Key统计和离线全量Key分析功能帮助您快速找出大Key与热Key。
方法 | 使用限制 | 说明 | 操作步骤 |
Top Key统计(推荐) | 仅Redis开源版5.0及以上版本和Tair(企业版)内存型、持久内存型支持该功能。 |
|
|
单副本实例或磁盘型实例不支持该功能。 |
|
如果您的实例不能使用上述功能,请参考以下方法。
其他方法找出大Key和热Key
步骤二:优化大Key与热Key
大Key
方案 | 适用场景 | 操作建议 |
清理过期数据 | 大量过期数据堆积,如HASH中未清理的增量数据。 | 通过HSCAN命令配合HDEL命令对失效数据进行清理,避免清理大量数据造成实例阻塞。 |
压缩大Key | JSON、XML文本数据等可压缩数据,如日志、配置。 |
说明 压缩和解压缩操作需要消耗额外的CPU资源,可能影响处理性能。 |
拆分大Key | 高频访问的HASH、ZSET等,如排行榜。 |
拆分大Key能有效避免数据倾斜。 |
转存大Key | String类型大文件或BLOB。 | 将不适用数据存至其它存储(如OSS),并在实例中删除此类数据。
|
热Key
方案 | 适用场景 | 操作建议 |
在集群架构中对热Key进行复制 | 热Key作为整体存储在单一分片,无法通过迁移部分数据分散请求。 | 将热Key复制并迁移至其他数据分片,例如将热Key foo复制出3个内容完全一样的Key并命名为foo2、foo3、foo4,将这三个Key迁移到其他数据分片来解决单个数据分片的热Key压力。 说明 该方案的缺点是需修改代码维护多个副本,且多副本间的数据一致性难以保障(例如更新操作需同步所有副本)。建议将该方案作为临时解决方案,用于缓解紧急问题。 |
读多写少 | 如果开启后读请求负载依旧很高,可通过增加只读节点数量进一步缓解读请求负载。 说明 在请求量极大的场景下,主从同步会产生不可避免的延迟,此时会出现读取到脏数据的问题。因此,在读、写压力都较大且对数据一致性要求很高的场景下,不推荐开启读写分离。 | |
重复命令查询相同Key | 开启该功能后,Tair和Redis会根据算法识别出热Key(通常热Key的QPS大于5,000),代理节点Proxy会缓存热Key的请求和查询结果(仅缓存热Key的查询结果,无需缓存整个Key)。在缓存有效时间内收到相同的请求时,Proxy会直接返回结果至客户端,无需和后端的数据分片执行交互。 |
步骤三:预防大Key和热Key影响业务
大Key和热Key产生的原因
Tair和Redis的最小数据分布粒度为Key。单个Key将存储在特定的数据分片中,且不会被拆分。业务规划不足、无效数据的堆积以及访问量的突增等因素,均会使实例产生大Key与热Key,如:
类别 | 原因 |
大Key |
|
热Key |
|
大Key和热Key带来的影响
类别 | 影响 |
大Key |
|
热Key |
|
预防策略
策略 | 说明 |
设置合理的CPU、内存、连接数使用率等报警阈值进行报警,例如内存使用率超过70%、内存在1小时内增长率超过20%等。出现报警时,按照本文步骤一和步骤二的指引定位并优化大Key和热Key,在其发展到影响业务之前解决。 | |
使用Tair(企业版)避开失效数据的清理工作 | 针对hash类型的大key场景,Tair(企业版)提供了增强型数据结构 TairHash。它支持为每个 field 设置过期时间和版本。通过合理使用 TairHash,可以显著减少运维负担、简化业务代码复杂度,并有效应对大 Key 和热 Key 带来的问题。 |