面试场景题系列:设计一致性哈希系统

为了实现横向扩展,在服务器之间高效和均匀地分配请求/数据是很重要的。一致性哈希是为了达成这个目标而被广泛使用的技术。首先,我们看一下什么是重新哈希问题。

1 重新哈希的问题

如果你有n个缓存服务器,常见的平衡负载的方法是使用如下哈希方法:

服务器序号=hash(key)%N(N代表服务器池的大小)

我们用一个示例来说明它是如何工作的。如表-1所示,我们有4个服务器,有8个字符串型的键(key)及其对应的哈希值(hash)。

表-1

为了获取存储了某个键的服务器的序号,我们需要做求余运算f(key)%4。比如,hash(key0)%4=1,表示客户端必须联系server1以获取缓存的数据。图-1基于表-1展示了键的分布。

图-1

这个方法在服务器池的大小固定不变的时候效果很好,并且数据的分布是均匀的。但是,当添加服务器或现有服务器被移除时问题就产生了。举个例子,如果server1下线,服务器池的大小就变成3。使用同样的哈希函数,对于同一个键,我们得到的哈希值不变。但是因为服务器数量减1,通过求余操作计算出的服务器序号就与之前的不同了。这可能会导致数据分布不均匀或错误地分配给错误的服务器。“哈希值%3”得到的结果如表-2所示。

表-2

图-2展示了表-2中键的分布。

图-2

如图-2所示,大部分的键都被重新分配了,不仅仅是原来存储在宕机服务器(server1)中的那些键。这意味着当server1宕机时,大部分缓存客户端都会连接错误的服务器来获取数据。这会导致大量的缓存未命中(Cache Miss)。一致性哈希是缓解这个问题的有效技术。

2 一致性哈希

根据维基百科中的定义,“一致性哈希是一种特殊的哈希。如果一个哈希表被调整了大小,那么使用一致性哈希,则平均只需要重新映射k/n个键,这里k是键的数量,n是槽(Slot)的数量。对比来看,在大多数传统的哈希表中,只要槽的数量有变化,几乎所有的键都需要重新映射一遍”。

2.1 哈希空间和哈希环

现在我们了解了一致性哈希的定义,接下来看看它是如何工作的。假设我们使用SHA-1作为哈希函数f,哈希函数的输出值范围是:x0,x1,x2,x3,…,xn。在密码学里,SHA-1的哈希空间是0到2160-1。这意味着x0对应0,xn对应2160-1。图-3展示了哈希空间。

连接x0和xn两端,我们可以得到一个如图-4所示的哈希环。

图-3

图-4

2.2 哈希服务器

使用同样的哈希函数f,我们根据服务器的IP地址或者名字将其映射到哈希环上。图-5展示了4个服务器被映射到哈希环上的情况。

图-5

2.3 哈希键

值得一提的是,这里使用的哈希函数跟第1节中的不一样,这里没有求余运算。如图-6所示,4个键(key0、key1、key2和key3)被映射到哈希环上。

图-6

2.4 查找服务器

为了确定某个键存储在哪个服务器上,我们从这个键在环上的位置开始顺时针查找,直到找到一个服务器为止。图-7解释了这个过程,通过顺时针查找可知:key0存储在server0上;key1存储在server1上;key2存储在server2上;key3存储在server3上。

图-7

2.5 添加服务器

按照上面描述的逻辑,如果要在哈希环中添加一个新的服务器,只有少部分键需要被重新映射到新的服务器上,大部分键的位置保持不变。

如图-8所示,添加新的服务器后(server4),只有key0需要重新分配位置。key1、key2和key3都保留在原来的服务器上。我们仔细看一下这个逻辑。在添加server4之前,key0存储在server0上。现在,因为server4是从key0在哈希环上的位置开始顺时针查找时遇到的第一个服务器,所以key0会被存储到server4上。根据一致性哈希算法,其他的键不需要重新分配位置。

图-8

2.6 移除服务器

当一个服务器被移除时,如果使用一致性哈希,就只有一小部分键需要重新分配位置。如图-9所示,当移除server1时,只有key1需要重新映射到server2上,其他键则不受影响。

图-9

2.7 两个问题

一致性哈希算法是麻省理工学院的David Karger等人首先提出的。它的基本步骤如下:

•使用均匀分布的哈希函数将服务器和键映射到哈希环上。

•要找出某个键被映射到了哪个服务器上,就从这个键的位置开始顺时针查找,直到找到哈希环上的第一个服务器。

这里有两个问题。第一,考虑到可以添加或移除服务器,所以很难保证哈希环上所有服务器的分区大小相同。分区是相邻服务器之间的哈希空间。在哈希环上分配给每个服务器的分区可能很小,也可能很大。如图-10所示,如果server1被移除,server2的分区(用双向箭头标记)就是server0和server3的两倍大。

