【知识点随笔分享 | 第十篇】快速介绍一致性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://xiahunao.cn/news/3017792.html

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

相关文章

PY32MD310单片机介绍,非常适合做三相/单相 BLDC/PMSM主控

PY32MD310 单片机采用了高性能的 32 位 ARM Cortex-M0 内核,嵌入高达 64 Kbytes flash 和 8 Kbytes SRAM 存储器,最高工作频率 48 MHz。芯片内置多功能三相 PN 型半桥式栅极驱动器,片内集成多路 I2C、SPI、USART 等通讯外设,1 路 …

爬虫学习:XPath匹配网页数据

目录 一、安装XPath 二、XPath的基础语法 1.选取节点 三、使用XPath匹配数据 1.浏览器审查元素 2.具体实例 四、总结 一、安装XPath 控制台输入指令:pip install lxml 二、XPath的基础语法 XPath是一种在XML文档中查找信息的语言,可以使用它在HTM…

【快捷部署】022_ZooKeeper(3.5.8)

📣【快捷部署系列】022期信息 编号选型版本操作系统部署形式部署模式复检时间022ZooKeeper3.5.8Ubuntu 20.04tar包单机2024-05-07 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff…

接入大量设备后,视频汇聚系统EasyCVR安防监控视频融合平台是如何实现负载均衡的?

一、负载均衡 随着技术的不断进步和监控需求的日益增长,企业视频监控系统的规模也在不断扩大,接入大量监控设备已成为一项常态化的挑战。为确保企业能够有效应对这一挑战,视频汇聚系统EasyCVR视频融合平台凭借其卓越的高并发处理能力&#x…

mac安装linux的centos strem9 虚拟机解压rar文件报错

背景:解压rar文件需要再linux上安装unrar工具 yum install unrar直接安装的后解压报错,如图 解决办法: 下载:wget https://www.rarlab.com/rar/rarlinux-x64-6.0.2.tar.gz 安装: tar -zxvf rarlinux-x64-6.0.2.tar.gz cd rar …

AutoDev for VSCode 预览版:精准 AI 编程提示词与编辑器的完美融合

在过去的一个月里,我在休着陪产假、看娃的同时,也在闲暇时间里设计了 AutoDev for VSCode 的架构。 我们将 AutoDev for Intellij IDEA 平台的非凡开发者体验带到了 VSCode 平台。在 IDEA 版本中通过构建非常精准的提示词,以及与编辑器的完美…

GNU Radio创建时间戳 C++ OOT块

文章目录 前言一、创建自定义的 C OOT 块1、创建 timestamp_sender C OOT 模块①、创建 timestamp_sender OOT 块②、修改 C 代码 2、创建 timestamp_receiver C OOT 模块①、创建 timestamp_receiver OOT 块②、修改 C 代码 3、创建 delayMicroSec C OOT 模块①、创建 delayMi…

Apple OpenELM设备端语言模型

Apple 发布的 OpenELM(一系列专为高效设备上处理而设计的开源语言模型)引发了相当大的争论。一方面,苹果在开源协作和设备端AI处理方面迈出了一步,强调隐私和效率。另一方面,与微软 Phi-3 Mini 等竞争对手相比&#xf…

k8s部署Kubeflow v1.7.0

文章目录 环境介绍部署访问kubeflow ui问题记录 环境介绍 K8S版本:v1.23.17,需要配置默认的sc 参考:https://github.com/kubeflow/manifests/tree/v1.7.0 部署 #获取安装包 wget https://github.com/kubeflow/manifests/archive/refs/tag…

数控六面钻适用场景-不止家具制造

在快节奏的现代生活中,家具作为我们生活的重要组成部分,其美观度和实用性日益受到人们的关注。而在这背后,一个不可或缺的“工匠”正默默地发挥着它的作用——那就是数控六面钻。 数控六面钻,顾名思义,是一种高度自动…

Ansible自动运维工具之playbook

一.inventory主机清单 1.定义 Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。 2.变量 (1)主机变量 [webservers] 192.168.10.14 ansible_port22 ansible_userroot ans…

【Redis分布式缓存】 哨兵机制

Redis 哨兵机制 哨兵作用和原理 Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。 哨兵的作用 监控:Sentinel 会不断检查您的master和slave是否按预期工作自动故障恢复:如果master故障,Sentinel会将一…

(三)Appdesigner-界面转换及数据导入和保存

提示:文章为系列文章,可以在对应学习专栏里面进行学习。对应资源已上传 目录 前言 一、Appdesigner是什么? 二、界面切换 三、数据导入及保存 (一)数据导入 (二)数据保存 总结 前言 Appd…

设置 kafka offset 消费者位移

文章目录 1.重设kafka消费者位移2.示例2.1 通过 offset 位置2.2 通过时间2.3 设置到最早 1.重设kafka消费者位移 维度策略含义位移Earliest把位移调整到当前最早位移处位移Latest把位移调整到当前最新位移处位移Current把位移调整到当前最新提交位移处位移Specified-Offset把位…

0507华为od二面

只记录自己没回答上的问题 1、ZGC的缺点: 1)只是适用于32位系统 2)最大只是支持4TB内存容量 3)最糟糕的情况下吞吐量会下降15%,这都不是事至于吞吐量,通过扩容分分钟解决 4)分代的原因:不同对象的生命周期不相同,可能会扫描整个堆…

对于SOMP算法的测试

刚开始只上传了SOMP算法的代码,并没有过多介绍。 所以本篇文章对SOMP算法用法进行一个介绍 SOMP算法代码 function [X_hat] MMV_SOMP(Y, PHI, s)% SOMP:同时正交匹配追踪 simultaneous orthogonal matching pursuit% 论文:J. Determe, J. Lo…

【verilog-语法】编译命令( compiler directives )

一、前言 编译器指令的范围是从它的出现的点延伸到处理的所有文件,直到另一个编译器指令取代它或处理结束。编所有的编译命令都有重音符 " "引出。在IEEE std1364-2005中共介绍了19条编译命令,这19条命令又可分为12组命令进行独立或组合使用…

指针再学习笔记

概念 示例 类型 示例 作用 注意:有些内存地址可能系统不会允许任意访问 运算 示例 空指针

C语言程序设计(三)

1、数据的两种表现形式 常量:其值不能被改变的量称为常量。 变量: 单撇号内只能包含一个字符。双撇号内可以包含一个字符串。 注意:要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存只是一个临时符号,代表一个值,在预编译…

免费地理信息系统(GIS)数据集合网站,500合1

超过500个免费的地理数据网站,数据涵盖多种主题。 这是一个免费的地理信息系统(GIS)数据源列表,涵盖了全球范围内的各种地理数据,包括自然环境、行政边界、人口、交通等多个领域的数据。 该数据列表由作者 Robin Wilson 收集整理&#xff0…