RPC、分布式哈希、一致性哈希

本文介绍了RPC(远程过程调用)的概念,强调其作为客户端与服务器间请求响应模型的角色,简化了底层通信的复杂性。接着探讨了分布式哈希(DHT),用于解决数据分布式存储的问题,确保每个节点只负责一部分路由和数据存储。进一步讨论了一致性哈希,它是一种哈希算法,当节点增删时,能最小化映射关系的改变,降低对系统稳定性的影响。一致性哈希在负载均衡、RPC服务和MemCache集群等场景中有广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、RPC

简单的说,

  • RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
  • RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯) RPC 是一个请求响应模型。
  • 客户端发起请求,服务器返回响应(类似于Http的工作方式) RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
    参考:RPC简介及框架参考

二、分布式哈希

参考:分布式哈希与一致性哈希
参考:“分布式哈希”和“一致性哈希”的概念与算法实现
两个key point:

  • 每个节点只维护一部分路由;
  • 每个节点只存储一部分数据。从而实现整个网络中的寻址和存储。

DHT只是一个概念,提出了这样一种网络模型。并且说明它是对分布式存储很有好处的。但具体怎么实现,并不是DHT的范畴。

我们将散列表放在一个机器的内存里,当散列表比较小时候,没有问题,但如果这张散列表超过了一台机器的内存时候,或者当存储在一台机器上时候,这台机器挂掉了,那所有的数据都会消失……
那现在我们又该怎么做呢?
这便需要引入DHT来处理这种情况了,说白了就是将一张哈希表分割在不同的机器上。
首先,将上面所说的散列空间0,1…9想像成一个首尾相衔的环,9之后又重新回到零,假设,这就是十台机器。
在这里插入图片描述

三、一致性哈希

好了,上面我们使用DHT实现了数据的分布式存储,但再考虑深一层,分布式架构中,节点的故障是不可避免的,当添加和删除某一节点了,会导致大量散列数据失效,需要重新散列。
影响非常大,那我们用什么哈希算法来实现DHT才能尽量的避免这种情况呢,这便说到了一致性哈希。
consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在 key 映射关系。
刚刚我们把学生散列到了hash数值空间里,现在我们需要的是,同时将机器也散列在这个hash空间,让学生和机器的散列值同处在一个数值空间。
在这里插入图片描述
如上图所示,如果我们将学生和机器同时散列在一个环中,那么假设小张散列后的值为6,我们顺时针寻找,寻找到的第一台机器,则将小张放入其中。
依次类推,则得到:

小王——>机器一
小明——>机器二
小红——>机器三
小张——>机器四

假设我们机器三失效了,那这时候影响到的仅仅是小红,重新散列到机器四中。
而如果重新加入一台新的机器,影响到的也仅仅是旁边的一台机器,这样便解决了添加删除机器时候的震荡问题,这便是一致性hash的大致思想。

参考:一致性哈希

什么是一致性哈希

一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系 。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题。

一致性哈希算法一般用来干什么

一般我们在项目的负载均衡上要求资源被均匀的分配到所有的服务器节点上,同时,还需要对资源的请求能迅速的路由到具体的节点,例如:

  • 我们在做RPC服务的时候,会经常部署多台服务器,然而有时有这样的需求就是,我们希望将同一类型的请求路由到同一台机器上,这个时候就可以用一致性hash算法来实现。
  • MemCache集群,要求存储数据均匀的放到集群中的各个节点上,访问这些数据时能快速的路由到集群中对应存放该数据的节点上;并且要求增删节点对整个集群的影响很小,不至于有大的动荡造成整体负载的不稳定,这个时候也是可以用一致性hash算法。

一致性哈希算法原理解析

