发布时间:2025-09-10 14:42:26 点击量:
HASH GAME - Online Skill Game GET 300
所以一致性 Hash 算法就是通过这种方法来判断对象该存储在哪台服务器上的,也就是将缓存服务器与缓存对象绑定到 Hash 环上之后,从被缓存的对象开始,顺时针方向遇到的第一台服务器就是缓存对象要存储的服务器,由于缓存对象对服务器 Hash 后的值是固定的,所以在服务器不变的情况下,一张图片必定会缓存在固定的服务器上,所以当下次访问该图片时,只要再次使用同样的哈希算法计算,即可获取出该图片在哪台服务器上,然后直接去对应的服务器上获取即可。
此时,如图所示,图片1,图片3,图片4,图片5都会缓存到服务器A上,图片2缓存中服务器B上,服务器C上没有图片,也就是说,服务器资源并没有理想化平均的被使用。最坏的情况下,如果此时服务器A发生故障,那缓存失效的对象也就达到了最大值,极端情况下也有可能造成后端服务器的崩溃。此时这种情况称之为 Hash 环的倾斜,那么怎么防止 Hash 环的倾斜呢,一致性hash算法使用虚拟节点来解决了这个问题,下面我们来看看。
还是按照我们说的,假设我们只有三台服务器,当我们把服务器映射到 Hash 环上的时候,很有可能发生 Hash 环偏斜的情况,当 Hash环偏斜以后,缓存往往会极度不平衡的分布在各个服务器上,聪明的你肯定想到了,要想均衡的将缓存分布在三台服务器上,那么只要这三台服务器尽可能多的均匀的分布在H ash 环不就行了吗,但是线台,我们怎么凭空让它多起来呢,没错,就是凭空让服务器的节点多起来,既然没有多余的真正的物理服务器节点,我们只能将现有的物理节点虚拟出来,这些由实际节点虚拟复制出来的节点被称为“虚拟节点”,加入虚拟节点之后的 Hash 环如下图所示: