Consistent Hashing 一致性hash

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


其核心是取代传统取模求余的常规算法,改为大数域内的Hash,以及线形冲突的Hash处理 (为什么是2的32次方,这个问题我还没弄清楚。mark)。    一致性hash的概念讲的很多了,公司最近的Memcached改造正在引入这个东西,来提高分布式cache的容灾能力及移除传统分布式cache的瓶颈。

 

 

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

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

 

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

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

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

 

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



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


 

你可能感兴趣的:(数据结构,算法,应用服务器,cache,memcached)