一 引言

当前memcached,redis这类分布式kv缓存已经非常普遍。我们知道memcached的分布式其实是一种"伪分布式",也就是它的服务器节点之间其实是无关联的,之间没有网络拓扑关系,由客户端来决定一个key要存放在哪台机器。

具体来讲,假设我们有多台memcached服务器,编号分别为m0, m1, m2.. 对于一个key,由客户端来决定存放到哪台机器,最简单的办法就是key % N, 其中N是机器的总数

但是有一个问题,一旦机器数增加或减少,N发生变化,key去mod新旧N得到的机器编号大概率不相等,那么之前存放的数据就全部无效了。

二 hash环

基于上面的问题,提出了hash环的概念。hash环的过程有两次hash

(1) 把所有的机器编号hash到这个环上

(2) 把key也hash到这个环上,然后在这个环上进行匹配,看这个key和哪台机器匹配

具体过程是这样: 假定有一个hash函数,其值空间为(0 ~ 2^32-1)。也就是说,其hash值是个32位无整型数字,这些数字组成一个环。首先对机器进行hash(比如根据机器ip),算出每台机器在这个环上的位置; z再对key进行hash,算出该key在环上的位置,然后从这个位置往前走,遇到的第一台机器就是该key对应的机器,就把该(key, value)存储到该机器上,如下图所示。

首先计算出每台cache服务器在环上的位置(图中浅蓝色的大圆圈),然后每来一个key计算出value填到环上的位置(图中橙色的小圆圈),然后顺时针走,遇到的第一个机器,就是要存储的机器

这里的关键点是:当机器数N变化时,其他机器在环上的位置并不会发生改变。这样只有增加/减少的那台机器附近的数据会失效,其他机器上的数据还是有效的。

三 数据倾斜问题

当机器不很多时,很可能出现几台机器在环上面贴的很近,分布很不均匀。这将会导致大部门数据集中在某几台机器上。

为了解决这个问题,可以引入"虚拟机器"的概念,也就是说,一台机器需要在环上映射出多个位置。比如我们用机器的ip来hash,那么我们可以在ip后面加几个编号,形如ip_1, ip_2, ip_3... 这样就实现了一台物理机器映射出了多个虚拟机器的编号。

数据首先映射到"虚拟机器"上,再从"虚拟机器"映射到物理机器上。因为虚拟机器可以很多,在环上均匀分布,从而保证数据相对均匀地分布在物理机器上。

四 zk的引入

上面我们提到了服务器的机器数N的变化,那么如何通知到客户端呢

一种笨方法就是手动,当机器数N变化,重新配置客户端,重启客户端。

另外一种,引入zk,服务器的节点列表注册到zk上面,客户端监听zk。发现节点数发生变化,自动更新自己的配置。

当然不用zk用一个其他的中心节点也可以,只要能实现这种更改的通知即可(也即分布式服务协调)

转载于:https://www.cnblogs.com/balfish/p/8550198.html

分布式缓存 - hash环/一致性hash相关推荐

  1. php哈希取模,PHP取模hash和一致性hash操作Memcached分布式集群

    本篇笔记记录了PHP使用Memcached扩展,采用取模hash和一致性hash算法操作Memcached分布式集群的实现对比 1.开启4个Memcached服务模拟集群 2.取模hash算法 php ...

  2. cdn缓存服务器有网站图片,CDN缓存服务器图片存储一致性hash算法的理解

    用hash做缓存,假如有三台服务器,1,2,3,有三万张图片,我想将图片平均缓存到我三台服务器上,一个服务器大概一万张,怎么去实现这个办法呢,可以用hash来取余数进行操作,加入我们是以图片的名字作为 ...

  3. hash和一致性hash

    hash:简单的hash取余 优点: 计算简单,快速定位 缺点: 容错和扩展差,任何的增加机器或减少机器,都会伴随着重新set值 比如原来有五台机器做缓存,现在加一台,那么余5就变成余6,那么所有值都 ...

  4. 一致性Hash(Consistent Hashing)原理剖析

    引入 在业务开发中,我们常把数据持久化到数据库中.如果需要读取这些数据,除了直接从数据库中读取外,为了减轻数据库的访问压力以及提高访问速度,我们更多地引入缓存来对数据进行存取.读取数据的过程一般为: ...

  5. 一致性Hash(Consistent Hashing)原理剖析及Java实现

    目录 一.一致性Hash(Consistent Hashing)原理剖析 二.一致性hash算法的Java实现 一.一致性Hash(Consistent Hashing)原理剖析 引入 一致性哈希算法 ...

  6. redis系列之——一致性hash算法

    Redis系列目录 redis系列之--分布式锁 redis系列之--缓存穿透.缓存击穿.缓存雪崩 redis系列之--Redis为什么这么快? redis系列之--数据持久化(RDB和AOF) re ...

  7. 一致性hash算法_分布式寻址算法

    一.分布式寻址算法简介 分布式寻址算法是很重要的内容,不了解这些算法,也就不能透彻的了解各种分布式中间件的原理.简单说一下这些高大上的寻址到底是个啥意思,比如在elasticsearch中,采用的是多 ...

  8. 一致性 Hash 算法学习(分布式或均衡算法)

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

  9. 什么是一致性 Hash 算法

    数据分片 先让我们看一个例子吧 我们经常会用 Redis 做缓存,把一些数据放在上面,以减少数据的压力. 当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了: ...

最新文章

  1. 【java】Maven工程引入各种jar包的功能
  2. BootStrap-select插件动态添加option无法显示
  3. VIPKID 张武锋:自研RTC的故事
  4. ysql怎么处理百分数? “%”
  5. [导入]源代码版本控制(二)
  6. 企业发卡修复版源码(短链二维码)
  7. Tensorflow并行计算:多核(multicore),多线程(multi-thread),计算图分割(Graph Partition)
  8. 数据结构学习笔记:实现链表
  9. TokenInsight:BTC现货交易量环比上周大幅上升,人气指数小幅回落
  10. ActiveMQ 消息游标(Message Cursors)
  11. ❤️缓存集合(一级缓存、二级缓存、缓存原理以及自定义缓存—源码+图文分析,建议收藏) ❤️
  12. Windows核心编程_让窗口跟随系统样式变化
  13. 志远电脑公司网站系统
  14. 用Matlab筛选mirbase,一种基于miRBase数据库的无参的miRNA数据分析方法与流程
  15. 浅谈能耗分项计量监测系统在某大型公建的应用
  16. mysql odb驱动_ODB学习笔记之基础环境搭建
  17. win10默认壁纸_Win10系统待机锁频壁纸怎么提取?
  18. openoffice 中文乱码问题
  19. 开手游要选用怎么样的服务器
  20. 华为手机体验鸿蒙系统,再过40天,你就能在华为手机上,体验到鸿蒙系统了? - 区块网...

热门文章

  1. 1036:A×B问题
  2. 【STM32】ESP8266模块简介
  3. 【Linux】一步一步学Linux——date命令(81)
  4. vue 中provide的用法_聊聊Vue中provide/inject的应用详解
  5. Html百分比设宽偏差大,absolute和relative元素 设置百分比宽高的差异
  6. 优图yolo-v2 loss解析(tensorflow)
  7. iOS Hacker 动态库 dylib 注入
  8. MFC主线程使用WaitForSingleObject阻塞的问题
  9. windows7不支持AllocateAndGetTcpExTableFromStack
  10. HDU - 6625 three arrays (Trie+dfs)