当前位置: 首页 > news >正文

一致性哈希原理

数据服务器如何组织:设计时候保证高频中低频都有数量。否则就是忙的忙死闲的闲死

逻辑层服务器:增加和减少机器的时候代价很小

数据层服务器:增加和减少机器的时候代价是全量的

取模服务器个数的问题--缓存雪崩

取模 也可以 实现数据底层均匀分布,hash(图片名称)% N

当服务器数量发生改变时,所有缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端服务器请求数据,同理,假设3台缓存中突然有一台缓存服务器出现了故障,无法进行缓存,那么我们则需要将故障机器移除,但是如果移除了一台缓存服务器,那么缓存服务器数量从3台变为2台,如果想要访问一张图片,这张图片的缓存位置必定会发生改变,以前缓存的图片也会失去缓存的作用与意义,由于大量缓存在同一时间失效,造成了缓存的雪崩,此时前端缓存已经无法起到承担部分压力的作用,后端服务器将会承受巨大的压力,整个系统很有可能被压垮,所以,我们应该想办法不让这种情况发生,但是由于上述HASH算法本身的缘故,使用取模法进行缓存时,这种情况是无法避免的,为了解决这些问题,一致性哈希算法诞生了。

简单的对服务器数量进行取模,当缓存服务器数量发生变化时,会引起缓存的雪崩,可能会引起整体系统压力过大而崩溃(大量缓存同一时间失效)。

当缓存服务器数量发生变化时,几乎所有缓存的位置都会发生改变,怎样才能尽量减少受影响的缓存呢?

取模2^32组成环--缓存部分失效

取模法是对服务器的数量进行取模,而一致性哈希算法是对232取模。想象成一个圆,就像钟表一样,钟表的圆可以理解成由60个点组成的圆,而此处我们把这个圆想象成由232个点组成的圆。

圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到232-1,也就是说0点左侧的第一个点代表232-1。我们把这个由2的32次方个点组成的圆环称为hash环。

hash(服务器的IP地址) % 2^32,算出的结果一定是一个0到2^32-1之间的一个整数,我们就用算出的这个整数,代表服务器A

**hash(图片名称) % 2^32,****算出的结果是一个整数, **从所在位置开始,沿顺时针方向遇到的第一个服务器就是A服务器,所以,将会被缓存到服务器A上

1623726720920-4783b2fd-a641-4ff5-be9e-72ed3aa0f16a.png

B故障时候:原来在C的还在C不会数据迁移,原来在B的数据会迁移到C,新来的原本应该到B的也会去C,原来在A的还是在A不会数据迁移,影响的只有原来在B的数据要迁移到顺时针下一个节点上面去。

所以只有部分缓存会失效

hash环的偏斜

所有的服务器集中在某一段,所有的文件都会放在第一台,第一台失效的时候还是会雪崩。

由于我们只有3台服务器,当我们把服务器映射到hash环上的时候,很有可能出现hash环偏斜的情况

虚拟节点--解决偏斜

没有多余的真正的物理服务器节点,我们就只能将现有的物理节点通过虚拟的方法复制出来,这些由实际节点虚拟复制而来的节点被称为”虚拟节点”。

“虚拟节点”是”实际节点”(实际的物理服务器)在hash环上的复制品,一个实际节点可以对应多个虚拟节点。

虚拟节点越多,hash环上的节点就越多,缓存被均匀分布的概率就越大。

虚拟节点技术:按照比例来抢。

https://segmentfault.com/a/1190000021199728

https://www.zsythink.net/archives/1182

http://www.hskmm.com/?act=detail&tid=29710

相关文章:

  • 缓存和数据库数据的一致性
  • Redis不同数据类型代码场景实践
  • 布隆过滤器
  • Redis持久化
  • 上下文与this指向
  • [数据库] Microsoft SQL Server 数据库
  • 02 | 在环境中使用Airsim插件
  • 01 | UE5.3+Airsim+VS2022+Windows10(无人机仿真环境)
  • 对于使用ant design组件库的疑问
  • 阅读《构建之法》提出的5个问题
  • 提示工程介绍
  • DshanPI-A1 RK3576 gstreamer播放16路视频与硬件加速
  • freertos的调度过程
  • 「2025 高一上学期笔记 / 日记」
  • 「2025 暑假日记 / 笔记」
  • 2025羊城杯初赛Misc-writeup
  • 将 GPU 级性能带到企业级 Java:CUDA 集成实用指南
  • 我的个人空间
  • 2025.10.12总结
  • Windows 文件管理器中重复的 OneDrive 图标原因与解决方案
  • 10.12总结
  • 【Python】pandas的向量化操作
  • docker部署doris
  • ES客户端8版本与ES服务端7版本的兼容问题
  • 使用Sender和io_uring改造Webserver
  • 乐理 -04 打拍子
  • 1012
  • 如何在Renpy尝试中调整人物和背景图像大小
  • 开源软件站
  • 如何安装claude code以及ccr code