一致性hash面试题_java面试算法

一致性hash面试题_java面试算法为什么要用一致性hash算法?在学习一致性hash算法之前,首先要考虑下为什么要使用它,使用它能解决什么样的问题。带着问题去学习相信理解起来会更容易。大家都知道我们在使用redis分片技术,mycat对数据库进行分库分表时都会面临数据操作规则的问题;比如我们把一条记录存入redis3服务器,那么我们获取的时候如果不指定规则就会根据key在所有的redis服务器中进行遍历查找,显然这种情况是…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

为什么要用一致性hash算法?

在学习一致性hash算法之前,首先要考虑下为什么要使用它,使用它能解决什么样的问题。带着问题去学习相信理解起来会更容易。

大家都知道我们在使用redis分片技术,mycat对数据库进行分库分表时都会面临数据操作规则的问题;比如我们把一条记录存入redis3服务器,那么我们获取的时候如果不指定规则就会根据key在所有的redis服务器中进行遍历查找,显然这种情况是我们不想看到的。所以这时候我们就需要引入一些规则来确保数据放入某个redis服务器,取的时候直接去对应的服务器进行查询,而不需要遍历多台服务器。常用的规则有根据hash值来决定存放位置。比如存入一个记录时,我们根据key进行hash运算再用hash值与服务器的数量进行取模:hash(key)/3=X;得出的结果就是记录存放的服务器位置,查询的时候按照相同的公式进行计算,这样就不会遍历所有的服务器,从而大大提供了性能。

虽然使用hash算法可以提高性能,但是也会有一些缺陷,主要体现在服务器数量发生变化(增加/减少)时,所有缓存的位置都会发生改变。例如我们要增加一台缓存服务器(之前三台),hash算法如下hash(key)/4=X;这种情况带来的结果就是服务器数量发生变化时会造成缓存失效,此时请求会发往后端数据库,可能导致缓存雪崩问题。我们不允许这种现象发生,但是利用hash值取模进行缓存时这种情况无法避免,为了解决这些问题,hash一致性算法诞生了。

一致性hash算法背景

一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。

一致性hash算法:

一致性hash算法也是使用取模的方法,只是上述hash算法是对服务器数量记性取模运算,而一致性hash是对2^32取模。也就是说一致性hash算法将整个hash空间组织成一个圆环:

计算一致性hash步骤如下:

1 首先根据缓存服务器的ip,端口等信息算出哈希值,并将其配置到个数为2的32次方的圆上。

2 然后同样的方法算出存储数据的键的哈希值,并映射到相同的圆上。

3 从数据存储位置开始顺时针查找,将数据保存到找到的第一个服务器上,如果超过2的32次方仍然找不到服务器就会保存在第一台服务器上;取值操作完全相同。

整个环按照顺时针方向进行组织。然后可以用服务器ip,port作为key进行hash从而确定在环中的位置,对数据进行存储时也进行相同的hash算法对key运算确定数据在此环上的位置,从此位置沿顺时针开始遇到的第一个服务器就是数据存放的服务器:

一致性hash面试题_java面试算法

 

当添加一台redis缓存服务器时,只有增加服务器的位置和逆时针方向第一台服务器之间的键会受影响:

一致性hash面试题_java面试算法

一致性hash算法对于节点的增减都只需要重定位环空间中的一小部分数据,具有良好的容错性和可扩展性。

hash环的数据倾斜问题:

一致性hash算法在服务节点太少的情况下容易因为节点部分不均匀造成数据倾斜问题(数据大部分集中在一台缓存服务器);

一致性hash面试题_java面试算法

为了解决这种数据倾斜问题,hash算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个结果未知都放置一个此服务节点,称为虚拟节点,数据定位算法不变,只是多了一个虚拟节点到实际节点的映射,例如定位到NodeA#1,2,3三个虚拟节点的数据均定位到NodeA节点,这样就解决了服务节点少时的数据倾斜问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,这样即使很少的服务节点也能做到相对均匀的数据分布。

一致性hash面试题_java面试算法

一致性hash特性说明:

平衡性(balance)

平衡性是指hash的结果能够尽可能分布有缓存中去,这样可以使得所有的缓存空间都得到利用,当数据出现负载不均时,则采用虚拟节点平衡数据。

单调性(monotonicity)

单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲区加入到系统中,那么哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲区中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

