一致性hash

前言

说出来大家可能不相信,我昨天做梦梦到自己在面试,然后面试官问了我这个问题哈哈~然后我就打算按照自己的理解写一写。如果有写的不对的欢迎大家指正!

直接开始

普通hash算法

普通hash算法就是把存储的key取hash然后再对节点数取模之后判断key所在节点的位置,

如上图所示,假设现在有key1,key2,key3,key4四个key,通过上面说的方法均匀分布在了这4个节点上面。看上去非常nice~

但是如果现在我们集群需要扩容,增加一台机器会发生啥?

可以看到,由于现在增加了一台机器,所以现在我们取模的对象由3变成了4。

导致什么现象呢?假设我们的数据现在没有迁移,那原来的key3和key4本来是分别在node0和node1上的,现在通过hash取模运算之后却是在node0和node3上,所以在数据不做迁移的情况下会导致原有的缓存会大量失效。然后这种大面积的数据迁移是非常麻烦的!

这是扩容导致的问题,如果集群中的节点宕机呢?

现在node2挂了,集群节点数量变成了2,对应的key通过hash取模之后所在的节点也会变化。导致node2上面原有的key查询不到,会直接查库。其余的key,除了key1能正常查询外,其他key全都失效了。这时不仅涉及到数据迁移还会导致缓存穿透。

一致性hash

一致性hash其实是普通取模hash算法的改良版,其hash计算方法没有变化,但是hash空间发生了变化,由原来的线性的变成了环。缓存节点通过hash计算之后得到在hash环中的位置;key通过hash计算之后得到所在环的位置,然后顺时针方向找到第一个节点,这个节点就是存放key的节点。

来看看一致性hash是如何解决普通取模hash中扩容和宕机的问题的。

假设现在我们增加了一个节点node3,原来的key1现在顺时针找到了新增加node3,对其余的节点没有任何影响。只需要将node0到node3之间的key迁移到新的节点即可。

如果node2现在宕机了,那么原来的key2顺时针找到的节点会变成node0,其余节点也没有任何影响,只需要把node2上的key迁移到node0上即可。

那这个一致性hash难道就没有啥毛病了嘛?

想一下,如果我们的节点数量很少,并且节点偏向一侧会发生什么事情?

可以看到很大一部分的key都会落在node0上,从而导致node0的压力过大挂掉,node0挂掉之后数据同时又会向node1上转移,node1又会挂掉,最终导致整个集群不可用!这就是数据倾斜的问题,会引起节点雪崩。可想而知这个问题会很严重。

一致性hash优化

数据倾斜的问题是通过虚拟节点来解决的。

就是在节点稀疏的hash环上对物理节点虚拟出一部分虚拟节点,key会打到虚拟节点上面,而虚拟节点上的key实际也是映射到物理节点上的,这样就避免了数据倾斜导致单节点压力过大导致节点雪崩的问题。

结语

做梦引起的一片博文。

介绍了普通取模hash的弊端,一致性hash如何解决,以及一致性hash优化的问题。

上面的介绍如果有什么不对的地方希望各位能指正~我也会虚心接受。

什么是一致性hash?的更多相关文章

  1. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  2. 转载自lanceyan: 一致性hash和solr千万级数据分布式搜索引擎中的应用

    一致性hash和solr千万级数据分布式搜索引擎中的应用 互联网创业中大部分人都是草根创业,这个时候没有强劲的服务器,也没有钱去买很昂贵的海量数据库.在这样严峻的条件下,一批又一批的创业者从创业中获得 ...

  3. 一致性hash算法详解

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  4. 探索c#之一致性Hash详解

    阅读目录: 使用场景 算法原理 虚拟节点 代码示例 使用场景 以Redis为例,当系统需要缓存的内容超过单机内存大小时,例如要缓存100G数据,单机内存仅有16G时.这时候就需要考虑进行缓存数据分片, ...

  5. 一致性hash算法简介

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...

  6. 分布式缓存技术memcached学习(四)—— 一致性hash算法原理

    分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...

  7. 关于Memcached一致性hash的探究

    参考文章 http://blog.chinaunix.net/uid-20498361-id-4303232.html http://blog.csdn.net/kongqz/article/deta ...

  8. 一致性 hash 算法( consistent hashing )a

    一致性 hash 算法( consistent hashing ) 张亮 consistent hashing 算法早在 1997 年就在论文 Consistent hashing and rando ...

  9. Ceph剖析:数据分布之CRUSH算法与一致性Hash

    作者:吴香伟 发表于 2014/09/05 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 数据分布是分布式存储系统的一个重要部分,数据分布算法至少要考虑以下三个 ...

  10. 一致性Hash算法

    from wikipedia 一致哈希 历史 1997年由MIT的Karger等在一篇学术论文中提出如何将“一致性Hash”应用于用户易变的分布式Web服务中.也可用于实现健壮缓存来减少大型Web应用 ...

随机推荐

  1. React Testing All in One

    React Testing All in One React 测试 https://reactjs.org/docs/testing.html jest 26.4 https://jestjs.io/ ...

  2. Versatile Python 3.x

    Versatile Python 3.x TryPython Python 3.8.0 (default, Nov 14 2019, 22:29:45) [GCC 5.4.0 20160609] on ...

  3. serverless & front end

    serverless & front end Cloud Functions or Functions as a Service (FaaS) https://serverless.css-t ...

  4. React Native & CodePush & App Center

    React Native & CodePush & App Center https://docs.microsoft.com/en-us/appcenter/distribution ...

  5. c++ 使用PID获取顶级窗口句柄和标题

    #include <iostream> #include <Windows.h> using namespace std; BOOL CALLBACK EnumWindowsP ...

  6. NGK公链脱颖而出,成为值得期待的项目!

    当下2020年是动荡的一年,全世界经济危机汲汲可危,在这个特殊的时刻,有人抱怨说这是最坏的年代,也有人庆幸说这是最好的年代,历史不会重演,但总是惊人的相似,首先带你回顾一下上一次金融危机出现的2008 ...

  7. 【重榜?】.NET 6 Preview 1 开箱上手!带你尝试新版本更新!

    目录 跨平台 UI 应用 Blazor 桌面应用 System.CommandLine 其它更新 ASP.NET Core 最近 .NET 6 Preview 1 发布了,.NET 统一是此版本的核心 ...

  8. Python学习笔记_有关tuple的几点强调

    创建只有一个元素的tuple,需要用逗号结尾消除歧义 a_tuple = (2,) tuple中的list mixed_tuple = (1, 2, ['a', 'b']) print("m ...

  9. Java自学第7期——异常(Exception)

    1.概念: 异常 :指的是程序在执行过程中,出现的非正常的情况,终会导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类, 产生异常就是创建异常对象并抛出了一个异常对象. Ja ...

  10. 将日志发送到log日志文件中

    log.debug("toUser:"+toUser+",subject:"+subject+",content:"+content);