初始架构

 
策略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. css3制作网页中常见的小箭头

    /* css3三角形(向上 ▲) */ div.arrow-up { width:0px; height:0px; border-left:5px solid transparent;  /* 右透明 ...

  2. Java命令模式以及来自lambda的优化

    前言    设计模式是软件工程中一些问题的统一解决方案的模型,它的出现是为了解决一些普遍存在的,却不能被语言特性直接解决的问题,随着软件工程的发展,设计模式也会不断的进行更新,本文介绍的是经典设计模式 ...

  3. Xadmin集成富文本编辑器ueditor

    在xadmin中通过自定义插件,实现富文本编辑器,效果如下: 1.首先,pip安装ueditor的Django版本: pip install DjangoUeditor 2.之后需要添加到项目的set ...

  4. vim下单行长文本的时候卡顿解决办法

    在vim编辑文件时,若单行过长,可能会导致vim卡顿,严重影响使用体验 估计是syntax匹配效率过滥导致.. 偶尔发现了一个临时的解决办法就是关掉syntax然后再打开,即在命令模式下 :synta ...

  5. JAVA提高七:类加载器

    今天我们学习类加载器,关于类加载器其实和JVM有很大关系,在这里这篇文章只是简单的介绍下类加载器,后面学习到JVM的时候还会详细讲到类加载器,本文分为下面几个小节讲解: 一.认识类加载器 1.什么是类 ...

  6. ListView如何优化

    1.ListView 如何提高其效率? 当 convertView 为空时,用 setTag()方法为每个 View 绑定一个存放控件的ViewHolder 对象. 当 convertView 不为空 ...

  7. LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  8. SQL基本查询_单表查询(实验二)

    SQL基本查询_单表查询(实验二) 查询目标表结构及数据 emp empno ename job hiedate sal comn deptno 1007 马明 内勤 1992-6-12 4000 2 ...

  9. jvm - 垃圾回收

    jvm - 垃圾回收 注意 : 本系列文章为学习系列,部分内容会取自相关书籍或者网络资源,在文章中间和末尾处会有标注 垃圾回收的意义 它使得java程序员不再时时刻刻的关注内存管理方面的工作. 垃圾回 ...

  10. 译:Asp.Net Identity与Owin,到底谁是谁?

    送给正在学习Asp.Net Identity的你 :-) 原文出自 trailmax 的博客AspNet Identity and Owin. Who is who. Recently I have ...