CHAPTER 5: 《DESIGN CONSISTENT HASHING》 第5章 《设计一致的哈希》

news2024/11/15 20:11:59

CHAPTER 5: DESIGN CONSISTENT HASHING

为了实现水平扩展,有效且均匀地分发请求/数据是很重要的在服务器上。一致散列是实现这一目标的常用技术。但首先,让我们深入了解一下这个问题。

重组问题

如果您有n个缓存服务器,那么平衡负载的常用方法是使用以下散列方法:
serverIndex = hash(key) % N,其中N为服务器池的大小。让我们用一个例子来说明它是如何工作的。如表table5-1所示,我们有4台服务器8串键和它们的哈希值。
在这里插入图片描述
为了获取存储键的服务器,我们执行模块化操作f(key) % 4。为实例,hash(key0) % 4 = 1表示客户端必须联系服务器1才能获取缓存的数据。根据table5-1,密钥分配如figure5-1所示。
在这里插入图片描述
当服务器池的大小和数据分布固定时,这种方法在偶数情况下工作得很好。但是,当添加新服务器或移除现有服务器时,就会出现问题。例如,如果服务器1脱机,则服务器池的大小变为3。使用同样的哈希函数,我们得到一个键相同的哈希值。但是应用模块化Operation为我们提供了不同的服务器索引,因为服务器的数量减少了1。我们通过应用hash % 3得到如table5-2所示的结果:
在这里插入图片描述
根据table5-2,新的密钥分布如figure5-2所示。
在这里插入图片描述
如figure5-2所示,大多数密钥都是重新分发的,而不仅仅是最初存储在脱机服务器(服务器1)。这意味着当服务器1脱机时,大多数缓存客户机也会脱机连接到错误的服务器以获取数据。这将导致大量缓存未命中。一致的散列是缓解此问题的有效技术。

一致性哈希

引用自维基百科:“一致性哈希是一种特殊的哈希,当a重新调整哈希表大小并使用一致哈希,只需要重新映射k/n个键平均,k是键的个数,n是槽的个数。相反,在大多数情况下在传统的哈希表中,数组槽数的变化会导致几乎所有键都被替换贴图[1]”。

哈希空间和哈希环

现在我们了解了一致哈希的定义,让我们来看看它是如何工作的。假设使用SHA-1作为哈希函数f,哈希函数的输出范围为:x0, x1, x2,在密码学中,SHA-1的哈希空间从0到2^160 -1。也就是x0对应于0,xn对应于2^160 - 1,其他哈希值都在中间在0到2^160 - 1之间。哈希空间如figure5-3所示。
在这里插入图片描述
将两端集合,得到一个哈希环,如图figure5-4所示:
在这里插入图片描述

散列服务器

使用相同的哈希函数f,我们根据服务器IP或名称将服务器映射到环上。如figure5-5所示,哈希环上映射了4个服务器。
在这里插入图片描述

散列键

值得一提的是,这里使用的哈希函数与“the”中的哈希函数不同重新散列问题”,并且没有模块化操作。如figure5-6所示,4个缓存键(key0、key1、key2和key3)被散列到散列环上
在这里插入图片描述要确定键存储在哪个服务器上,我们从键的位置顺时针进行直到找到服务器为止。流程如figure5-7所示。顺时针方向,key0被存储在服务器0上;Key1存储在服务器1上;Key2存储在服务器2上,key3存储在服务器上3.
在这里插入图片描述

添加服务器

使用上面描述的逻辑,添加一个新服务器只需要重新分配一个键的分数。
在figure5-8中,新增服务器4后,只需要重新分配key0。K1 k2,还有K3仍然在相同的服务器上。让我们仔细看看其中的逻辑。在添加服务器4之前,Key0存储在服务器0上。现在,key0将存储在服务器4上,因为服务器4是第一个从key0在环上的位置顺时针移动所遇到的服务器。其他键是不基于一致性哈希算法重新分发。
在这里插入图片描述

移除服务器

