一致性哈希

news2024/12/23 22:46:11

一、简介

这个算法是一种特殊的哈希算法,目的是解决分布式缓存的问题。
普通哈希算法在分布式存储具有较大的局限性,简单的讲就是难以扩展。
一致性哈希相对而言具有较好的容错性和可扩展性,更加适合现在的分布式存储。

二、经典哈希版本

众所周知,哈希表是通过计算哈希值,并将其取模的方式来对数据进行定位,最后通过拉链法来进行数据存储。
经典哈希在分布式上的应用也是一样的。

  • 比如说,你现在有3台服务器,分别命名为0,1,2;
    那么你放一串数据进来后
    先算哈希值;
    再用哈希值模3,得到该存在哪台服务器上;
    之后就传数据存储。

图不是原创,后面会给出链接

这样是行得通的,但是同时这种模式有非常严重隐患,每当服务器数量发生改变,数据的迁移量都是海量的,例如:

  1. 当你一台服务器出问题,需要紧急下线,那么3台服务器中的所有内容都需要根据哈希值重新分配服务器
  2. 当数据量增长到服务器的存储阈值,需要新增服务器时,同样所有已存在的数据都需要重新进行分配

三、一致性哈希

为了解决经典哈希的短板,一致性哈希大大缩小了数据的迁移成本,怎么做到的呢?

1、哈希环

  • 将哈希值想象成一个周长2**64的圆
  • 将每一个服务器用一个哈希值表示,并且假设这个哈希值均分哈希环
    于是:
    哈希环
    那么怎么判断数据该存进哪个服务器呢?
  • 每一个服务器都只存储该哈希值在服务器到顺时针下一个服务器节点区间的所有值
    比如0位置,这里的数据将会被存储在服务器2上
    实际上所有哈希值在服务器2到服务器0位置上的,都会被存储在服务器2上。

2、这种情况下数据迁移

现在新添加一台服务器在环上,不考虑均匀分布的问题,如何做数据迁移?
添加服务器节点
如上图所示,添加一台服务器3进去,那么我们只需要迁移所有哈希值在服务器3 到 服务器1 上的数据,这种方式下,数据迁移的代价无疑是大大降低的。

3、虚拟节点

刚才上面提到了一个问题,服务器的均匀分布
当服务器在环上的分布不均匀时,有可能出现极端情况,比如一台服务器负载过大,一台负载较小。这种情况也被称为哈希环的倾斜,容易造成服务器的奔溃
为了解决这个问题,就有了虚拟节点这个东西。

  • 首先忘记服务器节点刚才的定义,将服务器节点分为两部分
  • 一个部分为物理节点,就是实际上的服务器;
  • 一个部分为虚拟节点,专门用来在哈希环上占位置;
  • 其中一个物理节点下对应多个虚拟节点,即一台服务器存储 所有对应的虚拟节点 管理范围内的数据。

1>例:

设:

  • 有3个物理节点
  • 每个物理节点上存储了500个虚拟节点

则以下图中的x,y,z为例

  • 首先x,y,z之间不存在其他虚拟节点
  • 哈希值在x到y之间的会被存储在物理节点2上
  • 哈希值在y到z之间的会被存储在物理节点0上
    哈希环
  • 之后加入新的物理节点数据迁移的话,也同样遵循之前的逻辑,同样因为时随机分布,数据量较大时它绝对可以实现数据的均匀分布;
  • 另外还可以通过设置虚拟节点的数量,来实现不同负载服务器的充分利用,比如一台性能比较强的,可以给2000个虚拟节点,性能弱一点给700个。

这个技术很厉害,这种思想也很值得学习。

参考文献:
https://blog.csdn.net/a745233700/article/details/120814088

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

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

相关文章

SpringBoot+Vue项目实践课程教学管理平台

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

✿✿✿JavaScript --- JSON

目录 1.JSON的简介 2.JSON的语法规则 3.JSON 字符串转换为 JavaScript 对象 4.常用的JSON相关的函数 5.JSON对象的遍历 6.补充:JS中的this关键字 1.JSON的简介 JSON( JavaScript Object Notation ) 是用于存储和传输数据的格式&#xf…

Android studio配置大内存,编译速度更快!

本文使用的是windows 10系统,Android studio 版本是Android Studio Chipmunk | 2021.2.1(松鼠) 目录为什么要配置大内存?默认内存是多少?如何扩大内存配置?这个配置保存在哪个文件?文件在哪里&a…

二叉树10:二叉树的最小深度

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:111. 二叉树的最小深度 题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近…

Asp.Net Core实现最基本的Http服务

概述 和.NetFramework时代不同,Core是可以自承载的,也就说开发好的Web项目,可以打包成exe直接运行的,而不必放到IIS这样的环境中。接下来,我们写点代码,体验一下Asp.Net Core自带的Http功能。 初体验 所谓…

嵌入式微功耗RTU的功能与特点介绍、技术参数详情

平升电子嵌入式微功耗RTU,可灵活嵌入至各类仪表、传感器和工业设备中,定时采集设备数据并通过4G/5G/NB-IoT远传至监管软件,实现设备联网。 嵌入式微功耗RTU设计小巧、方便集成,微功耗运行,支持标准水资源/水文/环保/M…

