初始架构

 
策略1:每一次memcached请求随机发送到一台memcached机器
两个问题:
1、同一份数据可能被存在不同的机器上而造成数据冗余
2、有可能某数据已经被缓存但是访问却没有命中
 
策略2:保证对相同的key的访问会被发送到相同的服务器
h = Hash(key)%N
 
解决上面两个问题,但是引入新的问题——容错性和扩展性不好
 
容错性:指当系统中某一个或几个服务器变得不可用时,整个系统是否可以正确高效运行
扩展性:指当加入新的服务器后,整个系统是否可以正确高效运行
 
当减少一台服务器,需要按照Hash(key)%(N-1)
当增加一台服务器,需要按照Hash(key)%(N+1)
 
当系统中一旦服务器变更,大量的key会重定位到不同的服务器从而能造成大量的缓存不命中。
 
一个设计良好的分布式哈希方案应该具有良好的单调性,即服务器节点的增减不会造成大量哈希重定位。
 
策略3:一致性哈希算法
算法描述
一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2**32-1(哈希值是一个32位无符号整形),整个哈希空间环如下:
 
定位服务器
 
将各个服务器使用H进行一个哈希,具体可以选择服务器的ip或者主机名作为关键字进行哈市,这样每台机器就能确定其在哈希环上的位置
 
定位数据
将数据key使用相同的函数H计算出哈希值h,通过h确定在数据在环上的位置,从此位置沿环顺时针行走,第一台遇到的服务器就是其应该定位的服务器。
假设有A、B、C、D四个数据对象,经过哈希计算后,在环空间上的位置如下:
 
A被定位Server1,D被定位Server3,B和C定位Server2
 
容错性与可扩展性分析
容错性
假如说Server3宕机了
可以看到此时A、C、B不会受影响,只有D节点被重定位到Server2
在一致性哈希算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器之间的数据,其他不会受影响。
可扩展性
增加一台服务器
A、D、C不受影响,只有B需要重定位新的Server4。在一致性哈希算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即顺子逆时针行走遇到的第一台服务器)
之间数据,其他不会受影响。
 
一致性哈希算法对于节点的增减都只需要重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。
 
虚拟节点
一致性哈希算法在服务节点很少,容易因为节点分布不均匀而造成数据倾斜问题。
此时必然造成大量数据集中在server1上,而只有极少量在server2上。
 
为了解决这种数据倾斜问题,一致性哈希算法引入虚拟节点机制。
对每个服务节点计算多个哈希值,每个计算结果位置都防止一个此服务节点,称为虚拟节点。
“Memcached Server 1#1”
“Memcached Server 1#2”
“Memcached Server 1#3”
“Memcached Server 2#1”
“Memcached Server 2#2”
“Memcached Server 2#3”
形成六个节点
 
 
 

一致性hash算法以及其在分布式系统中的应用(转)的更多相关文章

  1. 一致性Hash算法在数据库分表中的实践

    最近有一个项目,其中某个功能单表数据在可预估的未来达到了亿级,初步估算在90亿左右.与同事详细讨论后,决定采用一致性Hash算法来完成数据库的自动扩容和数据迁移.整个程序细节由我同事完成,我只是将其理 ...

  2. 一致性Hash算法在Redis分布式中的使用

    由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢? ...

  3. 一致性Hash算法在Memcached中的应用

    前言 大家应该都知道Memcached要想实现分布式只能在客户端来完成,目前比较流行的是通过一致性hash算法来实现.常规的方法是将server的hash值与server的总台数进行求余,即hash% ...

  4. (转) 一致性Hash算法在Memcached中的应用

    前言 大家应该都知道Memcached要想实现分布式只能在客户端来完成,目前比较流行的是通过一致性hash算法来实现.常规的方法是将 server的hash值与server的总台数进行求余,即hash ...

  5. jedis中的一致性hash算法

    [http://my.oschina.net/u/866190/blog/192286] jredis是redis的java客户端,通过sharde实现负载路由,一直很好奇jredis的sharde如 ...

  6. 一致性hash算法在memcached中的使用

    一.概述 1.我们的memcacheclient(这里我看的spymemcache的源代码).使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同.仅仅是对我们要存 ...

  7. LB中使用到的一致性Hash算法的简单实现

    1.类的Diagram 2.代码实现 2.1.Node类,每个Node代表集群里面的一个节点或者具体说是某一台物理机器: package consistencyhash; import lombok. ...

  8. 【转载】一致性hash算法释义

    http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karge ...

  9. 分布式算法(一致性Hash算法)

    一.分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法( ...

随机推荐

  1. ASP.NET/MVC 配置log4net启用写错误日志功能

    <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访 ...

  2. Jquery地图热点效果-鼠标经过弹出提示信息

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. WebService文件上传相关配置(404.13、超出限制、超时)

    最近在做文件上传的功能,遇到一些问题,记录如下,以备以后使用. 1.HTTP Error 404.13 - Not Found,请求筛选模块被配置为拒绝超过请求内容长度的请求. IIS默认允许请求长度 ...

  4. Windows下编译Python2.7源码

    本文开始一个系列文章,深入理解Python源码,算是阅读<Python源码剖析>一书的读书笔记,是一项长期进行的工作.一共分三个部分:Python对象模型,Python虚拟机,Python ...

  5. Go语言备忘录:net/http包的使用模式和源码解析

    本文是晚辈对net/http包的一点浅显的理解,文中如有错误的地方请前辈们指出,以免误导! 转摘本文也请注明出处:Go语言备忘录:net/http包的使用模式和源码解析,多谢!  目录: 一.http ...

  6. uva12716 GCD XOR

    个人博客:http://acbingo.cn/2015/06/04/uva12716/ 被紫薯上*和素数筛法类似*这句话给误解了= =,一直以为存在某种关系,在枚举c或者a时,可以根据当前的答案,筛掉 ...

  7. php代码常见错误详解整理

    错误类型: 一.未使用二进制上传   代码:    Fatal error: This encoded file is corrupted. Please refer to http://www.ze ...

  8. C 数组使用时注意点

    数组注意点: 数组为静态时,初始化长度必为常量表达式 数组长度由最后一个元素决定其长度,可以指定特定元素,如: int arr[] = {0, 1, [5]=5, 6}; 没有提供初始值的元素赋值为0 ...

  9. SAP开发快捷键

    F1 帮助     F2 回车确认(在某些地方可用,比如ABAP)     F3 返回     F4 选择输入项     F5 新增     F6 复制为...     F7 全选     F8 选择 ...

  10. Java基础笔记5

    方法(函数) 就是一块可以重复调用的代码块. 比如.100行代码. 在多处使用. 方法的格式 public static 返回类型 方法名称(参数列表){ } 返回类型:当方法被调用时,把返回内容 交 ...