初始架构

 
策略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. Jquery 多选全选/取消 选项卡切换 获取选中的值

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. Telerik 控件 RadGridview实现绑定

    0.使用MiroModes框架请先阅读http://blogs.telerik.com/blogs/posts/10-01-20/micromodels_for_silverlight.aspx 1. ...

  3. MySQL5.7以上Zip版官方安装文档(选译)

    前言 在windows上安装Zip版MySQL(选译) 学习mysql的朋友们会发现5.7+版本的mysql变得比以前难安装了许多(当然我们可以选择installer版本,但是这样总感觉对学习mysq ...

  4. 阻塞队列BlockingQueue

    BlockingQueue最终会有四种状况,抛出异常.返回特殊值.阻塞.超时,下表总结了这些方法: 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e, ...

  5. JavaScript--我发现,原来你是这样的JS(引用类型不简单,且听我娓娓道来)

    一.介绍 没错,这是第五篇,到了引用类型,这次要分成两次博文了,太多内容了,这是前篇,篇幅很长也很多代码,主要讲引用类型和常用的引用类型,代码试验过的,老铁没毛病. 坚持看坚持写,不容易不容易,希望大 ...

  6. java:凯撒密码及String的应用

    一,凯撒密码 古罗马皇帝凯撒在打仗时曾使用过以下方法加密军事情报 现在用java实现 程序设计思想: 1,字符串首先要转化为字符数组,才能依次加密 2,当原来的字符为X,Y,Z时,加密后要转化为A,B ...

  7. App 组件化/模块化之路——使用SDK的思路进行模块化设计接口

    在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...

  8. 二、Tomcat配置以及IDEA运行第一个Jsp项目——JavaWeb点滴

    一.Tomcat配置环境变量 tomcat从官网下载最新的即可,本人下载的是安装版本.在安装过程中需要设置用户名和密码以及选择相应的JDK的安装目录.这些都比较简单直接下一步即可,安装完成之后就是配置 ...

  9. 微信公众号开发(十二)OAuth2.0网页授权

    OAuth允许用户提供一个令牌,而不是用户名和密码来访问它们存放在特定服务器上的数据,每一个令牌授权一个特定的网站在特定时段内访问特定的资源. 授权过程如下: 1.引导用户进入授权页面同意授权,获取c ...

  10. Ubuntu下OpenGL开发环境的搭建

    由于上了计算机图形学的课,老师叫我们安装OpenGL开发环境,晚上安装了一两个小时,终于搞定了. 1.      建立基本编译环境 sudo apt-get install build-essenti ...