Magent介绍

Magent介绍



Magent是一款开源的Memcached代理服务器软件。

 

项目地址:http://code.google.com/p/memagent


功能列表:


  • 和每个memcache server保持多个长连接,效果是减少memcache server保持的连接数量及创建销毁连的开销。不过,memcache本身就支持大并发连接,这个功能也就没什么特别的说道。


  • 支持memcache的binary协议命令,实现请求的转发。支持下面的memcached命令:      


    1. get gets          
    2. delete          
    3. incr decr          
    4. add set replace prepend append          
    5. cas


  • 和memcache一样,基于libevent的事件驱动来处理IO。


  • 支持ketama的一致性哈希算法。支持memcache backup集群,当memcache集群有机器挂了,memagent会将get请求转向memcache backup集群。这个功能对于cache的稳定性要求高的场景下会有用武之地。


  • 支持unix domain socket,是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC),它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。


问题描述:


Memcached其中一个节点失效以后,memcached本身是没有任何策略维持失效转发的,这对于大型系统是一个无法接受的事实。


架构方案:


采用 Magent 缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存服务器,缓存代理服务器可以连接多台Memcached机器。常用架构如下:

wKioL1ZSjffAl4J9AACFKIY5SQI099.jpg


magent与memcached 是可以混搭的,如下图(2):



wKioL1ZSjinB9BgZAACIeHMfd3Q732.jpg


上图此模型已经能够很好的解决一个节点,一组服务器的缓存数据服务,但是如果在北方网通架设了一组服务器,同时在南方电信又架设了另外一组服务器,那么这两组相对独立的节点之间如何做到数据的同步与共享,基于magent与memcached的解决方案如下:

wKiom1ZSjizwBqIaAACVfP8MkIw682.jpg


需要注意的是,两组magent的配置最好完全一致,比如:


北方的magent配置为:magent -s memcached1 -s memcached2 -b memcached3

那么南方的magent配置也为:magent -s memcached1 -s memcached2 -b memcached3


其顺序都是一致的,因为magent在分配key到memcached上时只是简单的使用散列余数算法。


当然如果你够懒,那么你可以直接连接备份magent,因为所有的数据上面都有。


有个特别要注意的地方是:

1. 其中一台Memcached死掉,从magent取数据,数据会从备份的Memcached取出,保证用户不受影响。


2. Memcached重启复活,由于这两台Memcached重启后无数据,因此magent取得的将是空值,尽管备份Memcached还有数据。可采用定时维护服务器,恢复memcached。


3. 如果Memcached死掉,备份机同时死掉,那么就没有办法,所以要设计健壮的架构。

工作原理:


我们以图(1)为示例架构来分析下magent的原理:


1. 应用程序连接magent,把缓存key1交给magent,magent根据自身的配置参数,再加ketama一致性哈希算法,会计算出key1存在3 台主Memcached服务器的某一台上,然后以同样的算法,将key1也在2台备用的Memcached服务器中的某一台上,再存一份数据。即,主服务 器是分布式存储的,同时,从服务器也是分布式存储的。


2. 在应用程序获取缓存数据key1时,magent一旦得知数据所存的那台主Memcached服务器挂掉了,它就会转向从备用的Memcached服务器中获取数据。注意:服务器的定位选择算法跟存的时候是一样的。


3. 有个缺陷,当 down 掉的那台主Memcached服务器重新恢复正常后,Memcahed里是没有数据的,即数据全部丢失,但此时备用的Memcached服务器又不会将数据同步到主服务器。


4. 应用程序连接代理的时候,最好每次随机性只连一台,这样,一旦某台代理挂了(即连不上),可切换连另外一台代理服务器。而随机性地去连,又保证了一定的负载均衡。

遇到的问题:


如 果memcached修复重启后通过magent代理方式取到的值就会为Null,这是由于memcache重启后里边的值随着memcache服务的停 止就消失了(因为在内存中),但是magent是通过key进行哈希计算分配到某台机器上的,memcache重启后会还从这台机器上取值,所有取到的值 就为空。

 

解决办法:


1. 在每次memcache宕机修复后可以写一个程序把集群中的其他memcache的所有信息全给拷贝到当前宕机修复后的memcache中。

2. 自己写代理,当从一个memcached服务上取到的值为null时再去其他memcached上取值。

 

注意事项:


magent的调用方式同memcached一样,客户端可以不用改代码即可实现切换到magent模式下。

参考:http://www.cnblogs.com/happyday56/p/3461113.html

本文转自:http://ultrasql.blog.51cto.com/9591438/1633897

你可能感兴趣的:(magent)