33、一致性哈希算法分区

33、一致性哈希算法分区

  • 一、背景
  • 二、介绍
  • 三、步骤
    • 1、算法构建一致性哈希环
    • 2、Redis服务器IP节点映射
    • 3、key落到服务器的落键规则
  • 四、优点
    • 1、一致性哈希算法的容错性
    • 2、一致性哈希算法的扩展性
  • 五、缺点
    • 1、一致性哈希算法的数据倾斜问题
    • 2、拓展
  • 六、总结

一、背景

一致性哈希算法 出现的原因:
分布式缓存数据变动和映射的问题。例如 哈希取余分区 某个机器宕机了,分母数量改变了,自然取余数不OK了。
提出 一致性哈希算法 的解决方案,目的是当服务器个数发生变动时,尽量减少影响客户端与服务器的映射关系。

二、介绍

一致性哈希算法 本质上也是一种取模算法。不过,不同于 哈希取余分区 按服务器数量取模。一致性哈希算法是对固定值 2^32 取模。
IPv4的地址是 4组8位2进制数 组成,所以用2^32可以保证每个IP地址会有唯一的映射。例如:0.0.0.0 ~ 255.255.255.255,为所有 ip 段。

三、步骤

1、算法构建一致性哈希环

一致性哈希算法:
(1) 根据 Hash函数 并按照算法产生 Hash值
(2) 产生的 Hash值 会构成一个全量集,这个集合可以成为一个 hash空间 [0,2^32-1] 。这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首尾相连(0 = 2^32),这样让它逻辑上形成了一个环形空间,简称哈希环。
(3)哈希环如下图: 整个空间按 顺时针 方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、……直到2^32-1。
在这里插入图片描述

2、Redis服务器IP节点映射

将集群中各个 IP节点(Master) 映射到环上的某一个位置。
此时计算公式就从 hash(key) % n 变成了 hash(服务器ip)% 2^32 ,使用 服务器IP 地址进行 哈希计算 ,用哈希后的结果对 2^32取模 。结果 一定 是一个 [0,2^32-1] 之间的整数,而这个整数映射在 Hash环 上的位置代表了一个服务器,依次将NodeA、NodeB、NodeC、NodeD四个缓存服务器映射到hash环上。
在这里插入图片描述

3、key落到服务器的落键规则

存储 kv键值对 时:
(1)首先计算 keyhash 值,hash(key)
(2)将这个 key 使用 相同Hash函数 计算出 Hash值 并确定此数据在环上的位置。
(3)从此位置沿环 顺时针“行走”第一台 遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。
(4)例如:key 1key 2key 3key 4四个数据对象,经过Hash计算后,在环空间上的位置如下:根据一致性哈希算法,key 1会被定为到Node A上,key 2被定为到Node B上,key 3被定为到Node C上,key 4被定为到Node D上。
在这里插入图片描述

四、优点

1、一致性哈希算法的容错性

假设 Node C 宕机,可以看到此时对象A、B、D不会受到影响。
一般的,在一致性哈希算法中,如果一台服务器不可用,则 受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据 ,其它不会受到影响。
简单说,就是C挂了,受到影响的只是B、C之间的数据且这些数据会转移到D进行存储。
在这里插入图片描述

2、一致性哈希算法的扩展性

当数据量增加,需要新增加一台节点 Node XNode X 的位置在AB之间,那收到影响的也就是AX之间的数据,重新把AX的数据录入到X上即可,不会导致Hash取模全部数据重新洗牌。
在这里插入图片描述

五、缺点

1、一致性哈希算法的数据倾斜问题

上文为了便于理解原理,图中的Node节点都很理想化的均匀分布,但理想,实际的场景往往差别很大,就比如办了个健身年卡,只去过健身房两次,还只是洗了个澡。
在这里插入图片描述
一致性哈希算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题。

例如系统中只有两台服务器,被缓存的数据对象大部分缓存在Node A服务器上,导致其他节点资源浪费,系统压力大部分集中在Node A节点上,这样的集群是非常不健康的。
在这里插入图片描述

2、拓展

为了解决一致性哈希算法的数据倾斜问题,提出了一个虚拟节点的机制。即对每个服务器节点计算出多个Hash值,它们都会映射到Hash环上,映射到这些虚拟节点的对象key,最终会缓存在真实的节点上。