一致性哈希算法核心思想就是,先维护出一个2的32次方整数环【0,2^32-1】,然后将每个节点的计算hash值放到环上。下面通过一个例子来看看 ;
现在有三个节点分别是Node0、Node1、Node3,我们要将多个资源尽可能均匀的分配到这三个节点中,该怎么做呢?
依据一致性hash算法思想,我们需要将资源key进行hash运算,得到的hash值在环上顺时针查找,找到离它最近的节点也就是第一个大于或等于它的节点,这样资源就和节点建立了映射关系
在这里插入图片描述

取余算法和一致性哈希算法

我们要向分配节点第一想到的办法就是 取 余 算 法 \color{red}{取余算法} 。即现在有3个节点,资源key=7,7%3=1,则选择Node1,key=5,5%3= 2,则选择Node2,key=3,3%3=0,则选择Node0。虽然简单,但有个缺点,如果节点数增加或减少,就会有大量的key不命中,造成请求压力转移,可能对系统整体有很大的影响,甚至发生宕机危险。
一 致 性 哈 希 算 法 \color{red}{一致性哈希算法} 增加或减少节点,只会引起很少部分的key不会命中,如下图,增加一个Node4节点,则只会将部分的key值从Node1移到Node4,对集群影响很小。
在这里插入图片描述

### 使用一致性哈希RPC结合实现可重入性的方法 在分布式系统中,为了提高系统的可用性和性能,通常会采用负载均衡策略来分配请求到不同的服务器实例上。其中一种常见的负载均衡算法是一致性哈希(Consistent Hashing)。当与远程过程调用(RPC)相结合时,可以有效地支持服务调用的可重入特性[^1]。 #### 一致哈希的工作原理 一致性哈希通过计算节点和服务对象(如客户端ID或请求参数)之间的散列值,并将其映射到一个虚拟环上来决定哪个实际物理机器应该处理该请求。这种方式不仅减少了因新增或移除节点而导致的数据迁移量,而且还能保持较高的命中率,即使在网络拓扑发生变化的情况下也能维持较好的分布均匀度[^4]。 #### 实现可重入机制的关键要素 要使基于一致性哈希RPC框架具备良好的可重入能力,需考虑以下几个方面: - **幂等操作**:确保每次相同的输入总是得到相同的结果,这可以通过设计无副作用的服务端逻辑来达成。 - **事务管理**:如果涉及到多个资源的操作,则应提供跨服务边界的事务控制功能,比如两阶段提交协议(Two-phase Commit Protocol),以保证整个流程要么全部成功执行,要么完全回滚。 - **状态保存**:对于那些可能被中断后再继续的任务,在适当的位置记录下当前进度以便后续恢复;也可以利用缓存技术暂存中间结果直到最终确认为止。 - **超时设置**:合理设定每一步骤的最大等待时间,防止长时间挂起影响其他正常业务流程的同时也便于及时触发补偿措施。 ```java // Java伪代码展示了一个简单的RPC调用过程中应用了一致性哈希来进行路由选择的例子 public class RpcClient { private final ConsistentHash<String> consistentHash; private Map<String, ServiceInstance> serviceInstances; public Object invoke(String methodName, List<Object> args){ String key = generateKey(methodName,args); String targetServerId = consistentHash.get(key); // 获取目标服务器id try{ return sendRequestTo(targetServerId,methodName,args); // 向指定的目标发送请求并接收响应数据 }catch(Exception e){ throw new RuntimeException("Failed to call remote method",e); } } private static String generateKey(String methodName,List<Object> args){ StringBuilder sb=new StringBuilder(); sb.append(methodName).append("-"); for(Object arg : args)sb.append(arg.toString()).append(","); return sb.toString().trim(); // 构建唯一键用于定位具体的服务实例 } } ``` 上述代码片段展示了如何在一个典型的RPC客户端内部运用一致性哈希算法确定向哪一个远端服务发起调用。这里假设`consistentHash`已经初始化好并且包含了所有在线的服务实例信息。每当有新的API请求到来时,都会先根据方法名和参数列表生成唯一的key字符串作为查找依据,再由这个key找到最适合承担此次工作的那台主机地址进行下一步通讯动作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值