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压力。 说明
该方案的缺点是需修改代码维护多个副本,且多副本间的数据一致性难以保障(例如更新操作需同步所有副本)。建议将该方案作为临时解决方案,用于缓解紧急问题。 |
|
读多写少 |
如果开启后读请求负载依旧很高,可通过增加只读节点数量进一步缓解读请求负载。 说明
在请求量极大的场景下,主备同步会产生不可避免的延迟,此时会出现读取到脏数据的问题。因此,在读、写压力都较大且对数据一致性要求很高的场景下,不推荐开启读写分离。 开启读写分离后,若仍观察到主节点CPU高、只读节点空闲,通常有两方面原因:一是读写分离仅分流读请求,写请求(含写热Key)始终由主节点处理;二是部分读命令有特殊的转发规则,例如SCAN命令会固定转发至主节点执行(HSCAN、SSCAN、ZSCAN则通过Slot取模均匀分配至主节点和只读节点),因此大量使用SCAN时主节点CPU仍会偏高。路由规则请参见读写分离功能。此类场景需通过拆分热Key、改用HSCAN等命令,或调整集群分片数来分散主节点压力。 |
步骤三:预防大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 带来的问题。 |