Biotin-PEG-AC,Biotin-PEG-Acrylate,生物素PEG丙烯酸酯线性杂双功能PEG试剂

英文名称:Biotin-PEG-AC,Biotin-PEG-Acrylate 中文名称:生物素-聚乙二醇-丙烯酸酯 生物素-聚乙二醇-丙烯酸酯是一种含有生物素和丙烯酸酯的线性杂双功能聚乙二醇试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。生物素能与亲和素和…

智创万物,数赢未来——如何助推数智时代的发展浪潮

数智化核心特征 可视化 消费者的行为可以看得见,生产者的行为也可以看得见。产业互联网或者消费互联网非常重要的一点就是要对消费者行为和生产者行为的可视化,其背后是数字化的力量。 可量化 可量化意味着企业家可以对管理流程进行改造,…

echarts的legend——图例样式的配置

认识图例: 以上几张图表中,红色圆圈部分即图例 echarts图表中的图例,有形状,颜色,位置等等各种样式的不同配置。 echarts官网配置项手册里有非常详细的内容,我们挑几种常用的看看,加深对legend属…

深度学习——物体检测算法:R-CNN,SSD,YOLO(笔记)

一,R-CNN 1.区域卷积神经网络R-CNN 首先从输入图像中提取若干个锚框,并标注好它们的类别和偏移量。然后用卷积神经网络对每一个锚框进行前向传播抽取特征。最后用每个提议区域的特征来预测类别和边界框。 ①使用启发式搜索算法来选择锚框 ②使用预训练…

【第一周学习——认识 O(N*logN) 的排序[ 归并排序 、堆排序、快速排序 ]

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:《数据结构与算法》 📧如果文章知识点有错误的地方&a…

力扣(LeetCode)187. 重复的DNA序列(C++)

哈希表 直观思考,由于限定了答案长度 101010 ,只需要一次遍历字符串,统计所有长度为 101010 的子串的出现次数(哈希表) ,最后遍历哈希表,维护答案,记录出现 222 次(及以上)的字符串 。 class Solution { …

【BBuf的CUDA笔记】二,解析 OneFlow BatchNorm 相关算子实现

0x1. 前言 在ResNet中(https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py),关于BatchNorm的调用一共有两种模式,第一种是ReLU接在BN之后: out self.bn1(out) out self.relu(out)另外一种…

MicFunPred——最新16S rRNA扩增子数据功能预测数据库

近年来,基于扩增子测序进行物种的功能预测是研究微生物群落功能的主要方面,目前最常用的软件包括Tax4Fun以及PICRUSt2。关于这两款软件的使用方法详可参见凌波微课|扩增子研究第十六讲:扩增子测序结果中的物种功能预测。 Tax4Fun使用最近邻匹…

2022年终总结-两年Androider的成长之路

金句分享 生活金句 1.可难道我们生命中做的每一件事不都是为了被爱得更多一点吗 2.这不只是一种对承诺的恐惧,也不是我缺乏关心和爱的能力,因为我做得到,只不过,老老实实讲。我想 我宁愿为了某件我擅长的事,我能表现…

一个select死锁问题

以下代码的输出结果&#xff1a; func main() {var wg sync.WaitGroupfoo : make(chan int)bar : make(chan int)wg.Add(1)go func() {defer wg.Done()select {case foo <- <-bar:default:println("default")}}()wg.Wait() }结果 解析 对于 select 语句&#…

【Linux】进程信号

目录 一、什么是信号 二、信号产生的条件 1、键盘产生 2、进程异常 3、命令产生 4、软件条件 三、信号保存的方式 四、信号处理的方式 1、信号处理接口 2、信号处理时机 3、进程为什么要切换成为用户态才进行信号的捕获方法&#xff1f; 4、sigaction 五、可重入函…

Java+MySQL基于ssm的会议交接平台

随着社会竞争压力的不断加强,企事业单位内部的会议都在不断的增加,有效的会议可以提高企事业内部的沟通,更好的做出符合战略目标的决策,但是传统的会议交接有一定的问题存在,首先就是必须面对面进行传达,其次就是对任务的安排和执行没有很好的记录,为了改变这些情况,于是我们提…

信贷产品年终总结之贷后逾期分析

自本月月初疫情全面放开后&#xff0c;身边的朋友基本都阳了一遍&#xff0c;希望正在浏览本篇文章的读者您是还没阳过的幸运儿。另外&#xff0c;今天也是冬至了&#xff0c;祝各位读者身边健康&#xff0c;远离羊群&#xff01; 最近我们分享了信贷业务年终总结系列的前2篇文…

Python中转义字符是个啥

文章目录前言一、转义字符是什么&#xff1f;二、常见的转义字符有哪些&#xff1f;总结前言 昨天有粉丝问了我这个代码问题&#xff0c;如下图&#xff1a; 他很好奇代码都没有错误&#xff0c;怎么运行就报错&#xff0c;不知道有咩有小伙伴能看出问题在哪呢&#xff1f; 其…