分散性(spread)

在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。

负载(load)

负载问题实际上是从另一个角度看待分散性问题,终端有可能看不到所有的缓冲从而导致不同的key 保存到了相同的位置。

 

现在一致性hash算法在分布式系统中得到了广泛应用,例如memcached,redis等分布式缓存数据库,要注意的是服务端本身不提供分布式cache的一致性,而是由客户端提供的。一致性hash算法是分布式组件负载均衡的首选算法,它即可在客户端实现,也可以在中间件上实现:其应用有:

分布式散列表(DHT)设计;

分布式关系数据库(mysql),分库分表时计算数据与节点的映射关系;

分布式缓存;

RPC框架dubbo,用来选择服务提供者;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185674.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 小型企业的网络拓扑结构设计

    小型企业的网络拓扑结构设计小型企业的网络拓扑结构设计一、设计目的企业局域网的最终目标是建设整个单位的互联、统一、高效、实用、安全的局域网络,近期可支持上百个,远期至少可支持上午个并发用户,提供广泛的资源共享(包括硬件、软件和信息资源共享)。网络结构清楚、布线合理、充分考虑房间分布;局域网性能稳定、安全;软、硬件结合良好,公司日常办公需要,方便资源共享、游览有良好的兼容性和可扩展性,具备单位局域网与其他单位局域网互连,并…

    2022年7月15日
    17
  • 感知机(Perceptron)为什么不能表示异或(XOR)

    感知机(Perceptron)为什么不能表示异或(XOR)1.感知机不能表示异或在很早之前学PatternRecognition相关课程的时候,老师在课堂上就说过感知机遇到的一个大问题就是无法表示异或问题(XOR)。后来接触深度学习相关的内容,开头部分肯定会提到感知机,提到感知机也必会提到不能表示异或的问题。正好抽出点时间,稍微搞明白一下为什么感知机不能表示异或。2.感知机的数学定义感知机到底是什么呢?首先来看一下他的数学定义:假设输入空间(即样本的

    2022年7月16日
    18
  • python控制mt4自动交易软件排名_股票自动交易软件排名

    python控制mt4自动交易软件排名_股票自动交易软件排名原标题:股票自动交易软件排名提起股票自动交易软件,大家都很不陌生了,很多用户也使用过很多不同品牌的产品,那么谁比较好呢?接下来我们就为大家来总体排名一下:第一名:智能A股管家股票自动交易系统把它排在第一名是因为它的性价比高,功能上虽然比不上第二名,但它的价格确实普罗大众用户可以接受的功能:可以实现多种条件任务自动执行买卖,内置9种智能交易任务策略,止盈止损,拐点交易,自动T+0,闪电交易,双向卖…

    2022年5月30日
    57
  • 软件测试缺陷报告单怎么填,缺陷报告(缺陷报告怎么写)[通俗易懂]

    软件测试缺陷报告单怎么填,缺陷报告(缺陷报告怎么写)[通俗易懂]报告软件测试错误的目的是为了保证修复错误的人员可以重复报告的错误,从而有利于分析错误产生的原因,定位错误,然后修正之。因此,报告软件测试错误的基本要求。。1.首先要做一个“标题党”(此标题党非彼标题党)。标题一定要清晰简洁易理解,。[Product][Version]_[Feature]_[Title],这样描述会很清晰,也方便查找3.缺陷的标题一。。测试报告是对BUG的统计,计划的实施,后…

    2025年11月26日
    6
  • vue(22)Vuex的安装与使用

    vue(22)Vuex的安装与使用前言每一个Vuex应用的核心就是store(仓库)。store基本上就是一个容器,它包含着你的应用中大部分的状态(state)。Vuex和单纯的全局对象有以下两点不同:Vuex的状态存

    2022年7月30日
    7
  • python 查tensorflow版本_如何查看tensorflow的版本「建议收藏」

    python 查tensorflow版本_如何查看tensorflow的版本「建议收藏」本文介绍如何使用pip查看tensorflow的版本号,请查看如下步骤。本文使用的windows10系统,如为linux系统也是同样用pip命令查看。工具/原料window10python3.7(其他python也可以)方法/步骤1通过快捷键windows键+R,打开运行框,输入“cmd”命令,打开命令行窗口2在命令行窗口中输入命令piplist3命令执行后,会列出当前python环…

    2022年6月25日
    304

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号