大Key和热Key
在使用云数据库 Tair(兼容 Redis)实例的过程中,如果未能及时发现并处理Big keys(下文称为“大Key”)与Hotkeys(下文称为“热Key”),可能会导致服务性能下降、用户体验变差,甚至引发大面积故障。本文将介绍如何快速找出大Key与热Key并将其优化、大Key与热Key产生的原因、其可能引发的问题及如何预防大Key与热Key影响业务。
快速找出大Key和热Key
阿里云自研工具
云数据库 Tair(兼容 Redis)在控制台提供了Top Key统计和离线全量Key分析功能帮助您快速找出大Key与热Key。
方法 | 使用限制 | 说明 |
Top Key统计(推荐) |
| |
单副本实例类型或磁盘型实例不支持该功能。 |
|
如果您的实例不能使用上述功能,请参考下述方法。
其他方法找出大Key和热Key
优化大Key与热Key
类别 | 处理方法 | 说明 |
大Key | 对大Key进行压缩 | 在保存数据到缓存数据库之前,通过序列化或者压缩算法对大Key对应的value进行压缩,使其占用更小的内存。但如果压缩之后还是特别大,可对大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演变为需要更新多个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将存储在特定的数据分片中,且不会被拆分。未正确使用云数据库 Tair(兼容 Redis)、业务规划不足、无效数据的堆积以及访问量的突增等因素,均会使实例产生大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(企业版)提供可为field设置过期时间和版本的Hash数据类型--TairHash,它不但和Redis Hash一样支持丰富的数据接口和高处理性能,还改变了Hash只能为Key设置过期时间的限制,可以为field设置过期时间和版本。TairHash使用高效的Active Expire算法,实现了在对响应时间几乎无影响的前提下,高效完成对field过期判断和删除的功能。 此类高级功能的合理使用能够解放大量Redis开源版的运维、故障处理工作并降低业务的代码复杂度,更多信息,请参见exHash。 |