当前位置: 首页 > news >正文

分布式知识总结(一致性Hash算法)

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/
在这里插入图片描述

一致性Hash算法

假如有三台服务器编号node0node1node2,现在有3000万个key,希望可以将这些个key均匀的缓存到三台机器上?

可以使用取模算法hash(key)% N,对key进行hash运算后取模,N是机器的数量。

但服务器数量N发生变化后hash(key)% N计算的结果也会随之变化。

在这里插入图片描述

一致性hash算法本质上也是一种取模算法,不过不同于上边按服务器数量取模,一致性hash是对固定值2^32取模。

IPv4的地址是4组8位2进制数组成,所以用2^32可以保证每个IP地址会有唯一的映射。

将这2^32个值抽象成一个圆环,圆环的正上方的点代表0,顺时针排列,以此类推,1、2、3、4、5、6……直到2^32-1,而这个由2的32次方个点组成的圆环统称为hash环

在这里插入图片描述

服务器映射到hash环:

使用服务器IP地址进行hash计算,用哈希后的结果对2^32取模,结果一定是一个0到2^32-1之间的整数,而这个整数映射在hash环上的位置代表了一个服务器,依次将node0node1node2三个缓存服务器映射到hash环上。

一致性hash的优势:

假如业务量激增,系统需要进行扩容增加一台服务器node-4,刚好node-4被映射到node-1node-2之间,沿顺时针方向对象映射节点,发现原本缓存在node-2上的对象key-4key-5被重新映射到了node-4上,而整个扩容过程中受影响的只有node-4node-1节点之间的一小部分数据。

假如node-1节点宕机,沿顺时针方向对象映射节点,缓存在node-1上的对象key-1被重新映射到了node-4上,此时受影响的数据只有node-0node-1之间的一小部分数据。

数据偏斜问题:

在服务器节点数量太少的情况下,很容易因为节点分布不均匀而造成数据倾斜问题,被缓存的对象大部分缓存在node-4服务器上,导致其他节点资源浪费,系统压力大部分集中在node-4节点上,这样的集群是非常不健康的。

一致性Hash算法引入了一个虚拟节点机制,即对每个服务器节点计算出多个hash值,它们都会映射到hash环上,映射到这些虚拟节点的对象key,最终会缓存在真实的节点上。

在这里插入图片描述

一致性hash的应用场景:

一致性hash在分布式系统中应该是实现负载均衡的首选算法,比如日常使用较多的缓存中间件memcachedredis集群都有用到它。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue3列表(List)
  • 【ZIP技巧】ZIP分卷压缩包如何解压?
  • SQL 优化笔记:提高查询速度
  • Fiddle抓手机app的包
  • 从力扣中等+困难题+表白HTML测试 -- 文心快码(Baidu Comate)
  • 【Orange Pi 5嵌入式C语言编程】-智能指针简单实现
  • 奇门WMS-A和金蝶云星空单据接口对接
  • linux(debian)迁移home到其他物理盘并扩容——————附带详细步骤
  • 基于hadoop的网络流量分析系统的研究与应用
  • 杂谈c语言——5.类型提升
  • 富格林:揭开黑幕面纱实现安全
  • Spark-环境启动
  • Oracle+ASM+High冗余详解及空间计算
  • Ubuntu24.04使用SRS 搭建 RTMP流媒体服务器
  • `kill -9` 和 `pkill`
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Fundebug计费标准解释:事件数是如何定义的?
  • Linux链接文件
  • Mysql5.6主从复制
  • MySQL主从复制读写分离及奇怪的问题
  • webgl (原生)基础入门指南【一】
  • WePY 在小程序性能调优上做出的探究
  • 创建一个Struts2项目maven 方式
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 记录:CentOS7.2配置LNMP环境记录
  • 近期前端发展计划
  • 模型微调
  • 那些被忽略的 JavaScript 数组方法细节
  • 爬虫模拟登陆 SegmentFault
  • 如何合理的规划jvm性能调优
  • 使用agvtool更改app version/build
  • 微服务框架lagom
  • 微信小程序实战练习(仿五洲到家微信版)
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 移动端 h5开发相关内容总结(三)
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • #include
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (4)(4.6) Triducer
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (笔记)M1使用hombrew安装qemu
  • (定时器/计数器)中断系统(详解与使用)
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (力扣)循环队列的实现与详解(C语言)
  • (六)Flink 窗口计算
  • (七)Activiti-modeler中文支持
  • (正则)提取页面里的img标签
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选