当服务器被删除时,只有一小部分密钥需要重新分配散列。在图5-9中,当服务器1被移除时,只有key1需要重新映射到服务器2。其余的钥匙不受影响。
在这里插入图片描述

基本方法有两个问题

一致性哈希算法是由Karger等人在MIT[1]提出的。基本步骤是:

  • 使用统一分布的哈希函数将服务器和密钥映射到环上。
  • 要找出一个键映射到哪个服务器,从键位置顺时针走,直到找到环上的第一个服务器。

这种方法存在两个问题。首先,不可能保持相同的规模考虑到可以添加或删除服务器的所有服务器在环上的分区。一个分区是相邻服务器之间的哈希空间。有可能是分配给每个服务器的环上的分区要么非常小,要么相当大。在figure5-10中,如果s1被删除后,s2的分区(用双向箭头突出显示)是so0的两倍大s3的分区。在这里插入图片描述其次,环上可能存在不均匀的密钥分布。例如,如果服务器映射到如figure5-11所示的位置,大部分密钥存储在服务器2上。但是,服务器1和服务器3没有数据。
在这里插入图片描述
使用一种称为虚拟节点或副本的技术来解决这些问题。

虚拟节点

虚拟节点是指实节点,每台服务器由多个虚拟节点表示在环上。在figure5-12中,服务器0和服务器1各有3个虚拟节点。3是任意选择;而在现实世界的系统中,虚拟节点的数量要大得多。我们不用s0,而是用s0_0、s0_1和s0_2表示环上的服务器0。同样的,S1_0、s1_1和s1_2代表环上的服务器1。对于虚拟节点,每个服务器都是负责多个分区。标签为50的分区(边)由服务器0管理。另一方面,标签为s1的分区由服务器1管理。
在这里插入图片描述
要查找密钥存储在哪个服务器上,我们从密钥的位置顺时针查找环路上遇到的第一个虚拟节点。在figure5-13中,查看存储的服务器k0On,我们从k0的位置顺时针走,找到虚拟节点s1_1,它指向服务器1。
在这里插入图片描述随着虚拟节点数量的增加,密钥的分布变得更加平衡。这是因为虚拟节点越多,标准差越小,导致均衡的数据分布。标准偏差衡量的是数据的分布情况。的在线研究b[2]进行的一项实验结果表明,有一个或两个100个虚拟节点,标准差在5%(200个虚拟节点)~ 10%之间(100个虚拟节点)的平均值。标准差会变小,当我们增加虚拟节点数。但是,需要更多的空间来存储有关虚拟节点的数据。这是一种权衡,我们可以调整虚拟节点的数量以适应我们的系统需求。

查找受影响的键

当添加或删除服务器时,需要重新分发一小部分数据。我们怎么能找到受影响的范围来重新分配键?如figure5-14所示,服务器4加入到环中。受影响的范围从s4 (new添加节点)并沿环逆时针移动,直到找到服务器(s3)。因此,键
位于s3和s4之间的需要重新分配到s4。
在这里插入图片描述
如figure5-15所示,当一台服务器(s1)被移除时,影响范围从s1开始(移除的节点)并沿环逆时针移动,直到找到服务器(s0)。因此,位于s0和s1之间的键必须重新分配到s2。
在这里插入图片描述

总结

在本章中,我们对一致性哈希进行了深入的讨论,包括为什么要这样做需要和它的工作原理。一致性哈希的好处包括:

  • 当服务器被添加或删除时,最小化的密钥将被重新分配。
  • 容易横向扩展,因为数据分布更均匀。
  • 缓解热点密钥问题。对特定分片的过度访问可能导致服务器故障过载。想象一下,凯蒂·佩里、贾斯汀·比伯和Lady Gaga的数据都出现在同样的碎片。一致散列通过更多地分布数据来帮助缓解这个问题均匀。

