【知识点随笔分享 | 第十篇】快速介绍一致性Hash算法

前言: 

在分布式系统中,数据的分布和负载均衡是至关重要的问题。一致性哈希算法是一种解决这些挑战的有效工具,它在分布式存储、负载均衡和缓存系统等领域得到了广泛应用。

随着互联网规模的不断扩大,传统的哈希算法在面对大规模数据时往往会遇到性能瓶颈和负载不均衡的问题。一致性哈希算法的出现填补了这一空白,它能够将数据分布到不同的节点上,同时保证在节点的增减时最小化数据迁移,从而提高了系统的可扩展性和稳定性。

目录

前言: 

传统的Hash算法:

一致性Hash算法:

解决传统的Hash算法的问题:

应用场景:

总结:


 

无论是传统的Hash算法还是一致性Hash算法,解决的都是分布式缓存下 多节点 之间 的问题

传统的Hash算法:

我们直接用场景举例:当我们有多台缓存中间件来缓存数据的时候(比如Redis集群),当一个数据发送过来的时候,我们要面临一个问题:这个数据应该存到哪台服务器中?

我们用图片说明:

比如现在有一个文件,hash之后得到的值是7463322,然后我们用 服务器台数  取余。

7463323 % 3 = 1

那么我们就把这个文件放到编号为1的服务器中。

因为对同一个文件做相同的hash时,得到的hash值时不变的,所以当需要访问图片的时候,我们可以再次Hash,找到目标服务器读取文件。

这种算法就是Hash算法,但是这种Hash算法有两个明显的缺点:

1.Hash算法散列度不够,导致单个服务器堆积多个文案

2. 变化服务器台数之后,原文件可能无法在正确的服务器中获得文件。

这样就导致缓存系统无法起到替代数据库分担一部分访问压力的作用,可能会导致大量的请求直接打到数据库,导致数据库崩溃。

通过简单的介绍,我们看到了传统的Hash算法的弊端,那么在不断的改进之下:一致性Hash算法  横空出世。

一致性Hash算法:

我们可以构想现在有一个 2^32个点所组成的圆环,我们把它叫做Hash环

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

假设我们现在有三台缓存服务器  服务器A 服务器B 服务器C 。现在我们可以将这三台服务器编号Hash值  与 2 ^ 32 次方进行取余。得到的结果可以  映射   在 我们设计的这个Hash环  上

 

 当我们在选择把文件存储到哪一个缓存服务器中的时候,采用以下算法:

1.对文件Hash值用  2 ^ 32 次方进行取余。得到的结果也能在当前Hash环中有一个映射点。

2.我们选择从顺时针触发, 把文件存储在  距离当前结果映射点  最近的服务器。

比如  当前文件结果映射点距离 B  缓存服务器最近,那么我们就把文件存储在B服务器上。

解决传统的Hash算法的问题:

1.传统Hash算法在添加服务器后,缓存失效的场景

假设我们的A 和 B 缓存服务器中,新增了一个  缓存服务器D:

之前我们A-B这段这段范围的所有缓存映射点的缓存,本来都是存储在缓存B服务器的 ,但是由于新增的缓存服务器D  插进了A和B之间,导致缓存集合1 会  映射到  缓存服务器D,但是我们的缓存集合2仍然是可用,它依然会被映射到缓存服务器B中

这样可以减少新增服务器所带来的缓存失效波及范围。通过Hash环的设计,我们在新增缓存服务器的时候,仍然保存了部分可用文件。

也就是说:使用Hash环之后,当我们新增服务器的时候,不会导致所有的缓存失效而是部分缓存失效

 而原生的Hash环并不能够解决大量资源堆积在同一个缓存服务器的场景,这是因为在实际缓存服务器映射的时候,并不一定会像我们理想化的三分Hash环

我们把这种缺陷叫做Hash偏斜

当出现Hash偏斜的时候,大量的文件仍然会存储在服务器A中。而一致性Hash算法给出的解决方案是:虚拟节点

 虽然物理节点只有三台,但是我们可以映射出很多虚拟节点,当前待存储的文件距离哪一个虚拟节点最近,就把数据存储到哪一个虚拟节点对应的物理节点中。

 其实Hash偏斜的解决方案可以简单总结为:创建虚拟节点  尝试均分    Hash环,虚拟节点越多,我们的映射就越均匀。

