初始架构

 
策略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 使用Ajax获取后台返回的Json数据后,页面处理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. CodeSmith(C#)简单示例及相关小知识

    // 本文将介绍CodeSmith与数据库进行交互生成相应的存储过程,本例使用的数据库为SQL Server 2000. // 在与数据库进行交互时,我们使用到了一个CodeSmith自带的组件Sch ...

  3. 使用HDFS客户端java api读取hadoop集群上的信息

    本文介绍使用hdfs java api的配置方法. 1.先解决依赖,pom <dependency> <groupId>org.apache.hadoop</groupI ...

  4. vDSP加速的应用

    vDSP 是IOS提供一系列加速处理算法..在优化时可以考虑应用一二... 1.在项目中加入Accelerate.framework库 点开项目属性->Build Phases->Link ...

  5. SQL server 数据库备份大

    首先简单的介绍一下Sql server 备份的类型有: 1:完整备份(所有的数据文件和部分的事务日志文件) 2:差异备份(最后一次完成备份后数据库改变的部分) 3:文件和文件组备份(对指定的文件和文件 ...

  6. 重学C语言---04字符串和格式化输入/输出

    1.程序示例 //talkback.c一个能为你提供一些信息的对话框 #include <stdio.h> #include <string.h> //提供strlen函数原型 ...

  7. 解决 Win10 UWP 无法使用 ss 连接

    一旦使用了 ss, 那么很多应用就无法连接网络. 本文提供一个方法可以简单使用ss提供的代理. 多谢 wtwsgs 提供方法:http://blog.csdn.net/wtwsgs/article/d ...

  8. junit搭配hamcrest使用

    开篇 - 快速进行软件编码,与功能测试应该是每个写代码的人,应该掌握的技能,如何进行优雅的写代码,把测试的时间压缩,腾出时间来休息.下面听我一一道来: 依赖:junit 4.4 hamcrest 1. ...

  9. samba服务:为在windows下操作linux的文件而生

    vi/vim编辑器好玩吗?虽有着层出不穷的语法糖但又如何与传统的sublime相媲美? 那么,来吧~ 动手跟我一起做个samba服务吧~   安装   yum -y install samba  配置 ...

  10. [js插件开发教程]实现一个比较完整的开源级选项卡插件

    在这篇文章中,我实现了一个基本的选项卡功能:请猛击后面的链接>>   [js插件开发教程]原生js仿jquery架构扩展开发选项卡插件. 还缺少两个常用的切换(自动切换与透明度渐变),当然 ...