一致哈希被广泛应用于现实世界的系统中,包括一些值得注意的系统:

  • Amazon Dynamo数据库[3]的分区组件
  • Apache Cassandra[4]的跨集群数据分区
  • 不和聊天应用[5]
  • Akamai内容分发网络b[6]
  • 磁悬浮网络负载平衡器[7]
    恭喜你走了这么远!现在给自己点鼓励吧。好工作!

参考资料 Reference materials

[1] Consistent hashing: https://en.wikipedia.org/wiki/Consistent_hashing
[2] Consistent Hashing:
https://tom-e-white.com/2007/11/consistent-hashing.html
[3] Dynamo: Amazon’s Highly Available Key-value Store:
https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf
[4] Cassandra - A Decentralized Structured Storage System:
http://www.cs.cornell.edu/Projects/ladis2009/papers/Lakshman-ladis2009.PDF
[5] How Discord Scaled Elixir to 5,000,000 Concurrent Users:
https://blog.discord.com/scaling-elixir-f9b8e1e7c29b
[6] CS168: The Modern Algorithmic Toolbox Lecture #1: Introduction and Consistent
Hashing: http://theory.stanford.edu/~tim/s16/l/l1.pdf
[7] Maglev: A Fast and Reliable Software Network Load Balancer:
https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44824.pdf

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

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

相关文章

PCB射频电路四大基础特性及设计技巧

由于射频(RF)电路为分布参数电路,在电路的实际工作中容易产生趋肤效应和耦合效应,所以在实际的PCB设计中,会发现电路中的干扰辐射难以控制。 如:数字电路和模拟电路之间相互干扰、供电电源的噪声干扰、地线不合理带来的干扰等问题…

catkin_make_workspace

