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机器。常用架构如下:
图(1)
magent与memcached 是可以混搭的,如下图(2):
图(2)
上图此模型已经能够很好的解决一个节点,一组服务器的缓存数据服务,但是如果在北方网通架设了一组服务器,同时在南方电信又架设了另外一组服务器,那么这两组相对独立的节点之间如何做到数据的同步与共享,基于magent与memcached的解决方案如下:
图(3)
需要注意的是,两组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
本文出自 “SQL Server Deep Dives” 博客,请务必保留此出处http://ultrasql.blog.51cto.com/9591438/1633897
原文地址:http://ultrasql.blog.51cto.com/9591438/1633897