Consistent Hashing

场景描述
假设有n个cache server,为了方便每个用户访问,要将用户的缓存数据存放在某一台cache server上面,同时也可以减少cache数据的冗余,如何设计?

基本hash算法
给n个cache server编号1 2 ... n。对用户访问ip做hash并对n求余:hash(ip)/n得到1...n范围的值,根据这个值将用户请求分配到固定server上。
问题
如果某台cache server挂掉(e.g. 编号为n的server挂掉了),那么hash(ip)/n得到n的用户将无法被处理,此时只能修改求取范围的函数为hash(ip)/(n-1),但是这样会导致大部分的缓存失效。

分布式一致性hash算法
假设hash算法得到一个1~2^32范围的一个数。

  1. 首先通过hash(cacheIP)得到cache server的hash值,分部到一个1到2^32的环中。
  2. 对用户ip做哈希hash(ip)得到一个值,向下游走直到找到第一个cache server,将该用户请求发往该server。
  3. 如果某台cache server挂掉了,影响的只是存在该server上面的cache。
  4. 可以存一个cache server和hash值范围的散列表,这样可以不用游走直接找到hash(ip)对应的cache server。


    remove.JPG

Cassandra的分布式cluster架构实现就是类似的环结构。

Reference

https://blog.csdn.net/v_july_v/article/details/6879101

你可能感兴趣的:(Consistent Hashing)