ERROR1 : CMake Error at /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake:113 (message): Project ‘cv_bridge’ specifies ‘/usr/include/opencv’ as an include dir, which is not found. It does neither exist as an absolute directory nor in ‘${{pr…

Vue-列表过滤

列表过滤 对已知的列表进行数据过滤(根据输入框里面的内容进行数据过滤) 编写案例 通过案例来演示说明 效果就是这样的 输入框是模糊查询 想要实现功能,其实就两大步,1获取输入框内容 2根据输入内容进行数据过滤 绑定收集数据 我们可以使用v-model去…

6.3 收敛性与稳定性

6.3.1 收敛性 数值计算方法的收敛性是指,当取步长趋近于零时,数值解趋近于精确解的速度。一般来说,数值计算方法的收敛性是判断其优劣的重要指标之一。 数值计算方法的收敛性可以通过数学分析来研究,一般需要对数值解和精确解之…

08-Node.js—nvm

目录 1、介绍2、使用2.1 下载安装2.2 常用命令2.2.1 nvm list available2.2.2 nvm list2.2.3 nvm install 18.12.12.2.4 nvm install latest2.2.5 nvm uninstall 18.12.12.2.6 nvm use 18.12.1 参考 1、介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工…

系统集成项目管理工程师——考试重点(三)项目管理一般知识

1.项目定义: 为达到特定的目的,使用一定资源,在确定的期间内,为特定发起人提供独特的产品、服务或成果而进行的一系列相互关联的活动的集合。 2.项目目标: 成果性目标:项目产品本身 约束性目标&…

频繁GC引起卡顿问题排查与解决

一 问题描述 今天测试组更新测试环境后发现系统卡顿,无法办理任何业务,重启系统后问题仍然存在。已经到项目后期,迭代测试时间十分紧张。此问题直接影响到项目进度 二 排查过程 1.执行命令top Linux 下常用top命令显示系统中各个进程的资…

PID原理

PID控制器(比例-积分-微分控制器),由比例单元(P)、积分单元(I)和微分单元(D)组成。 可以通过调整这三个单元的增益Kp,Ki和Kd来调定其特性,PID控制…

PowerDesigner 15 安装、汉化、逆向生成ER图、物理模型转逻辑模型、生成sql及简单使用

文章目录 前言PowerDesigner 15 安装、汉化、逆向生成ER图、物理模型转逻辑模型、生成sql及简单使用1. 安装2. 汉化3. 使用4. 逆向生成ER图4.1. 创建新模型4.2. 根据sql逆向生成er图 5. 物理模型新建表6. 物理模型转逻辑模型7. 生成sql语句 前言 如果您觉得有用的话&#xff0c…

Modelsim10.7仿真报错

把之前老版本的modelsim换掉了,新的装好仿真发现有点小毛病,记录以下 使用modelsim10.7仿真时出现错误,编译通过但报以下错误 ** Note: (vsim-3812) Design is being optimized…** INTERNAL ERROR: vopt returned success but vsim could …

arthas的简单使用

目录 arthas是什么为什么要使用arthasarthas能做什么安装arthas前提准备arthas主要命令trace命令watch命令monitor命令jad命令dashboard命令Thread命令sc命令mc命令redefine命令 实战演练1.定位到需要修改的类2.将定位到的.class文件反编译成.java文件3.修改.java文件4.将修改后…

不同局域网下使用Python自带HTTP服务进行文件共享「端口映射」

文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 转载自内网穿透工具的文章:Python一行代码实现文件共享【内网穿透公网访问…

Spring Bean生命周期源码详解

文章目录 Bean生命周期源码生成BeanDefinitionSpring容器启动时创建单例Bean合并BeanDefinitiongetBean()方法加载类实例化前实例化BeanDefinition的后置处理实例化后依赖注入执行Aware回调初始化前初始化初始化后销毁逻辑 Bean生命周期源码 我们创建一个ApplicationContext对…

深度学习:神经网络的前向传播过程

Author:龙箬 Computer Application Technology Change the World with Data and Artificial Intelligence ! CSDNweixin_43975035 哲学与爱情是我永远都搞不懂的两件事情 注: 以三层神经网络为例说明神经网络的前向传播过程激活函数采用 R e L U ReLU ReLU 函数 w…

搞懂位图和布隆过滤器

文章目录 位图腾讯面试题位图概念位图实现位图的应用位图的应用题 布隆过滤器布隆过滤器提出布隆过滤器概念布隆过滤器实现原理布隆过滤器的应用场景如何选择哈希函数个数和布隆过滤器长度 - - 目的减少误判率布隆过滤器的实现布隆过滤器优点布隆过滤器缺陷 海量数据面试题哈希…

科普帖:如何提升Watch Buds的音质体验,看这里!

对于追求小巧便携的友友们来说,华为Watch Buds耳机可谓是非常惊喜的存在。华为Watch Buds耳机形态独树一帜,同时在耳机控制上做了一个广域耳廓触控功能,是华为首次采用的功能。即耳机、耳廓或靠近耳屏的脸颊区域都可操控,双击可接…

【MYSQL】Java的JDBC编程(idea连接数据库)

1. 配置 (1)新建一个项目 (2)Build System 那里选择Maven,下一步Create (3)配置pom.xml文件 首先查看自己的MYSQL版本:进入MySQL命令窗口 我的MYSQL版本是8.0版本的. 下一步,…

【Java基础】Java总览

一、what-什么是Java? Java是一种面向对象的编程语言,其他面向对象的编程语言还有C#,C,Python,Python,golang,VB等。 1、和其他语音对比 对比项\语言CCJava上线时间1972年1979年1995年特点面向…

[pgrx开发postgresql数据库扩展]3.hello world全流程解析

数据库的扩展开发框架 一般来说,数据库的扩展开发主要有的目的就是扩展数据库引擎的能力(不管是用pgrx还是其他的框架都一样): 例如PostgreSQL上最著名的扩展PostGIS,就是扩展了PG数据库的空间数据支持能力&#xff…

Linearx配置环境

代码地址 gitssh.dev.azure.com:v3/linearx/PowerDDS/PowerDDS LinearX-5G Wifi pwd: 50186058 Windows报错可以搜索错误代码找官方给出的解决方案 最新版本cmake:ubuntu 20.04安装(升级)cmake - 知乎 (zhihu.com) gtest:gtest的安装_liuzubing的博客…