图-10

第二,有可能键在哈希环上是非均匀分布的。举个例子,如果服务器映射的位置如图-11所示,则大部分键都会被存储在server2上,而server1和server3上没有数据。

图-11

一种称为虚拟节点或者副本的技术被用来解决这些问题。

2.8 虚拟节点

虚拟节点是实际节点在哈希环上的逻辑划分或映射。每个服务器都可以用多个虚拟节点来表示。如图-12所示,服务器server0和server1都有3个虚拟节点。“3”这个数字是任意选的,在真实世界中,虚拟节点的数量要大得多。这里,我们不用s0而是改用s0_0、s0_1和s0_2来表示哈希环上的server0;用s1_0、s1_1和s1_2来表示哈希环上的server1。通过虚拟节点,每个服务器都对应多个分区。标记为s0的分区(边缘)是由server0来管理的。标记为s1的分区是由server1来管理的。

图-12

为了找到某个键存储在哪个服务器上,我们从这个键所在的位置开始,顺时针找到第一个虚拟节点。如图-13所示,为了确定key0键存储在哪个服务器上,我们从key0所在的位置出发,顺时针查找并找到虚拟节点s1_1,它对应的是server1。

当虚拟节点的数量增加时,键的分布就会变得更均匀。这是因为有更多虚拟节点以后,标准差会变小,从而导致数据分布更均匀。标准差衡量的是数据的分散程度。一个线上研究[插图]所做的实验显示:使用100个或200个虚拟节点时,标准差的均值约为10%(100个虚拟节点)和5%(200个虚拟节点)。当我们增加虚拟节点的数量时,标准差会更小。但是,这也意味着需要更多的空间来存储虚拟节点的数据。这需要权衡,我们可以调整虚拟节点的数量来满足系统的需求。

图-13

2.9 找到受影响的键

当添加或移除服务器时,有一部分键需要重新分配位置。如何找到受影响的键的范围并重新为它们分配位置呢?

如图-14所示,服务器server4被添加到哈希环上。从server4(新添加的节点)开始,沿着哈希环逆时针移动,直到遇到另一个服务器(图中为server3)为止,这就是受影响的键的范围。从图5-14可以看出,位于server3和server4之间的键需要重新分配给server4。

如图-15所示,服务器server1被移除。从server1(被移除的节点)开始,沿着哈希环逆时针移动,直到遇到另一个服务器(图中为server0)为止,这就是受影响的键的范围。从图-15可以看出,位于server0和server1之间的键需要重新分配给server2。

图-14

图-15

总结

在本章中,我们对一致性哈希进行了深入的讨论,包括为什么需要进行一致性哈希和它是怎么工作的。一致性哈希有如下好处:

•添加或者移除服务器的时候,需要重新分配的键最少。

•更容易横向扩展,因为数据分布得更均匀。

•减轻了热点键问题。过多访问一个特定分区可能会导致服务器过载。想象一下,如果Katy Perry、Justin Bieber和Lady Gaga的数据都被存储在同一个分区上会是什么情形。一致性哈希通过使数据更均匀地分布来减轻这个问题。

一致性哈希被广泛地应用于现实世界的系统中,包括一些非常出名的系统,例如:

•亚马逊Dynamo数据库的分区组件。

•Apache Cassandra集群的数据分区。

•Discord聊天应用。

•Akamai内容分发网络。

•Maglev网络负载均衡器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【视觉惯性SLAM:相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容,它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型,以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…

物联网网络中的设备认证方法

论文标题:DEVICE AUTHENTICATION METHOD IN INTERNET OF THINGS NETWORKS(物联网网络中的设备认证方法) 作者信息: A.Ya. Davletova,West Ukrainian National University, 11, Lvivska Str. Ternopil, 46009, Ukraine…

mysql,数据库数据备份

mysql 一.数据库备份概念1.备份分类2.备份策略3.备份三要素二.完全备份操作1.物理备份(还原),冷备份2.逻辑备份,温备份三.percona软件的xtrabackup工具备份(2备份,3还原),增量,差异1.percona软件安装2.增量备份(还原)3.差异备份四.binlog日志1.binlog日志概念2.查看binlog日志信…

GitLab部署到阿里云服务器上

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。 一、安装 1.创建一…

iOS + watchOS Tourism App(含源码可简单复现)

iOS-app-trip-in-HK - how to study and get the new product in 2 weeks ⚠️ 本文源码已上传到GitHub: https://github.com/boots-coder/whereWeGo during 12. 3 - 12.17 14 days ps:本人有java springboot开发和python的人工智能的基础知识背景; 但…

Linux------进程处理(system库函数)

视频&#xff1a; 【尚硅谷嵌入式Linux应用层开发&#xff0c;linux网络编程&#xff0c;linux进程线程&#xff0c;linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?p34&vd_source342079de7c07f82982956aad8662b467 #include <stdlib.h> #include <…

