7、如何设计分布式缓存?
答:
在写入数据时,对Key值进行散列处理(利用求余算法),在查询数据时,采用同样的算法查询数据。但它不稳定,当增加一个节点时,整个数据就要重新分布;重新分布数据会导致分布式缓存的不可用;这时一种新的算法“一致性Hash算法”被推出以解决这个问题;但是一致性Hash算法在减少节点时,就会将失效的那个节点的数据全部都压到另一个节点上,导致那个节点也失效,进而造成节点一个个失效的“雪崩现象”。
书中讲(目前最有效的解决方案不再是一致性Hash算法,而是求余算法,有节点失效时不改变算法。譬如,原来是4个节点,就是除以4求余。当某一个节点失效以后,还是除以4求余。这时,虽然有一部分数据无法在缓存中查询,增大了部分数据库压力,但至少缓存服务器是稳定的。通过对每一个节点进行主从同步,将某个节点失效时快速切换到从节点上,就可以实现高可用设计了);但是这是针对节点消除的方案,未针对节点增加进行讲解;感觉应该是在一致性Hash算法的基础上增加主从设计,这样即解决了节点消除的问题, 也解决了节点增加的问题。