Redis实现集群的原理

一 概述

在高并发的系统中当我们需要从海量的数据中快速找到所需符合要求的数据,我们可以按照某种规则对海量数据进行划分,将其分散存储在多个Reids服务结点上,从而通过实现数据分片来降低Redis服务当节点的压力。

二 Redis集群

Redis集群采用无中心结构,每个Redis服务器结点保存一定的数据和整个集群的状态,同时每个Redis服务器结点同其他服务器结点通过Gossip协议去传播信息,以及发现新增的Redis服务器结点,Redis集群的主要作用是将不同的key分散的存储于不同的Redis结点中,通常是通过key的Hash值,然后根据Redis服务器结点数量求模(取模运算:a % p(或a mod p),表示baia除以p的余数)。

在这种情况下当需要动态的增加或者减少结点时会造成大量的key无法被命中,为了解决整个问题Redis中便使用一次性Hash算法(对2^32进行取模,当通过Hash算法得到的值组成一个虚拟的圆环),将不同的key使用相同的Hash函数计算出Hash值。

假设Hash算法的值空间为(0~2^32-1),则整个Hash环如上图所示,整个空间按顺时针在0到2~2^32-1取值,圆环的正上方为0,最终形成如上图所示的Hash环。

下一步就是将各个Redis结点进行Hash变换,可以使用主机的ip或者主机名作为关键字进行Hash运算,这样每台主机可以很方便的确定其在Hash环上的位置。然后对所有的数据进行同样的Hash算法处理,定位访问到相应的服务器,并将数据保存到该服务器,即我们将数据的Key使用Redis结点相同的Hash函数计算出Hash值,并确定其在Hash环上的位置,然后沿着顺时针检查,当遇到第一台Redis服务器(即最近的顺时针方向最近的一台Redis服务器),会将Hash值保存到该服务器,从而实现将对应的数据分散保存到对应的服务器。

这样做的好处是,当服务器B宕机之后,A,C,D是不会受到影响的,而且之前所有保存在B结点上的数据会保存到C服务器上,当在A服务器和B服务器之间增加一个Redis服务器E时,则会将Hash值在A到E之间的数据保存到E结点上,将Hash值在E到B之间的数据保存到B结点上,就是顺时针最接近的Redis服务器结点,综上所述,一次性Hash算法,对于结点的增减,都只需要定位环中受影响的一小部分数据,具有较好的容错性,和扩展性。

三 Hash环的数据倾斜问题

如果集群系统中只存在两台服务器,如图所示,key进行Hash计算之后,可能造成大部分数据顺时针最近的服务器为A服务器,所以Redis服务器A中会保存大量数据,可能使得服务器A数据压力过大。

为了解决Hash环的数据倾斜问题,一次性Hash算法,引入了虚拟结点解决数据倾斜问题,即对每个结点进行多次Hash,计算的位置都放置一个子服务节点,即虚拟节点,我们可以在服务器的Ip或者主机名上增加编号来实现。

如图,可以为每台服务器计算三个虚拟节点,如NodeA变成NodeA#1,NodeA#2,NodeA#3,NodeB类似,然后将他们均匀分布到Hash环上,从而得到多个虚拟节点(这里为6个),同时数据定位的Hash算法不变,只是执行一步虚拟节点到实际节点的映射,如定位到NodeA#1,NodeA#2,NodeA#3三个节点上的数据都会实际映射保存到NodeA Redis服务结点上,从而实现数据的分散处理,实际应用中,会将虚拟节点设置为32或者更大,所以及时很少的实际节点也能做到数据的均匀分布,在Redis集群中我们可以结合Redis主从同步于哨兵机制,从而保证集群的高可用性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值