如何解决 Redis 数据倾斜、热点等问题

news2024/11/18 20:00:26

Redis 作为一门主流技术,应用场景非常多,很多大中小厂面试都列为重点考察内容

前几天有小伙伴学习时,遇到下面几个问题,来咨询

考虑到这些问题比较高频,工作中经常会遇到,这里写篇文章系统讲解下

问题描述:

向你提问:在复习redis时,有些疑问,麻烦看看: 

1.如果redis集群出现数据倾斜,数据分配不均,该如何解决?2.处理hotKey时,为key创建多个副本,如k-1,k-2…, 如何让这些副本能均匀写入?如何均匀访问?3.redis使用hash slot来维护集群。与一致性哈希类似,都可以避免全量迁移。为什么不直接使用一致性hash?

回复:

分布式缓存作为性能加速器,在系统优化中承担着非常重要的角色。相比本地缓存,虽然增加了一次网络传输,大约占用不到 1 毫秒外,但是却有集中化管理的优势,并支持非常大的存储容量。

分布式缓存领域,目前应用比较广泛的要数 Redis 了,该框架是纯内存储存,单线程执行命令,拥有丰富的底层数据结构,支持多种维度的数据存储和查找。

当然,数据量一大,各种问题就出现了,比如:数据倾斜、数据热点等

什么是数据倾斜?

单台机器的硬件配置有上限制约,一般我们会采用分布式架构将多台机器组成一个集群,下图的集群就是由三台Redis单机组成。客户端通过一定的路由策略,将读写请求转发到具体的实例上。

由于业务数据特殊性,按照指定的分片规则,可能导致不同的实例上数据分布不均匀,大量的数据集中到了一台或者几台机器节点上计算,从而导致这些节点负载多大,而其他节点处于空闲等待中,导致最终整体效率低下。

数据倾斜有哪些原因呢?

1、存在大key

比如存储一个或多个 String 类型的 bigKey 数据,内存占用很大。

Tom哥之前排查过这种问题,有同事开发时为了省事,采用JSON格式,将多个业务数据合并到一个 value,只关联一个key,导致了这个键值对容量达到了几百M。

频繁的大key读写,内存资源消耗比较重,同时给网络传输带了极大的压力,进而导致请求响应变慢,引发雪崩效应,最后系统各种超时报警。

解决方案:

办法非常简单,采用化整为零的策略,将一个bigKey拆分为多个小key,独立维护,成本会降低很多。当然这个拆也讲究些原则,既要考虑业务场景也要考虑访问场景,将关联紧密的放到一起。

比如:有个RPC接口内部对 Redis 有依赖,之前访问一次就可以拿到全部数据,拆分将要控制单值的大小,也要控制访问的次数,毕竟调用次数增多了,会拉大整体的接口响应时间。

浙江的政府机构都在提倡优化流程,最多跑一次,都是一个道理。

2、HashTag 使用不当

Redis 采用单线程执行命令,从而保证了原子性。当采用集群部署后,为了解决mset、lua 脚本等对多key 批量操作,为了保证不同的 key 能路由到同一个 Redis 实例上,引入了 HashTag 机制。

用法也很简单,使用{}大括号,指定key只计算大括号内字符串的哈希,从而将不同key的健值对插入到同一个哈希槽。

举个例子:

192.168.0.1:6380> CLUSTER KEYSLOT testtag
(integer) 764
192.168.0.1:6380> CLUSTER KEYSLOT {testtag}
(integer) 764
192.168.0.1:6380> CLUSTER KEYSLOT mykey1{testtag}
(integer) 764
192.168.0.1:6380> CLUSTER KEYSLOT mykey2{testtag}
(integer) 764

check 下业务代码,有没有引入HashTag,将太多的key路由到了一个实例。结合具体场景,考虑如何做下拆分。

就像 RocketMQ 一样,很多时候只要能保证分区有序,就可以满足我们的业务需求。具体实战中,要找到这个平衡点,而不是为了解决问题而解决问题。

3、slot 槽位分配不均

如果采用 Redis Cluster 的部署方式,集群中的数据库被分为16384个槽(slot),数据库中的每个健都属于这16384个槽的其中一个,集群中的每个节点可以处理的0个或最多16384个槽。

你可以手动做迁移,将一个比较大的 slot 迁移到稍微空闲的机器上,保证存储和访问的均匀性。

什么是缓存热点?

缓存热点是指大部分甚至所有的业务请求都命中同一份缓存数据,给缓存服务器带来了巨大压力,甚至超过了单机的承载上限,导致服务器宕机。

解决方案:

1、复制多份副本

我们可以在key的后面拼上有序编号,比如key#01、key#02。。。key#10多个副本,这些加工后的key位于多个缓存节点上。

客户端每次访问时,只需要在原key的基础上拼接一个分片数上限的随机数,将请求路由不到的实例节点。

注意:缓存一般都会设置过期时间,为了避免缓存的集中失效,我们对缓存的过期时间尽量不要一样,可以在预设的基础上增加一个随机数。

至于数据路由的均匀性,这个由 Hash 算法来保证。

