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; 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一样,客户端可以不用改代码即可实现切换到magent模式下

原文地址 : http://www.tuicool.com/articles/VJfEfyv

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

  1. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

    1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 ...

  2. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案

    http://aokunsang.iteye.com/blog/2053719   声明:以下仅为个人的一些总结和随写,如有不对之处,还请看到的网友指出,以免误导. (详细的配置方案请google,这 ...

  3. web应用的负载均衡、集群、高可用(HA)解决方案

    看看别人的文章: 1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代 ...

  4. Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解

    当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题. 有这么一段文字来描述“Memcached集群” Memcached如何处理容错的? 不处理!:) 在memc ...

  5. Windows & RabbitMQ:集群(clustering) & 高可用(HA)

    描述:我们需要配置三台服务器:ServerA, ServerB, ServerC 注意事项: 所有的服务器的Erlang版本,RabbitMQ版本必须一样 服务器名大小写敏感 Step 1:安装Rab ...

  6. 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

  7. 15套java架构师、集群、高可用、高可扩 展、高性能、高并发、性能优化Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

  8. 11.Redis 哨兵集群实现高可用

    作者:中华石杉 Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis mast ...

  9. K8S集群Master高可用实践

    K8S集群Master高可用实践    https://blog.51cto.com/ylw6006/2164981 本文将在前文基础上介绍k8s集群的高可用实践,一般来讲,k8s集群高可用主要包含以 ...

随机推荐

  1. git忽略某些文件提交

    git忽略某些文件提交   在项目中有些配置文件不需要提交,但是有同学在后面开发中发现在.igonore文件中无论如何都无法忽略某些文件的提交.原因在这里: 已经维护起来的文件,即使加上了gitign ...

  2. 开源的许可证GPL、LGPL、BSD、Apache 2.0的通俗解释

    软件开发者要开源软件,不单单是开放源代码就可以了,选择一种许可证很重要,一个许可证之于软件就相当于价值观之于普通人,代表了这个软件的基本品性.一个错误的许可证选择可能会直接导致整个项目的失败. 各种开 ...

  3. 何为PostgreSQL?

    PostgreSQL 是以加州大学伯克利分校计算机系开发的 POSTGRES, Version 4.2 为基础的对象关系型数据库管理系统(ORDBMS).POSTGRES 领先的许多概念只是在非常迟的 ...

  4. Java学习日志(20170111)

    今日新知识点: 1.关键字volatile sychronized是同步锁,这个之前接触过,在类/方法或代码块前加该修饰词,即可实现线程同步: volatile也是一个修饰符,被volatile修饰的 ...

  5. NYOJ 299

    (前言:这是一道关于矩阵快速幂的问题,介绍矩阵快速幂之前,首先看"快速幂"问题. 在前面的博客里有记录到快速幂取模算法,不过总体的思想总是和取模运算混淆在一起,而忽略了" ...

  6. xaml中的依赖属性

    wpf使用依赖属性完成数据绑定.动画.属性变更通知.样式化等.对于数据绑定.绑定到.NET属性源上的UI元素的属性必须是依赖属性 .net的一般属性定义如下 private int val;      ...

  7. linux配置更改yum源

    1,进入yum源配置目录 cd /etc/yum.repos.d 2,备份系统自带的yum源mv CentOS-Base.repo CentOS-Base.repo.bk下载163网易的yum源:wg ...

  8. 3.struts2访问Servlet API,并和mybaits实现全套增删改查

    1.创建数据库脚本userinfo.sql prompt PL/SQL Developer import file prompt Created on 2016年5月19日 by pc set fee ...

  9. install webapp2 on Linux outside google app engine.

    Reference: https://webapp-improved.appspot.com/tutorials/quickstart.nogae.html Step 1: install pip S ...

  10. rzsz的安装

    rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具优点:比ftp命令方便,而且服务器不用打开FTP服务. sz:将选定的文件发送(send)到本地机器rz:运行该命令 ...