虚拟节点的Hash计算通常可以采用,对应节点的 IP地址+数字编号 后缀。例如:hash(192.168.250.128#1)

举个例子,Node A节点IP为192.168.250.128,正常计算Node A 的Hash值。

  • hash(192.168.250.128)% 2^32

假设给Node A设置三个虚拟节点,Node A#1、Node A#2、Node A#3,分别对它们进行Hash后取模。

  • hash(192.168.250.128#1)% 2^32
  • hash(192.168.250.128#2)% 2^32
  • hash(192.168.250.128#3)% 2^32

Node B设置三个虚拟节点,Node B#1、Node B#2,分别对它们进行Hash后取模。

  • hash(192.168.250.129#1)% 2^32
  • hash(192.168.250.129#2)% 2^32

Node C设置三个虚拟节点,Node C#1,对它进行Hash后取模。

  • hash(192.168.250.130#1)% 2^32

如下图加入虚拟节点后,原有节点在Hash环上分布的就相对均匀了,其余节点压力得到了分摊。
在这里插入图片描述
但需要注意一点,分配的虚拟节点个数越多,映射在hash环上才会越趋于均匀,节点太少的话很难看出效果。

引入虚拟节点的同时,也出现了新的问题,要做虚拟节点和真实节点间的映射对象key->虚拟节点->实际节点之间的转换。

如下图所示:
在这里插入图片描述

六、总结

(1)一致性哈希算法 在分布式系统中应该是实现负载均衡的首选算法。
(2)目的: 在节点数目发生改变时尽可能少的迁移数据.
(3)流程: 将所有的存储节点排列在 首尾相接的Hash环 上,每个 key 在计算 Hash值 后会顺时针找到临近的存储节点存放。而当有节点新增或减少仅影响该节点在Hash环上顺时针相邻的后续节点
(4)优点: 新增或减少节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。
(5)缺点: 数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。


到这里 一致性哈希算法分区 就结束了!!!🎉🎉🎉
欢迎小伙伴们学习和指正!!!😊😊😊
祝大家学习和工作一切顺利!!!😎😎😎

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

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

相关文章

sylar高性能服务器-日志(P57-P60)内容记录

文章目录 P57-P60:序列化模块Varint(编码)Zigzag(压缩)class ByteArrayNode(链表结构)成员变量构造函数写入读取setPositionaddCapacity 测试 P57-P60:序列化模块 ​ 序列化模块通常…

某酷ckey140逆向(之前下架了重新上传补发)

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018…

Python - Pycharm 配置 autopep8 并设置快捷键

什么是 PEP8 官方:PEP 8 – Style Guide for Python Code | peps.python.org PEP8 是 Python 官方推出的一套编码的规范,只要代码不符合它的规范,就会有相应的提示,还可以让代码自动的格式化 Pycharm 自带的代码格式化 ​ 但这…

2024年Android笔试题总,如何系统全面性学习Android语言

开头 让我们一起来看看,字节跳动的第三面,面试官都问了什么?(第一二面的题目及答案已整理,需要的可以在文末领取) 从七月中旬开始,我前前后后差不多一共投递了八十份简历,到目前为…

章鱼网络进展月报 | 2024.2.1-2.29

章鱼网络大事摘要 1、Omnity 完成了核心组件的原型开发,正在测试,未来将首先支持 Runes 资产跨链。 2、$NEAR Restaking 质押总量超过400万美元。 3、章鱼网络受邀参加 ETHDenver 2024,并且与 ICP 共同组织活动,介绍 Omnity 的…

【C语言】linux内核netif_receive_skb

一、中文注释 /*** netif_receive_skb - 从网络处理接收缓冲区* skb: 要处理的缓冲区** netif_receive_skb() 是主要的数据接收处理函数。* 它总是成功的。由于拥塞控制或协议层的原因,缓冲区可能在处理过程中被丢弃。** 这个函数只能在软中断(softirq&…

guava的使用

对数组操作前判断是否会越界&#xff1a; List<String> s new ArrayList<>();System.out.println(Preconditions.checkElementIndex(2,s.size(),"下标长度超过了")); 是否为空 String s null;System.out.println(Preconditions.checkNotNull(s)); 判空…

Android使用Sensor.TYPE_STEP_COUNTER计步器传感器进行步数统计

1、首先&#xff0c;申请权限 必须声明 ACTIVITY_RECOGNITION 权限&#xff0c;以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。 Manifest.xml也记得声明 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {Log.d(TAG, "[权限]&quo…

Docker的安装跟基础使用一篇文章包会

目录 国内源安装新版本 1、清理环境 2、配置docker yum源 3、安装启动 4、启动Docker服务 5、修改docker数据存放位置 6、配置加速器 现在我们已经完成了docker的安装和初始配置。以下为基本测试使用 自带源安装的版本太低 docker官方源安装的话速度太慢了 所以本篇文…

iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践

移动端的自动化测试&#xff0c;最常见的是 Android 自动化测试&#xff0c;我个人觉得 Android 的测试优先级会更高&#xff0c;也更开放&#xff0c;更容易测试&#xff1b;而 iOS 相较于 Android 要安全稳定的多&#xff0c;但也是一个必须测试的方向&#xff0c;这个系列文…

STM32(18)I2C

串口通信缺点 一个设备就需要一个串口&#xff0c;单片机可能没有那么多串口外设 总线/非总线 主机&#xff1a;负责管理总线&#xff0c;可控制波特率、数据的通信方向 波特率&#xff1a;由主机产生波特率信号 数据的传输 每个从机都有7位地址&#xff0c;最后移位是读&a…

力扣--动态规划516.最长回文子序列

思路分析&#xff1a; 创建一个二维动态规划表dp&#xff0c;其中dp[i][j]表示在子串s[i...j]中的最长回文子序列的长度。初始化基本情况&#xff1a;对角线上的元素dp[i][i]都为1&#xff0c;因为单个字符本身就是长度为1的回文子序列。从字符串末尾向前遍历&#xff0c;填充…

IPsec VPN协议框架

IPsec是IETF&#xff08;Internet Engineering Task Force&#xff09;制定的一组开放的网络安全协议。它并不是一个单独的协议&#xff0c;而是一系列为IP网络提供安全性的协议和服务的集合&#xff0c;包括认证头AH&#xff08;Authentication Header&#xff09;和封装安全载…

第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组 统计子矩阵

#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<queue>using namespace std;int cnt,temp; int n,m,K; int a[505][505]; int pre[505][505];//二维前缀和void sol() {cin>>…

如何从产品的角度做好内容营销?媒介盒子支招

内容运营就是指将生产传播内容并进行重组&#xff0c;去满足用户的内容消费需求&#xff0c;想要提高内容运营的效果&#xff0c;媒介盒子认为可以从产品出发&#xff0c;将内容运营与品牌产品相结合。那么应该怎么做呢&#xff1f;接下来就让媒介盒子告诉你。 一、 场景化内容…

MySQL 空间碎片详解

文章目录 前言1. 空间碎片如何产生2. 空间碎片如何查看3. 空间碎片如何回收后记 前言 MySQL 数据库在运行过程中&#xff0c;随着时间的推移&#xff0c;可能会出现空间碎片的问题。空间碎片是指数据库表中不再使用的空间&#xff0c;但由于各种原因&#xff0c;这些空间并没有…

【漏洞复现】CVE-2023-27178 GDidees CMS任意文件上传漏洞复现

漏洞描述 漏洞编号&#xff1a;CVE-2023-27178 GDidees CMS是法国一款开源的网站管理工具&#xff0c;可用于创建站点、照片或视频库。GDidees CMS 3.9.1及以下版本存在任意文件上传漏洞&#xff0c;允许未经授权的攻击者上传精心构造的文件并执行任意代码。 影响版本 GDide…

国内企业怎么创建WhatsApp Business账号?

什么是WhatsApp Business 账号&#xff1f; WhatsApp是世界上最受欢迎的消息应用程序之一&#xff0c;拥有超过25亿月活用户。近年来&#xff0c;WhatsApp 推出了一项新产品——WhatsApp Business 。 那么&#xff0c;WhatsApp Business 究竟是什么呢&#xff1f;WhatsApp Bu…

【EI会议征稿通知】第四届人工智能,大数据与算法国际学术会议 (CAIBDA 2024)

第四届人工智能&#xff0c;大数据与算法国际学术会议 (CAIBDA 2024) 2024 4th International Conference on Artificial Intelligence, Big Data and Algorithms 由河南省科学院、河南大学主办&#xff0c;河南省科学院智慧创制研究所、河南大学学术发展部、河南大学人工智能…

Android工作资料,这份火爆全网的452页Android Framework内核解析

为什么想跳槽&#xff1f; 简单说一下当时的状况&#xff0c;我在这家公司做了两年多&#xff0c;这两年多完成了一个大项目&#xff0c;作为开发的核心主力&#xff0c;开发压力很大&#xff0c;特别是项目上线前的几个月是非常辛苦&#xff0c;几乎每晚都要加班到12点以后&a…