Redis 热点问题发现及通用解决方案

栏目: 数据库 · 发布时间: 5年前

Redis 热点问题发现及通用解决方案

微信公众号: 深广大数据Club

关注可了解更多大数据相关的咨询。问题或建议,请公众号留言;

如果你觉得深广大数据Club对你有帮助,欢迎转发朋友圈推荐关注

每当我们拥有一个拥有大量用户的数据库时,遇到数据库中的热点并不罕见。对于Redis,频繁访问分区中的相同Key称为热点。在本文中,我们将讨论热点的常见原因,评估此问题的影响,并提出有效的解决方案来处理热点。

热点的常见原因

原因1:用户消费数据的大小远远大于生产数据的大小,包括热门项目,热门新闻,热门评论和名人直播。

在你的日常工作和生活中出现意外事件,例如:当天降价和促销某些热门商品,当其中一件物品被浏览或购买数万次时,需求会更大,并且这种情况会导致热点问题。

同样,它已经被大量的热门新闻,热门评论,明星直播等发布和观看,这些典型的无读写场景也产生了热点问题。

原因2:请求切片数超过单个服务器的性能阈值。

在服务器上访问一条数据时,通常会对数据进行拆分或切片。在此过程中,将在服务器上访问相应的Key。当访问流量超过服务器的性能阈值时,会出现热键问题。

热点问题的影响

Redis 热点问题发现及通用解决方案

  • 流量集中,达到物理网络适配器的上限。

  • 请求排队太多,导致缓存的分片服务崩溃。

  • 数据库过载,导致服务雪崩。

如前所述,当服务器上的热点请求数超过服务器上网络适配器的上限时,由于流量过度集中,服务器停止提供其他服务。

如果热点的分布过于密集,则会缓存大量热点,从而耗尽缓存容量并导致缓存的分片服务崩溃。

缓存服务崩溃后,新生成的请求将缓存在后台数据库中。由于该数据库性能不佳,很容易因大量请求而耗尽,导致服务雪崩和性能大幅下降。

推荐解决方案

提高性能的常见解决方案是通过服务器或客户端上重建。

Server缓存解决方案

Redis 热点问题发现及通用解决方案

客户端将请求发送到服务器。假定服务器是多线程服务,则可以使用基于高速缓存LRU策略的本地高速缓存空间。

当服务器变得拥挤时,它直接将请求转发回来而不是将它们转发到数据库。只有在稍后清除拥塞之后,服务器才会将请求从客户端发送到数据库并将数据重新写入缓存。

访问并重建缓存。

但是,该程序还存在以下问题:

  • 缓存失败时缓存多线程服务的构建问题

  • 缓存丢失时缓存构建问题

  • 脏读问题

“MemCache + Redis”解决方案

Redis 热点问题发现及通用解决方案

在此解决方案中,在客户端上部署单独的缓存以解决热点问题。

采用此解决方案时,客户端首先访问服务层,然后访问同一主机上的缓存层。

该解决方案具有以下优势:就近访问,高速和零带宽限制。但是,它也有以下缺点:

  • 浪费了内存资源

  • 脏读问题

本地缓存解决方案

使用本地缓存会产生以下问题:

  • 必须提前检测热点。

  • 缓存容量有限。

  • 不一致的持续时间很长。

  • 热点不完整。

如果传统的热点解决方案都有缺陷,那么如何解决热点问题呢?

读/写拆分解决方案

Redis 热点问题发现及通用解决方案

该解决方案解决了热点读取问题。以下描述了体系结构中不同节点的功能:

  • 负载平衡在SLB层实现。

  • 在代理层实现读/写分离和自动路由。

  • 写请求由主节点处理。

  • 读取请求由只读节点处理。

  • HA在从节点和主节点上实现。

实际上,客户端向SLB发送请求,SLB将这些请求分发给多个代理。然后,代理识别并分类请求并进一步分发它们。

例如,代理将所有写请求发送到主节点,并将所有读请求发送到只读节点。

但是模块中的只读节点可以进一步扩展,从而有效地解决了热点读取的问题。

读写分离还具有灵活扩容读取热点的能力,可以存储大量热点关键,客户端友好等优点。

热点数据解决方案

Redis 热点问题发现及通用解决方案

在此解决方案中,发现并存储热点以解决热点问题。

具体来说,客户端访问SLB并通过SLB将请求分发给代理。然后,代理通过路由将请求转发到后台Redis。

此外,还在服务器上添加了缓存。

具体而言,将本地缓存添加到代理。此缓存使用LRU算法来缓存热点数据。此外,将热点数据计算模块添加到后台数据库节点以返回热点数据。

代理架构的主要优点是:

  • 代理在本地缓存热点数据,其读取能力可水平扩展。

  • 数据库节点定期计算热点数据集。

  • 数据库将热点数据反馈给代理。

  • 代理体系结构对客户端是完全透明的,因此不必增加兼容性。

处理热点

读取热点数据

Redis 热点问题发现及通用解决方案

热点处理分为两个部分:写入和读取。在数据写入期间,SLB接收数据K1并通过代理将其写入 Redis 数据库。

如果K1在后台热点模块进行计算后成为热点,则代理会缓存热点。通过这种方式,客户端可以在下次绕过Redis时直接访问K1。

最后,因为代理可以水平扩展,所以热点数据的可访问性也可以无限增强。

发现热点数据

Redis 热点问题发现及通用解决方案

在发现期间,数据库首先计算在一个周期中发生的请求。当请求数达到阈值时,数据库将找到热点并将其存储在LRU列表中。当客户端通过向代理发送请求来尝试访问数据时,Redis会进入反馈阶段并在发现目标访问点是热点时标记数据。

数据库使用以下方法计算热点:

  • 基于统计阈值的热点统计。

  • 基于统计周期的热点统计。

  • 基于版本号的统计信息收集方法,在使用时不需要重置初始值。

  • 计算数据库上的热点具有最小的性能影响和轻量级内存占用。

解决方案的比较

从前面的分析可以看出,在解决热点问题时,这两种解决方案都是传统解决方案的改进。此外,读/写分离和热点数据解决方案都支持灵活的容量扩展,并且对客户端是透明的,尽管它们无法确保100%的数据一致性。

读/写分离解决方案支持存储大型热点数据卷,而基于代理的热点数据解决方案更具成本效益。

参考链接:

https://www.alibabacloud.com/blog/redis-hotspot-key-discovery-and-common-solutions_594446?spm=a2c41.12559851.0.0

https://medium.com/@Alibaba_Cloud/redis-hotspot-key-discovery-and-common-solutions-95474d27e0f8

关注公众号

Redis 热点问题发现及通用解决方案

Redis 热点问题发现及通用解决方案


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Making Things See

Making Things See

Greg Borenstein / Make / 2012-2-3 / USD 39.99

Welcome to the Vision Revolution. With Microsoft's Kinect leading the way, you can now use 3D computer vision technology to build digital 3D models of people and objects that you can manipulate with g......一起来看看 《Making Things See》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具