应用场景:

  1. 分布式缓存: 一致性哈希算法常用于分布式缓存系统中,例如在Memcached和Redis等分布式缓存系统中。通过一致性哈希,可以将缓存数据均匀地分布到不同的缓存节点上,提高缓存系统的扩展性和容错性。

  2. 分布式数据库: 大规模分布式数据库系统也会使用一致性哈希算法来实现数据分片和负载均衡。例如,Cassandra、MongoDB等数据库系统都利用一致性哈希来实现数据的分布存储和查询路由。

  3. 分布式消息队列: 一致性哈希算法可以用于分布式消息队列系统,确保消息能够被均匀地发送到不同的消息队列节点,提高系统的吞吐量和可用性。比如Kafka等消息队列系统可以使用一致性哈希来确定消息的存储位置和消费者组的分布。

  4. 分布式文件系统: 在分布式文件系统中,一致性哈希算法可以用于确定文件块的存储位置和访问路由,例如Hadoop的HDFS(Hadoop Distributed File System)和GlusterFS等。

  5. 负载均衡: 一致性哈希算法也可以用于负载均衡,将请求分布到多个服务器上,保证系统的稳定性和性能。

  6. 分布式计算: 在分布式计算中,一致性哈希算法可以用于任务调度和数据分片,例如MapReduce任务的分布式计算框架。

总的来说,一致性哈希算法在分布式系统中的应用非常广泛,能够有效地解决数据分布、负载均衡和容错性等问题,提高系统的可扩展性和可靠性。

总结:

        总的来说,一致性哈希算法是一种用于分布式系统中的数据分布和负载均衡的重要技术。通过将数据映射到一个固定范围的哈希空间,并将节点映射到同样的空间,一致性哈希算法能够保证在节点的增减或者网络分区等情况下,最小化数据迁移并保持系统的平衡性。该算法已经在多个领域得到实际应用,包括分布式缓存分布式数据库分布式消息队列分布式文件系统负载均衡以及分布式计算等方面。通过了解一致性哈希算法,我们可以更好地设计和构建高可用、高性能的分布式系统。

 

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

cmake进阶:变量的作用域(目录作用域与全局作用域)

一. 简介 前面从函数作用域方面学习了变量的作用域,本文从目录作用域方面来学习变量的作用域。 二. cmake进阶:从目录作用域方面学习变量的作用域 1. 目录作用域 什么是目录作用域? 我把这个作用域叫做目录作用域。子目录会将父目录的所…

Web3 ETF软件系统的主要功能

下面是Web3 ETF系统软件的主要功能,这些功能共同构成了Web3 ETF系统软件的核心,使其能够有效地为投资者提供Web3技术相关的投资机会,同时确保合规性、安全性和透明度。北京木奇移动软件有限公司,专业的软件外包开发公司&#xff0…

【Git】Git学习-10-11:GitHub,SHH配置,克隆仓库

学习视频链接:【GeekHour】一小时Git教程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 创建仓库 配置SSH密钥可以更加安全,方便地推送、拉取代码 根目录下,进入.ssh文件&am…

【C语言】——联合体与枚举

【C语言】——联合体与枚举 一、联合体1.1、联合体类型的声明1.2、联合体的特点1.3、相同成员的结构体和联合体对比1.4、联合体的大小计算1.5、联合体的应用举例 二、枚举2.1、枚举类型的声明2.2、枚举类型的优点 一、联合体 1.1、联合体类型的声明 联合体也叫做共用体   与…

学习R语言第五天

文章目录 语法学习创建数据的方式绘制图形的方式图形添加颜色如何操作数据的方式数据进行验算的判断加付值的方式修改变量名称的方式判断是否存在缺失值在计算的方式忽略缺失值通过函数的方式忽略缺失值日期处理的方式字符串转化成日期的方式格式化数据框中数据返回当前的日期的…

19_Scala集合概述

文章目录 集合回顾javaScala集合三大类String & StringBuilderScala集合两大类 集合 回顾java scala与Java有所不同 函数式编程语言更侧重集合本身提供的哪些功能; Scala集合三大类 1.Seq 存储有序数据可重复 类比 List 2.Set 存储无序数据不可重复 3.Map…

【算法系列】字符串

