Memcache本身并不实现集群功能。假设你想使用Memcahce集群需要使用第三方软件或编程来实现自己的设计,这里将被用来memagent实现代理,memagent也被称为magent。我们注意到,,这二者当成两种工具。至于memcache、magent的安装请參考文章  在Linux上安装Memcached服务和 magent编译安装及常见错误

总体架构

直接上图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1MjUxODkwMzQ3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

从图中能够看到有两个magent节点,两个memcached节点,每一个magent节点又分别代理两个memcached节点,应用系统端使用magent pool来调用memcache进行存储。

硬件结构为两台linuxserver。每台server上分别安装magent和memcached服务,并设为开机启动。

这样做的优点是不论什么一台server宕机后都不影响magent pool获取memcache信息,即实现了memcached的高可用(HA),假设两台机器都宕机了。仅仅能说明你RP太差了。

当然。也能够用三台、四台或者很多其它server来提高HA。

測试HA

測试背景,本地局域网内两台server172.18.117.71(memcacheport11211,magentport11210),172.18.117.113(memcacheport11211,magentport11210),和两台server在同一局域网内的測试机器,下边是測试代码:

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool; public class MainTest { public static void 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; public class MainTest { public static void 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; public class MainTest { public static void 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; public class MainTest { public static void 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一样。client能够不用改代码就可以实现切换到magent模式下

版权全部分,转载请注明、资源。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Memcached 群集高可用性(HA)架构的更多相关文章

  1. Memcached HA架构探索

    https://code.google.com/p/memagent/ 标签:memcached magent 高可用 HA 架构原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...

  2. 集群(cluster)和高可用性(HA)的概念

    1.1 什么是集群 简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源.这些单个的计算机系统就是集群的节点(node).一个理想的集群是,用户从来不会意识到集群系统 ...

  3. Storm系统高可用性HA表现

    关于Storm的高可用,有以下几个方面: (1)数据利用阶段可以通过ACK机制保证数据被处理: (2)在进程级别,worker失效,supervisor会自动重启worker线程; (3)在组件级别, ...

  4. Citrix 服务器虚拟化之十 Xenserver高可用性HA

    Citrix 服务器虚拟化之十 Xenserver高可用性HA HA是一套全自动功能设计,规划.它可以安全地恢复出现问题的XenServe 主机.例如物理破坏网络或主机的硬件故障,HA可确保无需任何人 ...

  5. 使用QJM构建HDFS HA架构(2.2+)

    转载自:http://blog.csdn.net/a822631129/article/details/51313145 本文主要介绍HDFS HA特性,以及如何使用QJM(Quorum Journa ...

  6. Hadoop2.X HA架构与部署

    HDFS-HA原理及配置 1.HDFS-HA架构原理介绍 hadoop2.x之后,Clouera提出了QJM/Qurom Journal Manager,这是一个基于Paxos算法实现的HDFS HA ...

  7. HA架构

    HA架构是个什么东西? 阅读文章:浅谈web应用的负载均衡.集群.高可用(HA)解决方案

  8. HDFS HA架构以及源代码引导

    HA体系架构 相关知识介绍 HDFS master/slave架构,HDFS节点分为NameNode节点和DataNode节点. NameNode存有HDFS的元数据:主要由FSImage和EditL ...

  9. 新闻实时分析系统-Hadoop2.X HA架构与部署

    1.HDFS-HA架构原理介绍 hadoop2.x之后,Clouera提出了QJM/Qurom Journal Manager,这是一个基于Paxos算法实现的HDFS HA方案,它给出了一种较好的解 ...

随机推荐

  1. Android TextView(同时显示图片+文字)

    见上图:需要图片和文字 在一起 之前的做法是用两个控件组成 <LinearLayout> <ImageView /> <TextView /> </Linea ...

  2. Spring mvc之提交表单

    表单内容: <body> <form action="user/login"> <table> <tr> <td>用户名 ...

  3. 基于visual Studio2013解决C语言竞赛题之1044数组处理

       题目 解决代码及点评 /* 分别输入N和M个数到数组A和数组B中.把只在其中一个数组中出现的那些数送入到数组C中,并指出它们在A或B数组中的位置. */ #include <s ...

  4. 一个Sqrt谋杀触发功能

    我们平时常常会有一些数据运算的操作,须要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是怎样实现的?就拿最常常使用的sqrt函数来说吧.系统怎么来实现这个常常调用的函数呢? ...

  5. 【linux】内核源代码下载与阅读

      原创,转载时请注明,谢谢.邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://blog. ...

  6. Merkaartor,Marble,QGIS等等

    Merkaartor介绍 Merkaartor是Qt开发开源的OpenStreetMap(下简称osm)数据的编辑器,这里简单列出相关资源.方面基于osm数据的开发. Merkaartor支持osm地 ...

  7. ASM - 条件判断

    技术交流,DH讲解. 正式之前,我们看看寄存器和CPU的标志位: OD中的截图,下方的CPAZSTDO就是标志位. Delphi的FPU窗口,右边一列就是标志位.为什么要给大家看标志位呢?因为ASM中 ...

  8. PHP学习之-1.7 注释

    注释 在PHP中也有注释语句:用双斜杠 "//" 来表示.其他语言中 HTML使用 "<!--  -->" ,CSS中使用 "/*     ...

  9. boost asio io_service学习笔记

    构造函数 构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp. Dispatch和post的区别 Post一定是PostQueuedCompletionSta ...

  10. C++学习之路—继承与派生(三):多重继承与虚基类

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...