直击Redis集群痛点:数据倾斜优化实战,打造高效分布式缓存架构

        随着数据规模的不断扩大,Redis分片集群在处理大规模数据时可能会面临一个棘手的问题——数据倾斜。这种现象是指数据分布不均匀,导致某些Redis实例承受了远超过其应承担的负载,从而严重影响系统的性能和稳定性。

        数据倾斜有两种类型:

  • 数据量倾斜:在某些场景下,数据的分布不均匀,在某些实例上,数据量相对于其他实例特别大
  • 数据访问倾斜:虽然每个实例上保存的数据量差异不大,但是某个实例上存在热点数据,访问时热点数据的访问量特别大,被频繁访问

        如果发生了数据倾斜,那保存了大量数据或访问量大的节点就会存在性能问题,速度变慢,影响用户体验。这是使用分片集群时应该避免的,那如何才能避免数据倾斜呢?

数据量造成的倾斜

        当数据量倾斜发生时,数据在分片集群上的分布不均匀,大量的数据集中在一个或几个实例上。​​​​​​​

        数据量倾斜产生的原因

        bigkey导致数据量倾斜

        某个实例上正好保存了 bigkey。bigkey 的 value 值很大,或者bigkey保存了大量集合元素,会导致这个实例的数据量增加,内存消耗也相应增加。

        而且,对bigkey的操作还会造成主线程的阻塞,因为Redis是单线程模型,如果访问bigkey的话,就会造成其他命令的阻塞,影响其他客户端的正常访问性能。

        所以,在正常的使用中,一定要避免使用bigkey,如果出现了bigkey,如果是String类型的话可以对其进行压缩,如果是集合类型的话,可以将一个大集合拆成若干小集合进行操作。不过都会增加复杂度,所以最好避免出现bigkey。

        Slot 分配不均衡导致倾斜

        如果没有均衡地分配 Slot,就会有大量的数据被分配到同一个 Slot 中,而同一个 Slot 只会在一个实例上分布,这就会导致大量数据被集中到一个实例上,造成数据倾斜。

        以 Redis Cluster 为例,来介绍下 Slot 分配不均衡的情况。

        Redis Cluster 一共有 16384 个 Slot,假设集群一共有 4 个实例,其中,实例 1 的硬件配置较高,在给实例分配 Slot 时,就可能会给该实例多分配些 Slot,把该实例的资源充分利用起来。

        但是,我们其实并不知道数据和 Slot 的对应关系,这种做法就可能会导致大量数据正好被映射到该实例上的 Slot,造成数据倾斜,给该实例带来访问压力。

        为了应对这个问题,我们可以通过规范,在分配之前,我们就要避免把过多的 Slot 分配到同一个实例。如果是已经分配好 Slot 的集群,我们可以先查看 Slot 和实例的具体分配关系,从而判断是否有过多的 Slot 集中到了同一个实例。如果有的话,就将部分 Slot 迁移到其它实例,从而避免数据倾斜。

        如果是 Redis Cluster,就用 CLUSTER SLOTS 命令。如果某一个实例上有太多的 Slot,我们就可以使用迁移命令把这些 Slot 迁移到其它实例上。

        Hash Tag 导致倾斜

        Hash Tag 是指加在键值对 key 中的一对花括号{}。这对括号会把 key 的一部分括起来,客户端在计算 key 的 CRC 值时,只对 Hash Tag 花括号中的 key 内容进行计算。如果没用 Hash Tag 的话,客户端计算整个 key 的 CRC 的值。

        例子:假设 key 是 product:3231,我们把其中的 3231 作为 Hash Tag,此时,key 就变成了 product:{3231}。当客户端计算这个 key 的 CRC 值时,就只会计算 3231 的 CRC 值。否则,客户端会计算整个“product:3231”的 CRC 值。

        使用 Hash Tag 的潜在问题,就是大量的数据可能被集中到一个实例上,导致数据倾斜,集群中的负载不均衡。那么,该怎么应对这种问题呢?我们就需要在范围查询、事务执行的需求和数据倾斜带来的访问压力之间,进行取舍了。

数据访问造成的倾斜

       发生数据访问倾斜的根本原因,就是实例上存在热点数据(比如秒杀场景中的热门商品数据、某个明星的八卦新闻、热点事件的新闻,等等)。

        一旦热点数据被存在了某个实例中,那么,这个实例的请求访问量就会远高于其它实例,面临巨大的访问压力,如图:​​​​​​​

        和数据量倾斜不同,热点数据通常是一个或几个数据,所以,直接重新分配 Slot 并不能解决热点数据的问题。通常来说,热点数据以服务读操作为主,在这种情况下,我们可以采用热点数据多副本的方法来应对。

        具体做法是,我们把热点数据复制多份,在每一个数据副本的 key 中增加一个随机前缀,让它和其它副本数据不会被映射到同一个 Slot 中。这样一来,热点数据既有多个副本可以同时服务请求,同时,这些副本数据的 key 又不一样,会被映射到不同的 Slot 中。在给这些 Slot 分配实例时,我们也要注意把它们分配到不同的实例上,那么,热点数据的访问压力就被分散到不同的实例上了。

        这里,有个地方需要注意下,热点数据多副本方法只能针对只读的热点数据。如果热点数据是有读有写的话,就不适合采用多副本方法了,因为要保证多副本间的数据一致性,会带来额外的开销。

        对于有读有写的热点数据,我们就要给实例本身增加资源了,例如使用配置更高的机器,来应对大量的访问压力。

监控

        应对数据倾斜的关键还有监控与调优,建立完善的监控体系,实时监测各个分片的负载状态,结合自动化工具进行智能调度和数据迁移。

往期经典推荐

不止内存优势:Redis高性能背后的神秘面纱,超越想象加速秘诀-CSDN博客

MySQL自增主键原来有这么大作用-CSDN博客

Redis性能大挑战:深入剖析缓存抖动现象及有效应对的战术指南-CSDN博客

  • 36
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超越不平凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值