一致性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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 网关gateway详解_gateway路由

    网关gateway详解_gateway路由见:https://baike.baidu.com/item/%E7%BD%91%E5%85%B3/98992?fr=aladdin及其它。网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。网关是一种充当转换重任的计算机系统或设备。使用在不同的通…

    2022年10月11日
    0
  • 漫画网站爬虫详解_爬虫怎样爬取网站数据

    漫画网站爬虫详解_爬虫怎样爬取网站数据下面对http://www.svmhz.com/shaonvmanhua/进行爬取,对大神的博客进行详解:根据网页图片查看响应代码,选中√的地方查看源代码的方法,浏览器页面按下F12,然后鼠标移动到某个图片时,下面的代码就会变暗如下,选中网页上的图片时,下面的响应代码就会变暗鼠标挪动到图片上就出现了下面

    2022年8月23日
    3
  • 微服务架构-实现技术之三大关键要素2数据一致性:分布式事物+CAP&BASE+可靠事件模式+补偿模式+Sagas模式+TCC模式+最大努力通知模式+人工干预模式

    微服务架构-实现技术之三大关键要素2数据一致性:分布式事物+CAP&BASE+可靠事件模式+补偿模式+Sagas模式+TCC模式+最大努力通知模式+人工干预模式目录一、分布式事物:本地事务和分布式事务(2PC+3PC)+传统分布式事务的问题(一)本地事务和分布式事务(2PC+3PC)(1)两阶段提交协议2PC(2)三阶段提交协议3PC(二)对于微服务,传统分布式事务存在的问题二、CAP理论和BASE思想1.CAP理论一致性Consistency:可用性Availability:分区容错性PartitionToler…

    2022年4月27日
    37
  • python删除文本最后一行_用python删除文件中的最后一行

    python删除文本最后一行_用python删除文件中的最后一行如何用python删除文件的最后一行?输入文件示例:helloworldfoobar输出文件示例:helloworldfoo我创建了以下代码来查找文件中的行数,但是我不知道如何删除特定的行号。我是新来的python–所以如果有一个更简单的方法–请告诉我。try:file=open(“file”)exceptIOError:print”Failedtoreadfile.”cou…

    2022年5月18日
    43
  • ubuntu下为lazarus添加sqlite3开发环境

    ubuntu下为lazarus添加sqlite3开发环境

    2021年8月18日
    44
  • 【Unity3D 灵巧小知识点】 ☀️ | 切换场景后保留上个场景中的游戏物体不被销毁

    【Unity3D 灵巧小知识点】 ☀️ | 切换场景后保留上个场景中的游戏物体不被销毁Unity小科普老规矩,先介绍一下Unity的科普小知识:Unity是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。也可以简单把Unity理解为一个游戏引擎,可以用来专业制作游戏!Unity小知识点学习切换场景后保留上个场景中的.

    2022年5月20日
    46

发表回复

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

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