copy一下一致性哈希的定义:首先求出memcached服务器(节点)的哈希值,并将其配置到0~232 的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232 仍然找不到服务器,就会保存到第一台memcached服务器上。


其核心是取代传统取模求余的常规算法,改为大数域内的Hash,以及线形冲突的Hash处理

 

 

首先分析传统按模划分的利弊端:

按模取余算法非常简单,效率很高。比如后台有3台cache机, 只需要将数据key模3,根据其余数就可以知道应该写入到哪台机器,而且也很容易得知数据分布在哪台具体机器上。

 

但是按模取余存在两个方面的弊端:

1.虽然是分布式cache,但是众多cache存储机器必须有一个集中的前台管理机器,来完成取模算法与写入控制。这里称为前端机头 。因此这台前端机头就会成为一个比较大的瓶颈(特别是在java上,Java内存消耗超过2g会出一些莫名的异常,并且内存回收效率会有问题)。
 2.由于只有一台前端机头,因此一旦crash将会使得后面所有cache机器失效。如此又必须热备前端机头。

3.后续增减cache机器,将会牵涉到大量数据的迁移过程。 由于模3和模4导致的数据迁移将会相当大。瞬间可能超过负荷。

 

于是就诞生了一致性hash的应用:


 回归到数据结构中最简单的线性表冲突处理来做真正的HASH。

 


  • Consistent Hashing 一致性hash_取模

  • 大小: 19.6 KB
  • Consistent Hashing 一致性hash_服务器_02

  • 大小: 40.2 KB
  • Consistent Hashing 一致性hash_服务器_03

  • 大小: 46.1 KB
  • 查看图片附件