初始架构

 
策略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. python 的日志logging模块学习

    1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info messa ...

  2. Rx 入门指引 (一)

    自学 Rx 快有一个周了, 它非常适合处理复杂的异步场景.结合自己所学,决定写系列教程. 我认为, Rx 中强大的地方在于两处 管道思想,通过管道,我们订阅了数据的来源,并在数据源更新时响应 . 强大 ...

  3. IDL 字符串

    1.创建字符串 字符串和字符串数组通过赋值或函数方式来创建.在IDL字符串用" "或' '括起来表示. IDL> s1="abcdef" IDL> ...

  4. DevOps之服务手册

    唠叨话 关于德语噢屁事的知识点,仅提供精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <DevOps服务手册(Manual)> <IT资源目标化>1.设施和设备(I ...

  5. java连接sqlserver2008r2 心得

    现在是该轻松一笑的时候了,困扰已久的问题有了解释了. 之前的各种连不上,说到底还是权限问题,sqlserver2008r2的权限分得太细了. 两个实例间数据库互相都看不到,更不用谈访问了. 端口号也是 ...

  6. win8.1 安装

    下载了Windows8.1企业版的iso文件,文件名称:cn_windows_8_1_enterprise_x86_dvd_2791409.iso 下载地址: http://msdn.itellyou ...

  7. 最美时光第三方UWP源码公开

    自己大概写了一个星期的成果.. 使用了官方最美时光app的UI和图片资源,并没有调用官方接口 https://files.cnblogs.com/files/loyieking/NiceCountDo ...

  8. ThreadPoolExecutor系列<二、ThreadPoolExecutor 代码流程图>

    本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7681648.html 1.ThreadPoolExecutor代码 ...

  9. 【转】NOR Flash擦写和原理分析

    1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存 ...

  10. Arch Linux之pacman调用axel多线程加速下载

    转载自 奶牛博客 本来感觉Arch Linux用个国内的源就很给力了,可是到了学校移动的cmcc-edu超级不稳定,而且单线程速度就二三十k,无奈,开多线程下载.在Ubuntu下面可以用apt-fas ...