分布式缓存服务器负载均衡问题
很久没有写博客了,发现自己总是办事总是虎头蛇尾,要改要改呀!言归正传,前几天听了下百度的公开讲座,讲座结束讨论的一个问题挺有意思,拿出来与大家共享。
问题:百度网站采用4台服务器来响应用户请求,假设每台服务器都带有缓存功能,怎么使用户请求均匀落在缓存这些缓存服务器上呢?
解决办法:为了使用户请求均匀分布在这四台服务器上,我们可以对用户的检索关键词分词后进行hash,然后对hash出的数对4取模,余数为1则分配到
服务器1上,为2分配到2上,依次类推。hash函数可以保证相同的关键词检索能被分配在同一台服务器上,而且hash出的数值相对均匀,可以在一定程度上保证负载均衡。
但是,如果一台服务器宕机怎么办,或者增加一台缓存服务器怎么办。还采用这种方法就会导致缓存服务器命中率瞬间下降。这时可以采用consistent hashing的思想。
Consistent Hashing如下所示:首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。
从上图的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。
因此,Consistent Hashing最大限度地抑制了键的重新分布。而且,有的Consistent Hashing的实现方法还采用了虚拟节点的思想。使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。因此,使用虚拟节点的思想,为每个物理节点(服务器)在continuum上分配100~200个点。这样
就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。
但是如果因为同时有很多用户百度“刘德华”作为关键词,经过hash后都分配到一台缓存服务器上,服务器抵抗不住压力挂掉。然后采用上面两种方法,这些请求还是会落在同一台服务器上,这种情况怎么去处理?