图解一致性哈希

简介: 图解一致性哈希

起源

假设你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache 。

hash(object) % N

一切都运行正常,那么考虑如下的两种情况:

  1. 一个 cache 服务器 m down 掉了(在实际应用中必须要考虑这种情况),这样所有映射到 cache m 的对象都会失效。怎么办?需要把 cache m 从 cache 中移除,这时候 cache 是 N-1 台,映射公式变成了 hash(object)%(N-1)
  2. 由于访问加重,需要添加 cache ,这时候 cache 是 N+1 台,映射公式变成了 hash(object)%(N+1)

1 和 2 意味着什么?这意味着突然之间几乎所有的 cache 都失效了。对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务器。

再来考虑第三个问题,由于硬件能力越来越强,你可能想让后面添加的节点多做点活,显然上面的 hash 算法也做不到。

有什么方法可以改变这个状况呢,这就是 consistent hashing...

一致性哈希

一致性哈希把哈希值想象成一个环,比如说在 0 ~ 2^32-1 这个范围内,然后将节点(名字、IP等)求哈希之后分布到环上。当有访问请求时,把请求信息求哈希之后,寻找小于该哈希值的下一个节点。

当有节点宕机的时候,请求会依次查找下一个节点,从而不让所有节点的缓存都失效。

当加入新节点的时候,只会影响一个区间内的请求,也不会影响其他区间。

如下图所示:640.jpg

虚拟节点

以上虽然解决了大部分问题,但是还有三个问题:

  1. 节点有可能分布不均匀。
  2. 当一个节点因为负载过重宕机以后,所有请求会落到下一台主机,这样就有可能使下一台主机也宕机,这就是雪崩问题。
  3. 不同主机处理能力不同,如何配置不同的负载。

这时候可以引入虚拟节点。原始的一致性哈希中,每个节点通过哈希之后在环上占有一个位置,可以通过对每个节点多次计算哈希来获得多个虚拟节点。

比如说,本来我们通过节点的 IP 来计算哈希

hash('10.1.1.1') => n1
hash('10.1.1.2') => n2
hash('10.1.1.3') => n3

现在引入两倍的虚拟节点之后

hash('10.1.1.1-1') => n1-1
hash('10.1.1.1-2') => n1-2
hash('10.1.1.2-1') => n2-1
hash('10.1.1.2-2') => n2-2
hash('10.1.1.3-1') => n3-1
hash('10.1.1.3-2') => n3-2

如图所示:640 (1).jpg引入虚拟节点之后:

  1. 平衡性得到了直接改善
  2. 主机是交替出现的,所以当一个节点宕机后,所有流量会随机分配给剩余节点
  3. 可以给处理能力强的节点配置更多地虚拟节点。

最后,一致性哈希可以用跳表或者平衡二叉树来实现。

目录
相关文章
|
11月前
|
监控 安全 Linux
龙蜥社区及阿里云CentOS迁移方案|飞天技术沙龙-CentOS 迁移替换专场
本次分享的主题是龙蜥社区及阿里云 CentOS 迁移方案|飞天技术沙龙- CentOS 迁移替换专场,由阿里云产品专家周絮分享。主要分为三个部分: 1.背景介绍 2.方案选型 3.迁移支持
256 0
|
分布式计算 算法 大数据
探索操作系统的核心:调度与内存管理机制
【10月更文挑战第11天】 本文深入探讨了操作系统中两大核心功能——调度与内存管理机制。通过分析调度算法、进程状态转换及内存分配策略等关键方面,揭示了它们如何共同维护系统性能和稳定性。旨在为读者提供对操作系统内部运作的深刻理解,同时引起对优化策略的思考。
391 5
|
Kubernetes Nacos 容器
nacos注册不上
我正在使用开源的Nacos,并已在Kubernetes中部署了Nacos服务,通过端口映射可在集群外访问Nacos控制台。Kubernetes使用NodePort类型暴露了8848、9848、9849、7848和9555端口,但在尝试注册时遇到问题,出现“Client not connected, current status: STARTING”的错误,导致启动失败。
208 1
|
机器学习/深度学习 人工智能 自动驾驶
5G NR:下一代移动通信的基石
5G NR:下一代移动通信的基石
1498 1
|
算法 网络性能优化
Audio Over IP的PTP时钟初探
Audio Over IP的PTP时钟初探
227 0
|
数据采集 存储 前端开发
豆瓣评分9.0!Python3网络爬虫开发实战,堪称教学典范!
今天我们所处的时代是信息化时代,是数据驱动的人工智能时代。在人工智能、物联网时代,万物互联和物理世界的全面数字化使得人工智能可以基于这些数据产生优质的决策,从而对人类的生产生活产生巨大价值。 在这个以数据驱动为特征的时代,数据是最基础的。数据既可以通过研发产品获得,也可以通过爬虫采集公开数据获得,因此爬虫技术在这个快速发展的时代就显得尤为重要,高端爬虫人才的收人也在逐年提高。
|
弹性计算 Ubuntu Linux
阿里云服务器“镜像”怎么选择?看这一篇文章就够了!
阿里云服务器镜像是服务器的“装机盘”,用于安装操作系统、初始化数据和预装软件。阿里云提供五种镜像类型:公共镜像(官方提供,正版授权)、自定义镜像(用户创建)、共享镜像(其他账户共享)、云市场镜像(官方或第三方发布)。选择镜像需考虑应用需求,如程序语言、服务器配置等。推荐Linux用户选择Alibaba Cloud Linux,Windows用户选择Windows Server 2022数据中心版。中国大陆地域的服务器支持免费无限次更换操作系统,而海外地域服务器更换系统有限制。Alibaba Cloud Linux是由阿里云官方推出并深度优化的Linux发行版,兼容RHEL/CentOS生态,
5960 1
|
Java 测试技术 API
详解单元测试问题之Mockito的注入过程如何解决
详解单元测试问题之Mockito的注入过程如何解决
379 1
|
监控 网络协议 Linux
在Linux中,如何查看当前系统每个 IP 的连接数?
在Linux中,如何查看当前系统每个 IP 的连接数?