举个例子
现在你写好了一个牛逼的cache服务,但是这个是单机版本。给你十台机器,让你做均衡。
你可能会想到 hash(request)%N来决定分到哪个机器。
理论知识
一致性:我又把它叫做可加性,就是你的哈希算法得能允许这样的情况。为了扩容我加了一个cache机器进来,你得让原来哈希到老机器上的流量能够分流到新机器上来
平衡性:算法得让流量尽可能的分到各个cache上
为了解决什么问题
在“举个例子”中,那么搞法的话,会出现什么问题。下周流量涨了,下游顶不住了,得加cache机器。或者老大说机器不够了,要回收cache机器。
%N的N要变,那么意味着基本上所有的cahe都失效,瞬间下游流量爆炸了,在这个瞬间,对后台系统是灾难。
如果你的%N的N不变,那么减机器的情况,你可能勉强忍过去,顶多就一小部分cache失效。但是加机器肯定搞不定。显然,这个策略走到了瓶颈。
什么是一致性hash
怎么搞定一致性问题
环形哈希空间:我们把hash key的集合理解为一个环形的空间,比如int的话,0- 232-1
cache映射到hash空间
key映射到hash空间
把key映射到cache,key沿着hash空间的顺时针出发,找到第一个cache就是他的归宿
好了,到此,一致性问题解决了。
怎么搞定平衡性问题
虚拟节点,实际的cache节点赋值出n份替身分散到hash空间即可解决。
时间: 2024-10-07 06:09:41