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:序列化模块 ​ 序列化模块通常…

LeetCode2643. Row With Maximum Ones

文章目录 一、题目二、题解 一、题目 Given a m x n binary matrix mat, find the 0-indexed position of the row that contains the maximum count of ones, and the number of ones in that row. In case there are multiple rows that have the maximum count of ones, t…

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

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

Win UI3开发笔记(六)设置软件最小尺寸

想设置最小尺寸为1000*100像素怎么做? 一、问gpt using Microsoft.UI.ViewManagement; using Windows.UI.ViewManagement;// 在应用程序启动时设置最小缩放尺寸 ApplicationView.PreferredLaunchViewSize new Size { Width 800, Height 600 }; ApplicationView.P…

代码随想录算法训练营(动态规划10,11 ,12 股票问题)| 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

动态规划10 动态规划5步曲,个人感觉应该加一步状态分析 状态分析: 列出所有的状态,将状态归纳后定义dp数组状态转移,状态怎么转移也就是递推公式是什么 买卖股票的动规五部曲分析如下: 1 确定dp数组(d…

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

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

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

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

游戏网站为了提升谷歌的搜索排名,应该在html等方面做什么优化?

一&#xff1a;为了提升谷歌的搜索排名&#xff0c;游戏网站可以在HTML等方面进行以下优化&#xff1a; 关键词优化&#xff1a;在HTML的标题标签&#xff08;<title>&#xff09;和Meta标签中包含与游戏相关的关键词&#xff0c;以便搜索引擎能够更好地理解网站内容。 …

PyTorch笔记:标量向量矩阵张量+维度+常用API+计算图+自动微分计算

PyTorch 张量 默认数据类型是torch.float32 维度 0&#xff1a;标量1&#xff1a;向量2&#xff1a;矩阵… 标量&向量&矩阵&张量 标量&#xff1a;0维空间中一个点向量&#xff1a;1维空间中一条线矩阵&#xff1a;2维空间中一个面三维张量&#xff1a;三维空…

刷题第10天

代码随想录刷题第10天 |● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 239. 滑动窗口最大值 唉&#xff0c;好难&#xff0c;先记个思路吧 class Solution { private:class MyQueue { //单调队列&#xff08;从大到小&#xff09;public:deque<int> que; // 使用deq…

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

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

速看!2024深圳国际电子化工新材料展览会

2024深圳国际电子化工新材料展览会 Shenzhen International Exhibition of New Electronic and chemical materials2024 基本信息&#xff1a; 时间&#xff1a;2024年6月26&#xff5e;28日 地点&#xff1a;深圳国际会展中心 组织机构&#xff1a; 主办单位&#xff1a…

【C语言】linux内核netif_receive_skb

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

洛阳旅游攻略

洛阳旅游攻略 第一天&#xff08;抵达当天&#xff09;&#xff1a; 1.先将行李放到酒店—2.老城十字街&#xff08;打车可能会堵车&#xff09;—3.洛邑古城—4.丽景门&#xff08;步行&#xff09; 第二天&#xff1a; 1.早起吃早餐—&#xff08;打车三十分钟&#xff0c…

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;填充…