1, 随机选择
2. Hash选择
在分布式缓存设计中,多台server形成分布式缓存,如果每次请求都从若干台server中寻找,在时间上和空间上都不科学,所以利用一致性hash保证相同的keyi每次访问都被发送到同一台server,提高缓存命中率。
一致性hash解决增加删除节点减少对数据的震荡
参考此文:
每个数据通过一致性hash分布到cache上,如果解决单点故障问题?每个cache的数据都不同,出现单点故障如何恢复数据?分布式节点间不进行通信吗?
一致性hash解决随机选择server产生的如下两个问题
一是同一份数据 可能被存在不同的机器上而造成数据冗余,
二是有可能某数据已经被缓存但是访问却没有命中,因为无法保证对相同key的所有访问
memcache服务本身并不具备分布式缓存的能力,它提供的就是对{key, value}对的访问能力,分布式的能力则完全来自于客户端。
双节点策略
有些分布式系统曾采用双节点策略来解决节点失效带来的问题,每一个存储节点都有主/备两个节点,可以把这个策略引入到分布式缓存中来,可以认为两个节点同时失效是一个小概率事件;其缺点就是硬件成本提高了,但是节点失效时,不需要迁移数据了啊(如果主节点还没有down机,主备节点之间还可以快速复制缓存),这个简化了很多设计。缓存数据不允许失效,但是no-hit是完全可以接受的,对于缓存而言这确实是个不错的方案。
N+x备份策略
这个是由双节点策略改进而来的,与其让每个节点都有一个备份节点,不如让N个缓存服务器共用x个备份节点,比如我们取x=3,这样就大大降低了硬件成本。除非同时出现4台服务器down机的情况,才会造成缓存节点不足;这个是个极小概率事件了。
在吸取了双节点策略的同时,也避免了其缺点。不管是N+x备份还是双节点策略,和consistent hashing是不冲突的,完全可以使用consistent hashing算法来分配{key, value}到不同的缓存服务器上参考文档
http://segmentfault.com/q/1010000000315713。
3. Round-robin
更适用于请求消耗资源差别不大的情况
4. 按权重分配
5 按负载选择
6 按连接选择
实际中会考虑心跳检测,排除有问题的机器。