对于分布式一致性哈希的思考

看了几个相关的文章.对4个特性也有了一定的理解。不过还是有些疑问,如果有知情人士能跟我讨论,我会很感激的!!!

  • 平衡性(Balance)

    尽量将数据平衡的分布到每一个节点上去。

  • 单调性(Monotonicity)

    简单讲就是hash结果不能被其他因素干扰导致错误的情况(例如节点宕机)。

  • 分散性(Spread)

    主要是针对同样的数据被分散到不同的节点上,导致数据不一致的情况。只要保证同样的数据产生的哈希一定是一致的,那么就可以避免这类问题。

  • 负载(Load)

    原意:

负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

我原以为是跟平衡性相关的节点负载问题。其实只要解决分散性的问题,这个问题自然就没有了。

翻不了墙,只能baidu。翻了20来页,说的都是差不多的内容:

用虚拟节点(N)来保证数据的的平衡性&单调性。采取类似 hash(data)%N 的方式让数据平均分布。

在起始时就规定好大小(学术上写的是2^32次方,其实就是一个比较大的值。让你的节点平均分布到这个值上并形成一个环)。

假设约定的虚拟节点数是7。现阶段有3个节点(A,B,C)。

那么按[平均分配、末尾负载]原则,得到的映射关系如下:

[A,A,B,B,C,C,C]

理想情况应该是每个节点负载的范围应该是相同的。所以对于虚拟节点数的设定最好是稳定节点的倍数。

在这个例子中可以设定9,那么得到的映射关系就会是:

[A,A,A,B,B,B,C,C,C]

现在假设其中B结点宕机了,按照下一个节点备份上一个节点的数据的逻辑。那么为了服务可用,B节点部分就会让C节点去替换:

[A,A,A,C,C,C,C,C,C]

这样就保证了单调性、分散性以及负载的问题。

其实仔细想像,由于数据本身的随即性很大,那么怎么才能得到平衡呢?hash本身是保证不了平衡性的。

一旦出现宕机,不平衡的的情况就越发严重。

这其实就是一个hashMap的实现罢了。

(以上引用部分是自己手打的,引用只是为了看起来好看 ~)

相关信息:

http://blog.jobbole.com/80334/

http://my.huhoo.net/archives/2010/06/post_55.html

http://my.oschina.net/chape/blog/132533

http://blog.huanghao.me/?p=14

关于hash算法的一些资料:

http://en.wikipedia.org/wiki/Chord_(peer-to-peer)

http://wenku.baidu.com/view/ee91580216fc700abb68fcae.html

想到另一个比这个好的形式,如果有通道中人,欢迎在评论中头脑风暴!

先就这样。

时间: 2024-10-03 14:16:52

对于分布式一致性哈希的思考的相关文章

分布式一致性哈希算法

一致性哈希算法是一种分布式哈希算法,主要是为了解决互联网中的热点(Hot spot)问题 计算公式 hash(服务器IP地址) % 2^32 hash(对象) % 2^32 将对象Hash后的值映射到顺时针最近的一台服务器上 Java实现 package com.bounter.mybatis.util; import java.util.LinkedList; import java.util.List; import java.util.SortedMap; import java.util

转: 一致性哈希算法及其在分布式系统中的应用

转自: http://blog.codinglabs.org/articles/consistent-hashing.html 一致性哈希算法及其在分布式系统中的应用 作者 张洋 | 发布于 2011-10-18 分布式 一致性哈希 摘要 本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题:接下来会对这个算法进行相对详细的描述,并讨论一

使用虚拟节点改进的一致性哈希算法

分布式存储中的应用 在分布式存储系统中,将数据分布至多个节点的方式之一是使用哈希算法.假设初始节点数为 N,则传统的对 N 取模的映射方式存在一个问题在于:当节点增删,即 N 值变化时,整个哈希表(Hash Table)需要重新映射,这便意味着大部分数据需要在节点之间移动. 因此现在普遍使用的是被称为一致性哈希(Consistent Hashing)的一类算法."一致性" 这个定语的意义在于:当增删节点时,只影响到与变动节点相邻的一个或两个节点,散列表的其他部分与原来保持一致.某种程度

一致性哈希算法运用到分布式

我知道一致性哈希算法.但是,在没遇到你的时候,我还不知道怎么写.因为我肯本还没来的思考.但是,现在我知道了~~嘿嘿.   这里主要讲的是memcached(以下简称mem)集群,遇到集群中某台服务器down(M服务器)后,无法get到mem的值,这就给程序带来了风险,我们需要将风险用算法分摊出去,并将M的mem分布到正常的服务器上(N是正常运转的服务器).先讨论风险分摊的理论算法思路(因为同步mem是另外一篇,有时间再聊聊): 其实,主要思路很简单.通俗点儿来讲,就是理解将一个点分散为多个点分散

7月目标 socket , 一致性哈希算法 ; mongodb分片; 分布式消息队列; 中间件的使用场景

  分布式的基础:一致性哈希  路由算法的一致性hash http://www.jiacheo.org/blog/174 http://www.tuicool.com/articles/vQVbmai http://www.cnblogs.com/huangxincheng/p/3708316.html   redis 和 mongodb的使用,要能自己写 helper帮助类,和多台机器上的使用   socket http://www.cnblogs.com/JimmyZhang/archive

分布式_理论_08_Consistent Hash(一致性哈希算法)

一.前言 五.参考资料 1.分布式理论(八)—— Consistent Hash(一致性哈希算法) 原文地址:https://www.cnblogs.com/shirui/p/9660846.html

一致性哈希(Consistent Hashing)

一:HashMap 谈论Consistent Hashing前,先回顾一下HashMap. 当使用HashMap时,key会被均匀的映射到hashMap内部数组中(Entry[]),映射方法利用key的hash值做移位运算,和entry数组的长度(Length-1)做与运算(和hashtable不同,(key.hashcode() & 0x7FFFFFFF) % table.length,使数据分散均匀分布). put操作时,当底层数组数据量超过LoadFactor(默认0.75)* len时,

转(一致性哈希算法(consistent hashing))

转自:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance)

Memecached缓存原理及基本操作、分布式(一致性hash)

原文地址:http://lixiangfeng.com/blog/article/content/7869717 转载请标明此处,谢谢! 缓存是什么?为什么要使用缓存? 缓存,通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度. 缓存工具有哪些?区别在哪里? 缓存工具:Memecached.redis.MongoDB 区别: 性能都比较高:总体来讲,TPS(每秒总事务量)方面redis和memcache差不多,要大于 mongodb: 操作的便利性: a)