标签:style blog http color 使用 数据
时间:2014.07.17
地点:基地二楼
----------------------------------------------------------------------------------------
看起来这样一个系统工作正常,但考虑周到会有如下几个问题:
问题1:有一天我们需要增加一台服务器,这时我们需要改变哈希映射关系为:
hash(object) mod (n+1)
问题2:有一天我们需要删除一台服务器,这时我们需要改变哈希映射关系为:
hash(object) mod (n-1)
问题3:怎么样使得服务器负载分配均匀
现在我们看到麻烦来了,由于hash关系的变化,几乎所有的object将会被hash到新的位置,即映射到新的服务器,这是一种灾难,于是我们就需要一致性哈希来改善这种情况了。
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
哈希空间
----------------------------------------------------------------------------------------
将object映射到哈希空间
----------------------------------------------------------------------------------------
将cache以同样的方式也映射到哈希空间
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
cacheB崩溃
当将cacheD加入在object2和object3之间时,B和D之间的object也需重新映射,在这里object2将绑定到新加入的cacheD上。如下图:
增加cacheD
----------------------------------------------------------------------------------------
问题描述: 例如手机朋友网有n个服务器,为了方便用户的访问会在服务器上缓存数据,因此用户每次访问的时候最好能保持同一台服务器。
已有的做法是根据ServerIPIndex[QQNUM%n]得到请求的服务器,这种方法很方便将用户分到不同的服务器上去。但是如果一台服务器死掉了,那么n就变为了n-1,那么ServerIPIndex[QQNUM%n]与ServerIPIndex[QQNUM%(n-1)]基本上都不一样了,所以大多数用户的请求都会转到其他服务器,这样会发生大量访问错误。
问: 如何改进或者换一种方法,使得:
(1)一台服务器死掉后,不会造成大面积的访问错误,
(2)原有的访问基本还是停留在同一台服务器上;
(3)尽量考虑负载均衡。
显然,传统的办法题目已经给出,即用模余方法:做法很简单,但存在很多问题不满足需求。于是我们考虑一致性哈希算法。正如前面所述。
其它应用场景:
在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Least Connection)、响应速度算法(Response Time)、加权法(Weighted )等。其中哈希算法是最为常用的算法.
最典型的应用场景就是: 有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务器上,每台机器负责1/N的服务。
常用的算法是对hash结果取余数 (hash() mod N):对机器编号从0到N-1,按照自定义的hash()算法,对每个请求的hash()值按N取模,得到余数i,然后将请求分发到编号为i的机器。但这样的算法方法存在致命问题,如果某一台机器宕机,那么应该落在该机器的请求就无法得到正确的处理,这时需要将当掉的服务器从算法从去除,此时候会有(N-1)/N的服务器的缓存数据需要重新进行计算;如果新增一台机器,会有N /(N+1)的服务器的缓存数据需要进行重新计算。对于系统而言,这通常是不可接受的颠簸(因为这意味着大量缓存的失效或者数据需要转移)。那么,如何设计一个负载均衡策略,使得受到影响的请求尽可能的少呢?
在Memcached、Key-Value Store、Bittorrent DHT、LVS中都采用了Consistent Hashing算法,可以说Consistent Hashing 是分布式系统负载均衡的首选算法。
标签:style blog http color 使用 数据
原文地址:http://blog.csdn.net/u012333003/article/details/37904479