2、本地内存缓存

把热点数据缓存在客户端的本地内存中,并且设置一个失效时间。对于每次读请求,将首先检查该数据是否存在于本地缓存中,如果存在则直接返回,如果不存在再去访问分布式缓存的服务器。

本地内存缓存彻底“解放”了缓存服务器,不会对缓存服务器有任何压力。

缺点:实时感知最新的缓存数据有点麻烦,会产生数据不一致的情况。我们可以设置一个比较短的过期时间,采用被动更新。当然,也可以用监控机制,如果感知到数据已经发生了变化,及时更新本地缓存。

Redis Cluster 为什么不用一致性Hash?

Redis Cluster 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么 node-1 包含 0 到 5460 号哈希槽,node-2 包含 5461 到 10922 号哈希槽,node-3包含 10922  到 16383 号哈希槽。

一致性哈希算法是 1997年麻省理工学院的 Karger 等人提出了,为的就是解决分布式缓存的问题。

一致性哈希算法本质上也是一种取模算法,不同于按服务器数量取模,一致性哈希是对固定值 2^32 取模。

公式 = hash(key) % 2^32

其取模的结果必然是在 [0, 2^32-1] 这个区间中的整数,从圆上映射的位置开始顺时针方向找到的第一个节点即为存储key的节点

一致性哈希算法大大缓解了扩容或者缩容导致的缓存失效问题,只影响本节点负责的那一小段key。如果集群的机器不多,且平时单机的负载水位很高,某个节点宕机带来的压力很容易引发雪崩效应。

举个例子:

Redis 集群 总共有4台机器,假设数据分布均衡,每台机器承担 四分之一的流量,如果某一台机器突然挂了,顺时针方向下一台机器将要承担这多出来的 四分之一 流量,最终要承担 二分之一 的流量,还是有点恐怖。

但是如果采用 CRC16计算后,并结合槽位与实例的绑定关系,无论是扩容还是缩容,只需将相应节点的key做下数据平滑迁移,广播存储新的槽位映射关系,不会产生缓存失效,灵活性很高。

另外,如果服务器节点配置存在差异化,我们可以自定义分配不同节点负责的 slot 编号,调整不同节点的负载能力,非常方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web网页设计期末课程大作业 HTML+CSS+JavaScript 美食餐饮文化主题网站设计 学生DW静态网页设计

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

关于vSphere HA Admission Control的讨论--2

上一期内容中预留的一些小问题首先做出回答&#xff1a; Q1&#xff1a;<若此时vCenter Server所在主机出现故障&#xff0c;vSphere HA是否能够正常完成故障响应&#xff1f;> A1&#xff1a;对于vSphere HA而言&#xff0c;在设计上采用主机通过FDM来管理HA的故障响应。…

天天刷 B 站,了解他们的评论系统是如何设计的吗?

今天给大家分享 B 站的评论系统的 组件化、平台化建设 通过持续演进架构设计&#xff0c;管理不断上升的系统复杂度&#xff0c;从而更好地满足各类用户的需求。 基础功能模块 评论的基础功能模块是相对稳定的。 1. 发布评论&#xff1a;支持无限盖楼回复。 2. 读取评论&…

DNS这个东西,你是真的了解了吗?

都说程序员是面向Google编程&#xff0c;殊不知当你输入 www.google.com 地址的时候&#xff0c;是否有想过&#xff0c;在回车的一瞬间浏览器如何将请求发送&#xff0c;如何到达目的地为你取得正确的数据。 遇到问题我们通常会打开浏览器&#xff0c;输入 www.google.com 回车…

EMQX+Prometheus+Grafana:MQTT 数据可视化监控实践

前言 作为一款全球下载量超千万的大规模分布式物联网 MQTT 服务器&#xff0c;最新发布的 EMQX 5.0 不仅全球首个达成单集群 1 亿 MQTT 连接支持&#xff0c;也是首个将 QUIC 引入 MQTT 的开创性产品。如今&#xff0c;EMQX 在各个行业为高可靠、高性能的物联网实时数据移动、…

阿里云服务器地域和可用区常见问题及官方资料解答

阿里云服务器同一地域分为多个可用区&#xff0c;不同地域的实例之间内网互不相通&#xff1b;选择靠近您客户的地域&#xff0c;可降低网络时延、提高您客户的访问速度。本文介绍阿里云地域和可用区的概念、选择指导、两者的关系以及阿里云支持的地域和可用区列表。 一.地域…

MySQL客户端的进阶操作

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;土豆娃娃文章来源&#xff1a;社区投稿 引言 作为一个MySQL数据库从业者&#xff0c;我们最常用的工具就是my…

极米RS Pro 2值得买吗?极米科技这款4K投影真实体验怎么样?

2022电商的最后一场狂欢购物节“双十二”已到来&#xff0c;许多小伙伴想趁此次机会购置一些礼物给辛苦一年的自己和家人。但礼物怎么选&#xff1f;选什么&#xff1f;又成为了困扰大家的一大问题。要说送礼物&#xff0c;无论是自己还是家人&#xff0c;实用的家电是最不容易…

