余数哈希/一致性哈希(memcached分布式算法)

一下内容来自https://www.cnblogs.com/dhcao/p/10451936.html

 

网站的伸缩性架构中,分布式的设计是现在的基本应用。

在memcached的分布式架构中,key-value缓存的命中通常采用分布式的算法

一、余数Hash

    简单的路由算法可以使用余数Hash:

                node编号=HashCode(key)%服务器数目

例如: key=‘BEIJING'的hash值为490806430,服务器数目=3。那么余数为1。所以这个key-value就落在第一台缓存服务器上。

 

优点:计算简单。

缺点:不利于扩展。如果扩展的话,由3太服务器扩展为4台服务器,那么通过一个key='BEIJING',再除以服务器数码,余数为2。那么将不能命中,计算可知,增加一台服务器不能命中的数据将达到:N/(N+1)。那也太高了。

 

二、一致性Hash算法

数据结构:一致性哈希环(图片来自网络)

                                                        

 

算法过程:

    数据存放;先构造一个长度为2^32的整数环,根据节点名称的Hash值[0,2^32-1],将缓存服务器节点放置在这个Hash环上。也就是说,每个节点,都根据起Hash值,放在对应的Hash环的位置中。。。如上图,假设有4个节点node1 - node4。当数据来临时候,根据数据KEY计算得到的Hash值,顺时针找到最近的node,然后将数据放入此节点。

    增加节点:如果当node5节点增加进入系统时,只有node5之前的数据受到影响,由原来的放在node4上,转移到新节点node5上。

    查找算法:Hash查找的过程实际上是在二叉查找树中查找不小于查找树的最小数值。当然这个二叉树的最右边子节点和最左边子节点相连接,构成环。

 

缺陷:

    新加入的node5节点只影响到了node4上面的部分数据。原来节点node1,node2,node3都不受影响。这就意味着,node1 - node3 将承受着node4、5的两倍数据压力。如果5台服务器的性能是一样的,那么这种结果显然不是最好 的。

 

虚拟节点:

    如图:(图片来自网络)

   --

 

 

将每个物理节点映射为3个虚拟节点A1,A2,A3。这样,当增加一个物理机时,也将该虚拟机地址映射为3个或多个虚拟节点,将这新的3个虚拟节点分摊到环的不同位置,那么受到影响的节点也分不到不同的位置。整个环节点的均匀性将会大大增加!

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用分布式事务或者一致性哈希算法实现 Redis Sharding 分片的具体实现方: 1. 使用分布式事务实现 在使用分布式事务实现 Redis Sharding 分片时,需要使用分布式事务框架(例如,XA、TCC 等)对多个 Redis 实例中的数据进行操作,以保证数据的一致性。具体实现步骤如下: - 将 Redis 实例分成多个片段,每个片段存储在一个 Redis 节点上。 - 对于每个操作,例如写操作或者删除操作,需要在多个 Redis 节点上开启一个分布式事务。 - 在分布式事务中,对于每个 Redis 节点执行相应的操作,例如写入数据或者删除数据。 - 如果所有节点的操作都执行成功,则提交分布式事务,否则回滚分布式事务。 需要注意的是,使用分布式事务实现 Redis Sharding 分片需要考虑如下问题: - 分布式事务的效率较低,会影响 Redis 的性能。 - 分布式事务需要协调多个节点的操作,容易出现死锁和性能瓶颈等问题。 - 分布式事务的实现需要依赖于分布式事务框架,需要额外的开发工作。 2. 使用一致性哈希算法实现 在使用一致性哈希算法实现 Redis Sharding 分片时,需要将数据分散存储在多个 Redis 节点上,并通过一致性哈希算法确定数据应该存储在哪个节点上。具体实现步骤如下: - 将 Redis 实例分成多个片段,每个片段存储在一个 Redis 节点上。 - 对于每个写操作或者查询操作,通过一致性哈希算法确定数据应该存储在哪个节点上。 - 如果要增加或删除节点,可以在一致性哈希算法中添加或删除节点,从而实现动态扩展或缩减 Redis 的容量。 需要注意的是,使用一致性哈希算法实现 Redis Sharding 分片需要考虑如下问题: - 一致性哈希算法可能会导致数据不均衡的问题,需要使用虚拟节点或者增加数据复制等技术解决。 - 一致性哈希算法需要考虑节点故障和数据恢复问题,通常使用主从复制或者集群化技术实现。 - 一致性哈希算法需要考虑节点的负载均衡问题,通常使用预取数据等技术解决。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值