分布式缓存 - hash环/一致性hash
一 引言
当前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相关推荐
- php哈希取模,PHP取模hash和一致性hash操作Memcached分布式集群
本篇笔记记录了PHP使用Memcached扩展,采用取模hash和一致性hash算法操作Memcached分布式集群的实现对比 1.开启4个Memcached服务模拟集群 2.取模hash算法 php ...
- cdn缓存服务器有网站图片,CDN缓存服务器图片存储一致性hash算法的理解
用hash做缓存,假如有三台服务器,1,2,3,有三万张图片,我想将图片平均缓存到我三台服务器上,一个服务器大概一万张,怎么去实现这个办法呢,可以用hash来取余数进行操作,加入我们是以图片的名字作为 ...
- hash和一致性hash
hash:简单的hash取余 优点: 计算简单,快速定位 缺点: 容错和扩展差,任何的增加机器或减少机器,都会伴随着重新set值 比如原来有五台机器做缓存,现在加一台,那么余5就变成余6,那么所有值都 ...
- 一致性Hash(Consistent Hashing)原理剖析
引入 在业务开发中,我们常把数据持久化到数据库中.如果需要读取这些数据,除了直接从数据库中读取外,为了减轻数据库的访问压力以及提高访问速度,我们更多地引入缓存来对数据进行存取.读取数据的过程一般为: ...
- 一致性Hash(Consistent Hashing)原理剖析及Java实现
目录 一.一致性Hash(Consistent Hashing)原理剖析 二.一致性hash算法的Java实现 一.一致性Hash(Consistent Hashing)原理剖析 引入 一致性哈希算法 ...
- redis系列之——一致性hash算法
Redis系列目录 redis系列之--分布式锁 redis系列之--缓存穿透.缓存击穿.缓存雪崩 redis系列之--Redis为什么这么快? redis系列之--数据持久化(RDB和AOF) re ...
- 一致性hash算法_分布式寻址算法
一.分布式寻址算法简介 分布式寻址算法是很重要的内容,不了解这些算法,也就不能透彻的了解各种分布式中间件的原理.简单说一下这些高大上的寻址到底是个啥意思,比如在elasticsearch中,采用的是多 ...
- 一致性 Hash 算法学习(分布式或均衡算法)
简介: 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的 ...
- 什么是一致性 Hash 算法
数据分片 先让我们看一个例子吧 我们经常会用 Redis 做缓存,把一些数据放在上面,以减少数据的压力. 当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了: ...
最新文章
- 【java】Maven工程引入各种jar包的功能
- BootStrap-select插件动态添加option无法显示
- VIPKID 张武锋:自研RTC的故事
- ysql怎么处理百分数? “%”
- [导入]源代码版本控制(二)
- 企业发卡修复版源码(短链二维码)
- Tensorflow并行计算:多核(multicore),多线程(multi-thread),计算图分割(Graph Partition)
- 数据结构学习笔记:实现链表
- TokenInsight:BTC现货交易量环比上周大幅上升,人气指数小幅回落
- ActiveMQ 消息游标(Message Cursors)
- ❤️缓存集合(一级缓存、二级缓存、缓存原理以及自定义缓存—源码+图文分析,建议收藏) ❤️
- Windows核心编程_让窗口跟随系统样式变化
- 志远电脑公司网站系统
- 用Matlab筛选mirbase,一种基于miRBase数据库的无参的miRNA数据分析方法与流程
- 浅谈能耗分项计量监测系统在某大型公建的应用
- mysql odb驱动_ODB学习笔记之基础环境搭建
- win10默认壁纸_Win10系统待机锁频壁纸怎么提取?
- openoffice 中文乱码问题
- 开手游要选用怎么样的服务器
- 华为手机体验鸿蒙系统,再过40天,你就能在华为手机上,体验到鸿蒙系统了? - 区块网...
热门文章
- 1036:A×B问题
- 【STM32】ESP8266模块简介
- 【Linux】一步一步学Linux——date命令(81)
- vue 中provide的用法_聊聊Vue中provide/inject的应用详解
- Html百分比设宽偏差大,absolute和relative元素 设置百分比宽高的差异
- 优图yolo-v2 loss解析(tensorflow)
- iOS Hacker 动态库 dylib 注入
- MFC主线程使用WaitForSingleObject阻塞的问题
- windows7不支持AllocateAndGetTcpExTableFromStack
- HDU - 6625 three arrays (Trie+dfs)