Memcached 集群的高可用(HA)架构
来源:互联网 发布:入门单反推荐2017知乎 编辑:程序博客网 时间:2024/04/27 17:31
Memcache自身并没有实现集群功能,如果想用Memcahce实现集群需要借助第三方软件或者自己设计编程实现,这里将采用memagent代理实现,memagent又名magent,大家注意下,不要将这二者当成两种工具。至于memcache、magent的安装请参考文章 在Linux上安装Memcached服务 和 magent编译安装及常见错误
Memcache自身并没有实现集群功能,如果想用Memcahce实现集群需要借助第三方软件或者自己设计编程实现,这里将采用memagent代理实现,memagent又名magent,大家注意下,不要将这二者当成两种工具。至于memcache、magent的安装请参考文章 在Linux上安装Memcached服务 和 magent编译安装及常见错误
整体架构
直接上图:
从图中可以看到有两个magent节点,两个memcached节点,每个magent节点又分别代理两个memcached节点,应用系统端使用magent pool来调用memcache进行存储。硬件结构为两台linux服务器,每台服务器上分别安装magent和memcached服务,并设为开机启动。这样做的好处是任何一台服务器宕机后都不影响magent pool获取memcache信息,即实现了memcached的高可用(HA),如果两台机器都宕机了,只能说明你RP太差了。当然,也可以用三台、四台或者更多服务器来提高HA。
测试HA
测试背景,本地局域网内两台服务器172.18.117.71(memcache端口11211,magent端口11210),172.18.117.113(memcache端口11211,magent端口11210),和两台服务器在同一局域网内的测试机器,下边是测试代码:
import com.danga.MemCached.MemCachedClient;import com.danga.MemCached.SockIOPool;publicclassMainTest {publicstaticvoid main(String[] arg){SockIOPool pool = SockIOPool.getInstance();//magent连接池pool.setServers(new String[] { "172.18.117.71:11210","172.18.117.113:11210" });pool.setSocketTO(3000);pool.setNagle(false);pool.setSocketConnectTO(0);pool.initialize();MemCachedClient memCachedClient = new MemCachedClient();memCachedClient.set("becd0000", "测试例子");//System.out.println(memCachedClient.get("becd0000"));//System.out.println(memCachedClient.flushAll());}}
步骤1:将key为“becd0000”,value为“测试例子”通过magent的pool放到memcache中
步骤2:修改magent连接池为单个memcache连接,代码如下
import com.danga.MemCached.MemCachedClient;import com.danga.MemCached.SockIOPool;publicclassMainTest {publicstaticvoid main(String[] arg){SockIOPool pool = SockIOPool.getInstance();//magent连接池pool.setServers(new String[] { "172.18.117.71:11211"});pool.setSocketTO(3000);pool.setNagle(false);pool.setSocketConnectTO(0);pool.initialize();MemCachedClient memCachedClient = new MemCachedClient();//memCachedClient.set("becd0000", "测试例子");System.out.println(memCachedClient.get("becd0000"));//System.out.println(memCachedClient.flushAll());}}
可以看到单独访问memcache是可以取到刚才所存储的值的。
步骤3:修改
pool.setServers(new String[] { "172.18.117.71:11211"});
为
pool.setServers(new String[] { "172.18.117.113:11211"});
再次执行可以看到和步骤2一样的结果,都可以取到值,说明通过magent代理存的值会分别放到两个memcache中
步骤4:停止172.18.117.113上的memcached服务
停止memcached服务命令:kill "cat /tmp/memcached.pid"
步骤5:再次通过magent代理取值,代码如下:
import com.danga.MemCached.MemCachedClient;import com.danga.MemCached.SockIOPool;publicclassMainTest {publicstaticvoid main(String[] arg){SockIOPool pool = SockIOPool.getInstance();//magent连接池pool.setServers(new String[] { "172.18.117.71:11210","172.18.117.113:11210" });pool.setSocketTO(3000);pool.setNagle(false);pool.setSocketConnectTO(0);pool.initialize();MemCachedClient memCachedClient = new MemCachedClient();//memCachedClient.set("becd0000", "测试例子");System.out.println(memCachedClient.get("becd0000"));//System.out.println(memCachedClient.flushAll());}}
可以看到依然能够取到值。
步骤6:启动刚才停掉的memcached服务,重启后memcache中所有信息将清空
步骤7:再次通过magent代理池去取key为“becd0000”的值,代码如下:
import com.danga.MemCached.MemCachedClient;import com.danga.MemCached.SockIOPool;publicclassMainTest {publicstaticvoid main(String[] arg){SockIOPool pool = SockIOPool.getInstance();//magent连接池pool.setServers(new String[] { "172.18.117.71:11210","172.18.117.113:11210" });pool.setSocketTO(3000);pool.setNagle(false);pool.setSocketConnectTO(0);pool.initialize();MemCachedClient memCachedClient = new MemCachedClient();//memCachedClient.set("becd0000", "测试例子");System.out.println(memCachedClient.get("becd0000"));//System.out.println(memCachedClient.flushAll());}}
可以看到这里取到的值为null。
结果分析
通过以上测试可以得出结论
1、通过magent的连接池放的值会分别存在magent代理的所有memcached上去
2、如果有一个memcached宕机通过magent代理方式还能取到值
3、如果memcached修复重启后通过magent代理方式取到的值就会为Null,这是由于memcache重启后里边的值随着memcache服务的停止就消失了(因为在内存中),但是magent是通过key进行哈希计算分配到某台机器上的,memcache重启后会还从这台机器上取值,所有取到的值就没空。
解决办法
1、在每次memcache宕机修复后可以写一个程序把集群中的其他memcache的所有信息全给拷贝到当前宕机修复后的memcache中。
2、自己写代理,当从一个memcached服务上取到的值为null时再去其他memcached上取值
注意事项
magent的调用方式同memcached一样,客户端可以不用改代码即可实现切换到magent模式下
版权所有,转载请注明作者、出处。
- Memcached 集群的高可用(HA)架构
- Memcached 集群的高可用(HA)架构
- Memcached 集群的高可用(HA)架构
- Memcached 集群的高可用(HA)架构
- Memcached 集群的高可用(HA)架构
- Memcache 高可用集群之memcached-ha
- 高可用集群 HA
- HA 高可用集群
- 高可用集群(HA)的搭建【翻译】
- HA高可用集群的搭建
- Hadoop高可用集群搭建(HA)
- saltstack的HA高可用架构方案
- memcached高可用工具memcached-ha
- memcached 高可用工具 memcached-ha
- Hadoop,HA高可用集群
- HA 高可用集群原理
- Hadoop2.5的HDFS集群HA搭建(高可用集群)
- postgres HA 高可用架构
- 目标跟踪 详细博文
- 框架的理解
- Android开发:集成dropbox网盘功能
- AJAX POST&跨域 解决方案 - CORS
- 图像处理 源代码
- Memcached 集群的高可用(HA)架构
- HashMap相关学习
- [转]iOS 30个动画详细解释
- 直接选择排序
- Oracle EBS 中背靠背订单B2B订单流程的系统操作记录
- iOS多线程小结
- 安装第三方模块
- Codeforces 582B Once Again... 【LIS变形】
- 第六届河南省程序设计大赛