一致性哈希算法----- 解决memecache 服务器扩容后数据丢失.docVIP

一致性哈希算法----- 解决memecache 服务器扩容后数据丢失.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一致性哈希算法----- 解决memecache 服务器扩容后数据丢失.doc

1?基本场景 比如你有?N?个?cache?服务器(后面简称?cache?),那么如何将一个对象?object?映射到?N?个?cache?上呢,你很可能会采用类似下面的通用方法计算?object?的?hash?值,然后均匀的映射到到?N?个?cache?; hash(object)%N 一切都运行正常,再考虑如下的两种情况; 1?一个?cache?服务器?m down?掉了(在实际应用中必须要考虑这种情况),这样所有映射到?cache m?的对象都会失效,怎么办,需要把?cache m?从?cache?中移除,这时候?cache?是?N-1?台,映射公式变成了?hash(object)%(N-1)?; 2?由于访问加重,需要添加?cache?,这时候?cache?是?N+1?台,映射公式变成了?hash(object)%(N+1)?; 1?和?2?意味着什么?这意味着突然之间几乎所有的?cache?都失效了。对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务器; 再来考虑第三个问题,由于硬件能力越来越强,你可能想让后面添加的节点多做点活,显然上面的?hash?算法也做不到。 ??有什么方法可以改变这个状况呢,这就是?consistent hashing... 2 hash?算法和单调性   ?Hash?算法的一个衡量指标是单调性(?Monotonicity?),定义如下:   单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。 容易看到,上面的简单?hash?算法?hash(object)%N?难以满足单调性要求。 3 consistent hashing?算法的原理 consistent hashing?是一种?hash?算法,简单的说,在移除?/?添加一个?cache?时,它能够尽可能小的改变已存在?key?映射关系,尽可能的满足单调性的要求。 下面就来按照?5?个步骤简单讲讲?consistent hashing?算法的基本原理。 3.1?环形hash?空间 考虑通常的?hash?算法都是将?value?映射到一个?32?为的?key?值,也即是?0~2^32-1?次方的数值空间;我们可以将这个空间想象成一个首(?0?)尾(?2^32-1?)相接的圆环,如下面图?1?所示的那样。 ?h 图?1?环形hash?空间 3.2?把对象映射到hash?空间 接下来考虑?4?个对象?object1~object4?,通过?hash?函数计算出的?hash?值?key?在环上的分布如图?2?所示。hash(object1) = key1; … … hash(object4) = key4; ? ? 图?2 4?个对象的?key?值分布 3.3?把cache?映射到hash?空间 Consistent hashing?的基本思想就是将对象和?cache?都映射到同一个?hash?数值空间中,并且使用相同的hash?算法。 假设当前有?A,B?和?C?共?3?台?cache?,那么其映射结果将如图?3?所示,他们在?hash?空间中,以对应的?hash值排列。 hash(cache A) = key A; … … hash(cache C) = key C; ? 图?3 cache?和对象的?key?值分布 ? 说到这里,顺便提一下?cache?的?hash?计算,一般的方法可以使用?cache?机器的?IP?地址或者机器名作为hash?输入。 3.4?把对象映射到cache 现在?cache?和对象都已经通过同一个?hash?算法映射到?hash?数值空间中了,接下来要考虑的就是如何将对象映射到?cache?上面了。 在这个环形空间中,如果沿着顺时针方向从对象的?key?值出发,直到遇见一个?cache?,那么就将该对象存储在这个?cache?上, 因为对象和?cache?的?hash?值是固定的,因此这个?cache?必然是唯一和确定的。这样不就找到了对象和?cache?的映射方法了吗?! 依然继续上面的例子(参见图?3?),那么根据上面的方法,对象?object1?将被存储到?cache A?上;?object2和?object3?对应到?cache C?;?object4?对应到?cache B?; 3.5?考察cache?的变动 前面讲过,通过?hash?然后求余的方法带来的最大问题就在于不能满足单调性,当?cache?有所变动时,cache?会失效,进而对后台服务器造成巨大的冲击,现在就来分析分析?consistent hashing?算法。 3.5.1?移除?cache 考

文档评论(0)

eorihgvj512 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档