有关使用memcache做分布式缓存的方案,简单写下来,仅供参考。
memcache是优异的缓存解决方案,很多项目都有使用。
memcache服务本身并不具备分布式缓存的能力,它提供的就是对{key, value}对的访问能力,分布式的能力则完全来自于客户端。
基于consistent hashing算法的分布式缓存
现在有不少memcache的客户端lib采用consistent hashing作为分布式算法,采用consistent hashing的优点就是:当有节点失效或新节点加入时,可以维持大部分数据的hash规则的不变性,从而使迁移的数据最小化;
但是迁移是必不可少的,否则会带来一致性问题。
双节点策略
有些分布式系统曾采用双节点策略来解决节点失效带来的问题,每一个存储节点都有主/备两个节点,可以把这个策略引入到分布式缓存中来,可以认为两个 节点同时失效是一个小概率事件;其缺点就是硬件成本提高了,但是节点失效时,不需要迁移数据了啊(如果主节点还没有down机,主备节点之间还可以快速复 制缓存),这个简化了很多设计。缓存数据不允许失效,但是no-hit是完全可以接受的,对于缓存而言这确实是个不错的方案。
N+x备份策略
这个是由双节点策略改进而来的,与其让每个节点都有一个备份节点,不如让N个缓存服务器共用x个备份节点,比如我们取x=3,这样就大大降低了硬件成本。除非同时出现4台服务器down机的情况,才会造成缓存节点不足;这个是个极小概率事件了。
在吸取了双节点策略的同时,也避免了其缺点。
不管是N+x备份还是双节点策略,和consistent hashing是不冲突的,完全可以使用consistent hashing算法来分配{key, value}到不同的缓存服务器上。
服务器动态扩充
不管是N+x备份还是双节点策略,当服务器动态扩充时,缓存数据的迁移也是不可避免的。但是需要缓存的数据,都是热点数据,普通数据何苦缓存呢,数据量也不会太大,需要的缓存服务器不会多,完全可以预估一下极限,在开始就将N定下来。这样就完全不必烦恼数据迁移问题了。