一致性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. js 垃圾回收 & js GC

    js 垃圾回收 & js GC js GC / js Garbage Collector https://developer.mozilla.org/en-US/docs/Web/JavaSc ...

  2. AMP ⚡

    AMP https://amp.dev/zh_cn/ PWA AMP Playground https://playground.amp.dev/?runtime=amp4email <!doc ...

  3. git 强制提交 & 覆盖 origin/master

    git 强制提交 & 覆盖 origin/master git 强制提交本地分支覆盖远程分支 # git push origin 分支名 --force # local $ git push ...

  4. vue 使用stylus

    λ yarn add stylus stylus-loader --dev <style scoped lang="stylus"> div color #ff4488 ...

  5. element-ui的树型结构图,半选状态数据给后台后,返回数据带有半选父节点的剔除展示

    // html <h2 class="text-gray">功能权限</h2><el-tree :data="permissionList& ...

  6. NGK全球启动大会正式启动,资产上链的前景与机会在哪?

    据彭博社报道,加州时间11月25日,NGK全球启动大会在美国硅谷圆满落幕,本次NGK全球启动大会为NGK全球化进程正式拉开了帷幕. 众多业界人士共襄盛举,共同进行探讨未来公链发展的去向和契机. 当前, ...

  7. Echarts制作一张全球疫情图

    一.获取全球疫情数据 1)获取API 使用用友提供的新冠肺炎实时数据,登录注册之后可以免费使用. 2)点击用户信息 这里的AIPCODE,复制并保存,用于后续的使用. 3)API的使用 用友有提供一个 ...

  8. CPU使用率原理及计算方式

    本文转载自CPU使用率原理及计算方式 CPU:超线程和多核 超线程(Hyper-Threading ) 超线程是Intel最早提出一项技术,最早出现在2002年的Pentium4上.单个采用超线程的C ...

  9. Coposition 详解

    LifeCycle Hooks 在新版的生命周期函数,可以按需导入到组件中,且只能在setup()函数中使用. import { onMounted, onUnmounted } from 'vue' ...

  10. RabbitMQ-RPC版主机管理程序

    一.作业需求 1.可以对指定机器异步的执行多个命令 例子: 请输入操作指令>>>:run ipconfig --host 127.0.0.0 in the call     tack ...