【数据库原理】数据增删改查,DML、单表查询、多表连接查询

DML数据操纵语言&#xff0c;处理对象是数据本身。 DDL数据定义语言&#xff0c;处理对象是数据表的结构。 数据库中数据处理主要包括增删改查。查询属于重点部分。 假设数据库中有表&#xff1a; student(sno,sname,sex,class); #学生&#xff08;学号&#xff0c;姓名&…

JAVA HTTP压缩数据

/*** 压缩数据包** param code* param data* param resp* throws IOException*/protected void writeZipResult(int code, Object data, HttpServletResponse resp) throws IOException {resp.setHeader("Content-Encoding", "gzip");// write到客户端resp…

UDP传输层通信协议详解

引言 在计算机网络通信的广阔天地中&#xff0c;传输层协议扮演着至关重要的角色。它们负责在网络中的两个终端之间建立、管理和终止数据传输。在众多传输层协议中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;以其独特的特性和应…

计算机组成原理的学习笔记(4)--数据的表示与运算·其三 补码的乘法以及原码补码的除法

学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记&#xff0c;仅用于学习交流。 1.补码乘法 基本操作 与正常原码乘法差不多&#xff0c;逐位乘&#xff0c;随后相加&#xff0c;而与符号位有关的一项也叫校正项 Booth算法 从乘数的最低位开始&#xff0c…

【人工智能】使用Python构建推荐系统:从协同过滤到深度学习

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 推荐系统是现代互联网的重要组成部分,广泛应用于电商、社交媒体和流媒体平台中。本文详细介绍了如何使用Python构建推荐系统,从传统的协同…

K8s证书过期

part of the existing bootstrap client certificate is expired: 2023-11-27 12:44:12 0000 UTC 查看运行日志&#xff1a; journalctl -xefu kubelet 重新生成证书&#xff1a; #重新生成证书 kubeadm alpha certs renew all #备份旧的配置文件 mv /etc/kubernetes/*.conf…

Llama 3 模型系列解析(一)

目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练&#xff08;Over-training&#xff09; 3. 计算训练预算 4. 如何逐步估算和确定最优模型&#xff1f; 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…

BenchmarkSQL使用教程

1. TPC-C介绍 Transaction Processing Performance Council (TPC) 事务处理性能委员会&#xff0c;是一家非盈利IT组织&#xff0c;他们的目的是定义数据库基准并且向产业界推广可验证的数据库性能测试。而TPC-C最后一个C代表的是压测模型的版本&#xff0c;在这之前还有TPC-A、…

[react 3种方法] 获取ant组件ref用ts如何定义?

获取ant的轮播图组件, 我用ts如何定义? Strongly Type useRef with ElementRef | Total TypeScript import React, { ElementRef } from react; const lunboRef useRef<ElementRef<typeof Carousel>>(null); <Carousel autoplay ref{lunboRef}> 这样就…

【ES6复习笔记】let 和 const 命令(1)

ES6 中的 let 和 const 关键字 1. let 关键字 let 关键字用于声明一个变量&#xff0c;它具有块级作用域&#xff0c;这意味着变量只在声明它的块内有效。与 var 不同&#xff0c;let 不允许在同一作用域内重复声明同一个变量。 2. const 关键字 const 关键字用于声明一个常…

mysql,数据库主从同步搭建

1.mysql主从同步1.主从同步原理(1)复现binlog日志中的sql语句(2)主服务器启动binlog日志(3)从服务器启动binlog日志,io线程,sql线程2.主从同步结构一主一从一主多从级联复制互为主从(keepalived高可用)3.mysql复制模式异步复制:主服务器处理完sql直接返回给客户端结果半同步复制…

从Condition开始,回顾AQS

Synchronized和Reentrantlock的挂起逻辑 synchronized中有两个核心的结构 EntryList cxq&#xff1a;等待拿锁的线程存储位置Waitset&#xff1a;被执行wait方法的线程存储位置 流转&#xff1a; 线程获取锁资源失败&#xff0c;扔到EntryList cxq线程持有锁资源&#x…

预览和下载 (pc和微信小程序)

1.微信小程序 预览pdf 或者 图片等 //utils.js 文件//通过接口返回文件链接 打开文档 export default function previewFile({ downLinkUrl, tempFilePath }) {let url "https://" downLinkUrl.replace("http://", "").replace("https:…

用例图和活动图的区别与联系

在软件开发过程中&#xff0c;需求分析是至关重要的一步。为了更好地理解和描述系统的功能需求&#xff0c;开发人员通常会使用各种图形化工具。其中&#xff0c;用例图和活动图是两种非常常用的工具。虽然它们都用于描述系统的行为&#xff0c;但各自具有不同的特点和适用场景…