SRv6----控制平面

学习了SRv6----报文转发流程后&#xff0c;下一步学习SRv6的控制平面及SID是如何在SRv6网内传递学习的。 首先回顾一下回顾一下链路状态路由协议&#xff0c;基于Dijkstra SPF&#xff08;Shortest Path First&#xff0c;最短路径优先&#xff09;算法计算到达指定地址的最短路…

基于倾斜模型、地形DEM高程点的批量自动提取

我们在进行前期的规划分析的时候&#xff0c;总是离不开地形条件等限制性因素。这次分享一个小的操作技巧&#xff0c;利用倾斜模型、DEM数据批量自动提取高程点&#xff0c;用来计算坡度、坡向、填挖方、流域分析等等。 分享一下在图新地球工具软件基于倾斜模型、地形DEM如何…

华为数字化转型之道 实践篇 第六章 数字化重构业务运作模式【进行中】

第六章 数字化重构业务运作模式 数字化转型从企业业务战略出发,通过数字化手段来重构核心业务运作模式,以实现客户交易更简单、内部作业更高效、运营管理更便捷。 6.1 业务运作模式重构是数字化转型的核心 利用数字化技术创新业务运作模式,通过重构业务流程提升企业运作效…

【openGauss/MogDB的uncommitted xmin问题解决】

一、问题现象 在测试openGauss/MogDB的时候&#xff0c;发现主库查询snapshot.tables_snap_timestamp这个表的时候&#xff0c;一select *&#xff0c;数据库就宕机&#xff0c;而备库是正常的。因为是测试环境不存在数据量太多的情况。所以最开始初步怀疑有数据页损坏了。 …

项目中less常用的一些东西

一、less简介 LESSCSS是一种动态样式语言&#xff0c;简称LESS&#xff0c;属于CSS预处理语言的一种&#xff0c;它使用类似CSS的语法&#xff0c;为CSS赋予了动态语言的特性&#xff0c;如变量、继承、运算、函数等&#xff0c;更方便CSS的编写和维护 LESS可以在多种语言、环…

Serverless初探

文中插图来自极客时间 今天听了市场部门分享的serverless, 打算用自己的话总结一下。 一般来说&#xff0c;每一个网络应用背后的原型都是&#xff1a;客户端服务端&#xff0c;通过相互传递消息&#xff08;发起请求&#xff0c;返回响应&#xff09; 从研发体系角度看&…

L2聚宽量化交易系统怎样实现股票量化策略?

L2聚宽量化交易系统怎样实现股票量化策略呢&#xff1f;说到这个问题&#xff0c;首先大家先想想&#xff0c;我们进行股票量化投资无非就是为了更高效的把握股票盈利的机会&#xff0c;但是往往在量化过程中&#xff0c;对聚宽量化交易系统的操作不了解&#xff0c;减少了自己…

ChatGPT可以一本正经的胡说八道,其他AI可以吗?

目录 1.ChatGPT是什么&#xff1f; 2.它是哪个公司开发的&#xff1f; 3.TA会做什么&#xff1f; 写文章 写代码 聊天 4.总结 1.ChatGPT是什么&#xff1f; ChatGPT是由人工智能实验室OpenAI上线的一款由 聊天机器人模型新模型&#xff0c;暂时网页版允许用户免费使用&…

树莓派下载及安装PyCharm软件

PyCharm 有专业版和社区版。专业版的功能更全&#xff0c;但是要收费&#xff0c;社区版是免费的&#xff0c;所以推荐下载这个版本。 通过点击这个链接:https://www.jetbrains.com/pycharm/download/#sectionlinux下载 Pycharm软件。 注意我们要下载的是 Linux 版本的软件。 …

直播怎么录屏,妙招分享,亲测好用!

看直播怎么录制屏幕视频&#xff1f;直播怎么录屏&#xff1f;无论是网络直播课程还是游戏主播直播&#xff0c;很多朋友都想在观看时录制&#xff0c;方便后面再次回顾。事实上&#xff0c;录制直播视频的方法很简单。今天&#xff0c;小编就来分享一个亲测好用的妙招。 一、手…

圣诞节会呼吸的玫瑰爱心代码 一起浪漫吧

源码下载地址&#xff1a;会呼吸、带有玫瑰花的爱心告白程序-Java文档类资源-CSDN下载 粉丝可直接私信我领取。 前言 之前有部电视剧《点燃我温暖你》没火&#xff0c;但是其中李峋的爱心代码却在程序圈超级火&#xff0c;这圣诞节快到了了&#xff0c;给大家来一波爱心代码…

CH36X系列芯片Windows系统使用教程

概述 CH365是一个连接PCI总线的通用接口芯片&#xff0c;CH367/CH368是连接PCI-Express总线的通用接口芯片。支持I/O端口映射、存储器映射、扩展ROM以及中断&#xff0c;提供主动并口、SPI、I2C、GPIO等硬件接口。基于如上芯片可将PCI/PCIe总线转换为简便易用的类似于ISA总线的…