您的位置:首页 > 数据库 > Memcache

解决Memcached单点故障

2016-02-25 10:52 369 查看
     Memcached、Redis目前是应用最为广泛的NoSQL,但是Memchached本身并没有内置分布式功能,也即无法使用多台Memcached服务器来缓存不同的数据,所以如果Memcached发生单节点失效,就会出现部分数据丢失的情况。如何应对?

      一般来讲,之所以要在生产环境大规模应用集群环境,无非是为了满足一下需求:

            1、负载均衡      2、失效转发(故障转移)

       但是目前的Memcached版本本身并没有为集群提供真正的高可用解决方案。理论上来讲,客户端连接多个memcached服务端的时候,默认的数据分布是这样的:



理论上的,%33+33%+34%=100%,看上去数据分布还还很均衡,读取的时候,分别访问从三台服务器内存,再组成完整的数据。这样的数据分发架构,倒真正做到了“负载均衡”。降低了三台服务器的内存使用率,让三台服务器同时为客户端提供服务,这难道不是完美的负载均衡吗?

        有的朋友想到了,如果这个时候Memcached集群发生了单点故障,比如其中一台Memcached服务器宕机了,就会有33%的数据会丢失。现在普遍的做法有如下两种:

1、本地备份缓存:

      笔者所在公司采用的就是这种方案。  在本地放一份缓存,同时也在分布式Memcached上放一份缓存,如果当其中一台节点当机了,客户端程序直接读取本地的缓存,本地客户端维护一个HashMap即可,这样的方案虽然很简陋,但是可以满足一部分场景的需要,当你很急需的时候可以作为临时方案暂时替代一下。

2、使用Magent缓存代理服务器:

    由于Memcached服务器与服务器之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器节点出现故障时,会出现单点故障,如果需要实现HA,则需要通过另外的方式来解决。通过Magent缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存连接服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。如果其中一台缓存服务器down机,系统依然可以继续工作,如果其中一台Memcached机器down掉,数据不会丢失并且可以保证数据的完整性。如下图:



       但对于Magent缓存代理有个问题,如果Magent挂了怎么办?

         
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: