谈谈一致性哈希算法

这篇具有很好参考价值的文章主要介绍了谈谈一致性哈希算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一致性哈希算法是1997年由麻省理工的几位学者提出的用于解决分布式缓存中的热点问题。大家有没有发现,我们之前介绍的例如快排之类的算法是更早的六七十年代,此时分布式还没有发展起来,
大家往往还在提高单机性能。但是九十年代开始,逐渐需要用分布式集群来解决大型问题,相应的算法研究也就应运而生。
在说到一致性哈希算法,我们还是得先从缓存的发展谈起:
缓存,我们一般是用来提速的,当规模或者说数据量小时,我们往往用单机来部署一套缓存系统即可,如下图:

谈谈一致性哈希算法

多台客户端在查询数据时,只要根据key进入缓存服务器查询到自己想要的内容即可。
但是随着业务的发展,单一的缓存服务器往往无法支撑住我们的业务需要。比如缓存数据太大,多城多活的网络部署等,
我们就需要多台缓存服务器来支撑,如下图:

谈谈一致性哈希算法

客户端需要查询缓存时,先根据哈希算法,讲key进行计算,得到哈希值。然后通过哈希值对机器数取模(%n)来判定落在哪台机器上。
这个架构很简单,也很易实现,我们就不多说了。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
但是这里会存在一个缓存服务器伸缩的问题:什么意思呢?比如目前是三台,我们由于业务的需要,需要变为四台,或者变为两台。那么我们需要调整一遍所有数据所处的服务器位置,因为他们存在的位置都有可能改变。

谈谈一致性哈希算法

分布式缓存本来就是为了解决大数据量问题的,此时重新调整,势必会极度影响可用性。那么如何解决呢?
来看看一致性哈希算法的思路:
我们假设存在一个虚拟环,这个环足够大,上边存在2^32个节点,三台器机器呢,我们根据id计算出他们在环中所处的位置,如图所示:

谈谈一致性哈希算法

 文章来源地址https://www.toymoban.com/news/detail-468555.html

当我们计算数据所处的缓存位置,不再是根据n来取模,而是根据2^32来取模,此时会有相当多的数据并没有落在缓存服务器所处的节点上。
那怎么办呢?我们按照顺时针方向计算,将数据落在下一个最近的顺时针节点上。
如下图所示:

谈谈一致性哈希算法

这样当我们新增或者删除节点时,只会影响有限的节点上的数据,极大的缩小了受影响的节点和数据。我们只需要重新计算受影响的数据即可,但是这样还会存在新的问题:
1、缓存服务器计算出的位置不均匀,导致覆盖的节点数差异明显;(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
2、数据并不均衡:数据经过哈希和取模运算后,可能落在集中的一片区域中,造成对应的缓存服务器的数据特别大。
以上问题我们称之为数据倾斜。数据倾斜的程度明显后,可能会导致所解决的问题再次出现(前文中的红字部分)。
那如何解决这种问题呢?很简单,加节点,只要节点足够多,那么就会越来越趋于平均,数据倾斜的情况就会越不突出。但是缓存服务器是有限的,并不是想加多少都可以的。
那怎么办呢?

我们可以采用虚拟缓存节点的形式解决问题。什么是虚拟缓存节点,就是并不实际存在的缓存节点。只是一个虚拟的点。
每个真实的缓存服务器对应多个虚拟缓存节点,两者是一对多的关系,如下图所示:

谈谈一致性哈希算法

虚拟节点--图中连接在环上的就是虚拟缓存节点。
真实缓存节点--Cache
每个Cache对应若干的虚拟节点。当增减Cache时,我们只要调整对应的虚拟节点所对应的数据即可。

 

到了这里,关于谈谈一致性哈希算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一致性哈希算法优势在哪?如何实现?

    1.1 简介Hash 哈希算法即散列算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改

    2024年02月03日
    浏览(41)
  • Redis扩容机制与一致性哈希算法解析

    在分布式系统设计中,Redis是一个备受欢迎的内存数据库,而一致性哈希算法则是分布式系统中常用的数据分片和负载均衡技术。本文将深入探讨Redis的扩容机制以及一致性哈希算法的原理,同时提供示例代码以帮助读者更好地理解这两个重要概念。 Redis是一种高性能的内存数

    2024年02月11日
    浏览(35)
  • 什么是一致性哈希?一致性哈希是如何工作的?如何设计一致性哈希?

    如果你有 n 个缓存服务器,一个常见的负载均衡方式是使用以下的哈希方法: 服务器索引 = 哈希(键) % N ,其中 N 是服务器池的大小。 让我们通过一个例子来说明这是如何工作的。如表5-1所示,我们有4台服务器和8个字符串键及其哈希值。 为了获取存储某个键的服务器,我们

    2024年02月06日
    浏览(38)
  • Sharding-JDBC 自定义一致性哈希算法 + 虚拟节点 实现数据库分片策略

    分片操作是分片键 + 分片算法,也就是分片策略。目前Sharding-JDBC 支持多种分片策略: 标准分片策略 对应StandardShardingStrategy。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。 复合分片策略 对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作

    2024年02月02日
    浏览(37)
  • 一致性哈希(哈希环)解决数据分布问题

    哈希算法是程序开发过程中最广泛接触到的的算法之一,典型的应用有安全加密、数据校验、唯一标识、散列函数、负载均衡、数据分片、分布式存储。前些天遇到用一致性哈希(哈希环)的场景,不过我细想一下,对这个知识点好像了解过,但是又没太深印象,说不出具体

    2024年02月04日
    浏览(38)
  • 【分布式】一致性哈希和哈希槽

    当我们拥有了多台存储服务器之后,现在有多个key,希望可以将这些个key均匀的缓存到这些服务器上,可以使用哪些方案呢? 1.1 直接哈希取模 这是一种最容易想到的方法,使用取模算法hash(key)% N,对key进行hash运算后取模,N是机器的数量。key进行hash后的结果对3取模,得

    2024年02月03日
    浏览(29)
  • Dubbo负载均衡策略之 一致性哈希

    本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用。通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的问题和解决方案。 在这里引用dubbo官网的一段话——

    2024年02月08日
    浏览(47)
  • 得物面试:Redis用哈希槽,而不是一致性哈希,为什么?

    在40岁老架构师 尼恩的 读者交流群 (50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: Redis为何用哈希槽而不用一致性哈希? 最近有小伙伴在面试网易,又遇到了相关的面试题。

    2024年02月21日
    浏览(37)
  • Dubbo负载均衡策略之 一致性哈希 | 京东云技术团队

    本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用。通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的问题和解决方案。 在这里引用dubbo官网的一段话——

    2024年02月08日
    浏览(34)
  • JAVA面试题分享五百六十五:为啥Redis用哈希槽,不用一致性哈希?

    无论是哈希槽,还是一致性hash,都属于hash取模数据分片。 先从经典的hash取模数据分片说起 假如 Redis集群的节点数为3个,使用经典的hash取模算法进行数据分片,实际上就是一个节点一个数据分片,分为3片而已。 每次请求使用 hash(key) % 3 的方式计算对应的节点,或者进行

    2024年04月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包