问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Redis分片技术详解:原理、优势及哈希槽算法

创作时间:
作者:
@小白创作中心

Redis分片技术详解:原理、优势及哈希槽算法

引用
CSDN
1.
https://blog.csdn.net/m0_52675592/article/details/116561393

Redis分片技术是将数据分散到多个Redis实例中的方法,每个Redis实例只存储数据集的一部分。这种技术能够有效解决单实例Redis在高并发场景下的存储和计算压力问题。本文将详细介绍Redis分片技术的原理、优势以及哈希槽算法的实现方式。

Redis分片技术概述

Redis分片(Sharding)技术是指将数据分散到多个Redis实例中的方法,分片之后,每个Redis拥有一部分原数据集的子集。在数据量非常大的时候,这种技术能够将数据量分散到若干主机的Redis实例上,进而减轻单台redis实例的压力。分片技术能够以更扩展的方式使多台计算机的存储能力和计算能力:

  1. 从存储能力角度,分片技术通过使用多台计算机的内存来承担更大量的数据,如果没有分片技术,那么Redis的存储能力将受限于单台主机的内存大小。

  2. 从计算能力角度,分片技术通过将计算任务分散到多核或者多台主机中,能够充分利用多核、多台主机的计算能力。

Redis集群采用了 去中心化的思想 ,对于客户端来说,整个集群可以看成一个整体,可以连接任意一个节点进行操作,不需要任何代理中间件,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node。

未采用分片技术的单Redis实例

对这1000万条数据的所有增删改查操作压力都会集中在这个Redis所在的主机,此时不仅有存储和操作对该主机的压力,还有该主机失效时将导致所有操作都无法进行的问题。

采用分片技术

采用分片技术之后,数据将被分散到4个Redis实例中,对数据的操作也被分散到每个Redis实例中,此时单台主机的压力将大大减轻。

Redis单实例架构的局限性

Redis单实例架构,从最开始的一主N从,到读写分离,再到哨兵机制,单实例的Redis缓存能够应对大多数的使用场景,也能实现主从故障迁移。但是,在某些场景下,单实例Redis缓存会存在以下几个问题:

  1. 写并发:
    Redis单实例读写分离可以解决读操作的负载均衡,但对于写操作,仍然是全部落在了master节点上面,在海量数据高并发场景,一个节点写数据容易出现瓶颈,造成master节点的压力上升。

  2. 海量数据的存储压力:
    单实例Redis本质上只有一台Master作为存储,如果面对海量数据的存储,一台Redis的服务器就应付不过来了,而且数据量太大意味着持久化成本高,严重时可能会阻塞服务器,造成服务请求成功率下降,降低服务的稳定性。

针对以上的问题, Redis集群提供了较为完善的方案,解决了存储能力受到单机限制,写操作无法负载均衡的问题

Redis也内置了 高可用机制 ,支持N个master节点,每个master节点都可以挂载多个slave节点,当master节点挂掉时,集群会提升它的某个slave节点作为新的master节点。
Redis集群可以看成 多个主从架构组合起来的 ,每一个主从架构可以看成一个节点(其中,只有master节点具有处理请求的能力,slave节点主要是用于节点的高可用)

Redis集群的数据分布算法:哈希槽算法

什么是哈希槽算法

对于分布式存储,需要考虑的重点是如何将数据进行拆分到不同的Redis服务器上。常见的分区算法有hash算法、一致性hash算法。

  • 普通hash算法:将key使用hash算法计算之后,按照节点数量来取余,即hash(key)%N。优点就是比较简单,但是扩容或者摘除节点时需要重新根据映射关系计算,会导致数据重新迁移。
  • 一致性hash算法:为每一个节点分配一个token,构成一个哈希环;查找时先根据key计算hash值,然后顺时针找到第一个大于等于该哈希值的token节点。优点是在加入和删除节点时只影响相邻的两个节点,缺点是加减节点会造成部分数据无法命中,所以一般用于缓存,而且用于节点量大的情况下,扩容一般增加一倍节点保障数据负载均衡。

Redis集群采用的算法是 哈希槽分区算法 。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作。

使用哈希槽的好处就在于 可以方便的添加或者移除节点 ,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;

哈希槽的特点:

  • 解耦数据和节点之间的关系,简化了扩容和收缩难度;
  • 节点自身维护槽的映射关系,不需要客户端代理服务维护槽分区元数据
  • 支持节点、槽、键之间的映射查询,用于数据路由,在线伸缩等场景

哈希槽相关的数据结构

(1)clusterNode:保存节点的当前状态,比如节点的创建时间、节点的名字、节点的当前配置纪元(用于实现故障转移)、

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号