4

当负载均衡器可以使用循环算法将传入的请求平均分配到节点时,为什么我们需要使用一致性哈希来分配负载?使用一致哈希和 RR 分配负载的最佳方案是什么?

4

3 回答 3

10

这个博客

使用传统的“模散列”,您只需将请求散列视为一个非常大的数字。如果您将该数字取模可用服务器的数量,您将获得要使用的服务器的索引。这很简单,只要服务器列表稳定,它就可以很好地工作。但是当添加或删除服务器时,就会出现一个问题:大多数请求将散列到与以前不同的服务器。如果您有九台服务器并且添加了十分之一,那么只有十分之一的请求会(幸运地)像以前那样散列到同一台服务器。一致的散列可以实现良好分布的均匀性。

然后是一致的哈希。一致性哈希使用更精细的方案,其中每个服务器根据其名称或 ID 分配多个哈希值,每个请求分配给具有“最近”哈希值的服务器。这种增加的复杂性的好处是,当添加或删除服务器时,大多数请求将映射到它们之前所做的同一台服务器。因此,如果您有九台服务器并添加十分之一,则大约 1/10 的请求将具有接近新添加服务器的哈希值的哈希值,而其他 9/10 将具有与之前相同的最近服务器。好多了!因此,一致的散列让我们可以添加和删除服务器,而不会完全干扰每个服务器保存的缓存项目集。

同样,轮询算法用于服务器列表稳定且LB流量随机的场景。一致的哈希用于后端服务器需要横向扩展或横向缩小的场景,并且大多数请求将映射到它们之前所做的同一台服务器。一致的散列可以实现良好分布的均匀性。

于 2019-10-14T08:50:58.500 回答
5

假设我们要在服务器上维护用户会话。因此,我们希望来自用户的所有请求都发送到同一台服务器。在这里使用循环将无济于事,因为它会在可用服务器之间盲目地以循环方式转发请求。

为了实现用户和服务器之间的 1:1 映射,我们需要使用基于散列的负载均衡器。一致的散列适用于这个想法,它还可以优雅地处理我们想要添加或删除服务器的情况。

参考:查看以下 Gaurav Sen 的视频以获得进一步的解释。 https://www.youtube.com/watch?v=K0Ta65OqQkY https://www.youtube.com/watch?v=zaRkONvyGr8

于 2020-03-18T07:46:23.250 回答
2

为了完整起见,我想指出一致性哈希的另一个尚未提及的重要特性:DOS 缓解。

如果负载均衡器收到大量请求(来自太多客户、攻击或失控的本地服务),则循环方法将在所有上游服务中均匀地应用请求垃圾邮件。即使分散开来,这种负载对于每个服务来说都可能太大而无法处理。那么会发生什么?您的负载平衡器试图提供帮助,但已使您的整个系统瘫痪。

如果您使用模数或一致散列方法,那么只有一小部分服务会被弹幕攻击。

能够以这种方式“限制爆炸半径”是生产系统的一个关键特征

于 2021-05-18T00:43:43.433 回答