目录 leetcode题目 一、最长公共前缀 二、最长回文子串 三、二进制求和 四、字符串相加 五、字符串相乘 六、仅仅反转字母 七、字符串最后一个单词的长度 八、验证回文串 九、反转字符串 十、反转字符串 II 十一、反转字符串中的单词 III leetcode题目 一、最长公…

frp内网穿透服务搭建与使用

frp内网穿透服务搭建与使用 1、frp简介 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。 可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。frp工作原理 服务端运行,监听一个主端口…

Parts2Whole革新:多参照图定制人像,创新自定义肖像生成框架!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! Parts2Whole革新:多参照图定制人像,创新自定义肖像生成框架! 引言:探索多条件人像生成的新篇章 在数字内容创作…

论文精读-存内计算芯片研究进展及应用

文章目录 论文精读-存内计算芯片研究进展及应用概述背景介绍前人工作 存内计算3.1 SRAM存内计算3.2 DRAM存内计算3.3 ReRAM/PCM存内计算3.4 MRAM存内计算3.5 NOR Flash存内计算3.6 基于其他介质的存内计算3.7 存内计算芯片应用场景 总结QA 论文精读-存内计算芯片研究进展及应用…

SpringBoot中实现发送邮件

概要 在Spring Boot中发送电子邮件相对简单。你可以使用Spring的邮件支持来实现这一点。 步骤: 1.添加依赖:首先,需要在你的pom.xml文件中添加Spring Boot的邮件发送器依赖。 2. 配置邮件服务器:在application.properties或app…

嵌入式全栈开发学习笔记---C语言笔试复习大全14

目录 指针初级 指针的概念 指针类型 指针类型长度 指针的定义 通过指针访问数据 p1和*p1的区别 指针做函数参数 上一篇复习了8道编程题,这篇开始正式复习之指针! 说明:我们学过单片机的一般都是有C语言基础的了,网上关于C…

网络 IO 模式

同步 IO 与异步 IO 同步 IO 和异步 IO 是关于数据读写方式的两种不同模式。 同步 IO 是指在程序读写数据时,需要等待操作完成后才能继续执行后面的程序。这种模式下,当程序使用阻塞式 IO 时,会一直等待IO操作完成,程序会暂停执行…

​​【收录 Hello 算法】3.3 数字编码

目录 3.3 数字编码 3.3.1 原码、反码和补码 3.3.2 浮点数编码 3.3 数字编码 Tip 在本书中,标题带有 * 符号的是选读章节。如果你时间有限或感到理解困难,可以先跳过,等学完必读章节后再单独攻克。 3.3.1 原码、反码和补码 在…

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息(Message)1.2 主题(Topic)1.3 标签(Tag)1.4 队列&#xff0…

RK3576芯片规格,以及与RK3588对比

瑞芯微RK3576是一款高性能、低功耗的SoC(系统级芯片)处理器,适用于基于ARM的PC、边缘计算设备、个人移动互联网设备等多种应用场景。它采用Arm架构的八核心CPU,集成了GPU、MCU、NPU、VPU等多种计算核心,并具有丰富的外…

Go Web 开发 Demo【用户登录、注册、验证】

前言 这篇文章主要是学习怎么用 Go 语言(Gin)开发Web程序,前端太弱了,得好好补补课,完了再来更新。 1、环境准备 新建项目,生成 go.mod 文件: 出现报错:go: modules disabled by G…

ttkbootstrap界面美化系列之Menubutton(五)

一:Menubutton接口 print(help(help(ttk.Menubutton))) Help on class Menubutton in module tkinter.ttk:class Menubutton(Widget)| Menubutton(masterNone, **kw)|| Ttk Menubutton widget displays a textual label and/or image, and| displays a menu wh…

Qt | QComboBox(组合框)

01、上节回顾 Qt 基础教程合集02、QComBox 一、QComboBox 类(下拉列表、组合框) 1、QComboBox 类是 QWidget 类的直接子类,该类实现了一个组合框 2、QComboBox 类中的属性 ①、count:const int 访问函数:int count() const; 获取组合框中的项目数量,默认情况下,对于空…

动态规划——路径问题:LCR 166.珠宝的最高价值

文章目录 题目描述算法原理1.状态表示(题目经验)2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接:LCR 166.珠宝的最高价值 算法原理 1.状态表示(题目经验) 对于这种路径类的问题&…