如果10台缓存,挂了几台,如何让key始终缓存到新的服务器,即使挂的那台恢复了

AkataMoKa 发布于 2016/05/16 22:42
阅读 555
收藏 1
面试的时候,被问到: 有10台缓存机器,假设一个key原本缓存到第3台机器,后来第3台机器挂了。 现在需要一个算法将这个key缓存在另外一个机器上,即使当第3台恢复了以后,这个key还是保存在后来的新机器上 这个不能借助第三方监控等 大家有什么好的想法吗?
加载中
2
eechen
eechen
转:一致性哈希就是,假设后端5台设备,突然down了1台,只有以前hash到这台down的设备上的请求,才会被重新hash计算到其他设备上,剩下的4台的原来hash不会变. 这样可以最大限度的保证后端设备的命中率.如果哪天这台设备好了,同样以前摊给其他4台的请求,会重新打回这台设备,最后所有的hash跟服务没down前的hash一模一样. 所以一致性哈希(consistent hash)功能对集群缓存很重要.
0
赵开元
赵开元

引用来自“eechen”的评论

一致性哈希就是,假设后端5台设备,突然down了1台,只有以前hash到这台down的设备上的请求,才会被重新hash计算到其他设备上,剩下的4台的原来hash不会变. 这样可以最大限度的保证后端设备的命中率.如果哪天这台设备好了,同样以前摊给其他4台的请求,会重新打回这台设备,最后所有的hash跟服务没down前的hash一模一样. 所以一致性哈希(consistent hash)功能对集群缓存很重要.
怎么保证  在第三台down的时候保存到新机器上的数据  在第三台机器重启后 一直留在新机器上呢? 
0
tinshen
tinshen

现在的缓存不都是自动跳的么...

为什么还要重复造轮子.

0
T
TimWong

这问题不严谨或者说需求不合理:

恢复后,仅仅是已放到其它机器的不搬回来?新的数据还是放回到该机器?

举例:使用简单的求模hash,假设c,g两条数据应该hash到第3台机,在已缓存c到机器3后,3挂了,那算法自动将c定向到机器4,而机器3恢复后,g需要缓存到3? 

如果是上面的例子,需求是不合理的。因为c,g是同一个算法得出的目标机器,所以理论上应该放一起(即就算3恢复了,这个时候要保存g也应该保存到c所在的机器4)

这样就好理解了,即机器3重启后,再不是机器3了,而是新加入的一台机器,它会保存另外一批数据(跟原来3要保存的不一样)

这个就用一致性hash可以解决,但实际需求又不对,因为新的3加进去后,必然要分担一些数据(这些数据从何而来?就是之前应该在3的那部分,或者说肯定要从其它机器上分一些回来)

抛开需求合理性,真正要做到这样,只能是在前面加路由表,记住每个key所在的目标服务,这当然很扯。

AkataMoKa
AkataMoKa
是的,不过面试官说的不是实际应用,而是看看算法的考虑
0
首席打酱油
首席打酱油

想提高缓存集群的可靠性,一种方法是使用缓存工具本事的机制,如redis的主从  二是尽量减少缓存实例上下线造成的缓存数据丢失,参考memcached的hash环实现。

不知道这位面试官是怎么想出来问这么怪异的问题,本来应该简单透明的问题,要搞那么复杂?

0
大王来巡山
大王来巡山

简单来说算法是一致性hash

但是要结合自己的业务