怎么自己设计网站,家装类设计网站,wordpress cdn 腾讯云,网站建设费用推荐网络专业普通取模算法
假设我们有三台缓存服务器#xff0c;用于缓存图片#xff0c;我们为这三台缓存服务器编号为 0号、1号、2号#xff0c;现在有3万张图片需要缓存#xff0c;我们希望这些图片被均匀的缓存到这3台服务器上#xff0c;以便它们能够分摊缓存的压力。也就是说用于缓存图片我们为这三台缓存服务器编号为 0号、1号、2号现在有3万张图片需要缓存我们希望这些图片被均匀的缓存到这3台服务器上以便它们能够分摊缓存的压力。也就是说我们希望每台服务器能够缓存1万张左右的图片那么我们应该怎样做呢常见的做法是对缓存项的键进行哈希将hash后的结果对缓存服务器的数量进行取模操作通过取模后的结果决定缓存项将会缓存在哪一台服务器上。
上述HASH算法时会出现一些缺陷当服务器数量发生改变时大量缓存在一定时间内是失效的造成了缓存的雪崩当应用无法从缓存中获取数据时则会向后端服务器请求数据后端服务器将会承受巨大的压力整个系统很有可能被压垮。为了解决这种情况就有了一致性哈希算法。
一致性哈希算法
一致性哈希算法在 1997 年由麻省理工学院提出是一种特殊的哈希算法在移除或者添加一个服务器时能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系一致性哈希解决了简单哈希算法在分布式哈希表Distributed Hash TableDHT中存在的动态伸缩等问题。
一致性哈希算法也是使用取模的方法但是取模算法是对服务器的数量进行取模而一致性哈希算法是对 2^32 取模具体步骤如下 步骤一一致性哈希算法将整个哈希值空间按照顺时针方向组织成一个虚拟的圆环称为 Hash 环 步骤二接着将各个服务器使用 Hash 函数进行哈希具体可以选择服务器的IP或主机名作为关键字进行哈希从而确定每台机器在哈希环上的位置 步骤三最后使用算法定位数据访问到相应服务器将数据key使用相同的函数Hash计算出哈希值并确定此数据在环上的位置从此位置沿环顺时针寻找第一台遇到的服务器就是其应该定位到的服务器 一致性哈希算法的优点
前面提到如果简单对服务器数量进行取模那么当服务器数量发生变化时会产生缓存的雪崩从而很有可能导致系统崩溃而使用一致性哈希算法就可以很好的解决这个问题因为一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据只有部分缓存会失效不至于将所有压力都在同一时间集中到后端服务器上具有较好的容错性和可扩展性。 哈希环的倾斜与虚拟节点 一致性哈希算法在服务节点太少的情况下容易因为节点分部不均匀而造成数据倾斜问题也就是被缓存的对象大部分集中缓存在某一台服务器上从而出现数据分布不均匀的情况这种情况就称为哈希环的倾斜。
哈希环的倾斜在极端情况下仍然有可能引起系统的崩溃为了解决这种数据倾斜问题一致性哈希算法引入了虚拟节点机制即对每一个服务节点计算多个哈希每个计算结果位置都放置一个此服务节点称为虚拟节点一个实际物理节点可以对应多个虚拟节点虚拟节点越多哈希环上的节点就越多缓存被均匀分布的概率就越大哈希环倾斜所带来的影响就越小同时数据定位算法不变只是多了一步虚拟节点到实际节点的映射。具体做法可以在服务器ip或主机名的后面增加编号来实现。
参考文章
一致性Hash算法原理总结 - 知乎 (zhihu.com)
一致性哈希算法原理详解-CSDN博客