大神的分享,我写下自己的一些理解
首先,思考一个问题:你有一个亿级访问量的网站,每天每小时每分钟有大量的数据在传输,存读数据库非常频繁,服务器的压力很大。然后我们的解决方案是什么:缓存,memcache,redis。那么,问题来了,你有10台缓存服务器,想象一下:一条数据来了要写,写到哪台服务器上去;一个请求来了,要取一条数据,从哪台服务器取?读、取数据如何合理的选择服务器?
常规的解决方案是:随机,随机选择服务器
但是会带来问题,(1)数据冗余,同一份数据可能冗余存在于多台服务器上(因为每次选择读/取的服务器是完全随机的)
(2)数据访问失败:数据存在与server1上,但是读取的时候随机到了server2上,所以就会读不到数据
这显然是一个很严重的问题
解决方案:
一致性哈希环---(当然这也是一种相对的解决方案,但是基本已经可以解决实际中的场景,算法的缺陷还可以通过实际场景中的做一些弥补)
一致性哈希环存在的问题:分配不均衡
解决方案:
虚拟节点(找下一个节点,为什么不用就近原则去找,因为就近的原则还是不能均衡的)
代码实现:
参考github:https://github.com/897798676/consistent-hash