Memcached 群集高可用性(HA)架构

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

总体架构

直接上图:

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

从图中能够看到有两个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模式下

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

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

时间: 2024-08-28 17:30:47

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

Oracle数据库HA架构方案介绍

摘要:Oracle数据库在各类应用系统中负责存储平台所有的用户数据,数据库的可靠性及安全性直接影响平台的安全运行,目前采用的Oracle Replication方式来实现的数据库高可靠性已经显示出了弊端,本文介绍并分析了目前比较流行的几种数据库高可用性的架构:Oracle Replication.Oracle Rac.Oracle 主机HA等,希望给大家一个参考. 1 什么是高可用性(High  Availability) 高可用(HA)性有两种不同的含义,在广义环境中是指整个系统的高可用性,在

高可用集群HA架构搭建

HA含义为在集群服务器架构中,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务. (1)基本安装 Server1和server2 为High Availability的两个节点 在两个节点上配置完整的rhel6.5的yum源,安装ricci,创建ricci用户,密码westos,启动并设置开机启动ricci. 将instructor机作为管理机(M端),安装luci,启动luci服务 web上配置 在web上输入https://instructor

HDFS HA架构以及源码引导

HA体系架构 相关知识介绍 HDFS master/slave架构,HDFS节点分为NameNode节点和DataNode节点.NameNode存有HDFS的元数据:主要由FSImage和EditLog组成.FSImage保存有文件的目录.分块ID.文件权限等,EditLog保存有对HDFS的操作记录.DataNode存放分块的数据,并采用CRC循环校验方式对本地的数据进行校验,DataNode周期性向NameNode汇报本机的信息. NameNode单点故障:HDFS只有一个NameNode节

Redis3.2.8+sentinel构建HA架构文档

一.环境准备:HA架构至少需要一主一从1.1.主机规划: master端:192.168.56.11 slave端:192.168.56.12 1.2.安装redis环境两台机器分别安装redis3.2.8安装步骤如下: cd /usr/local/ wget http://download.redis.io/releases/redis-3.2.8.tar.gz tar zxvf redis-3.2.8.tar.gz cd redis-3.2.8 make make install mkdir

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

1.1 什么是集群    简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源.这些单个的计算机系统就是集群的节点(node).一个理想的集群是,用户从来不会意识到集群系统底层的节点,在他/她们看来,集群是一个系统,而非多个计算机系统.并且集群系统的管理员可以随意增加和删改集群系统的节点. 更详细的说,集群(一组协同工作的计算机)是充分利用计算资源的一个重要概念,因为它能够将工作负载从一个超载的系统(或节点)迁移到集群中的另一个系统上.其处理能力是与专用计算机(

HDFS HA架构以及源代码引导

HA体系架构 相关知识介绍 HDFS master/slave架构,HDFS节点分为NameNode节点和DataNode节点. NameNode存有HDFS的元数据:主要由FSImage和EditLog组成. FSImage保存有文件的文件夹.分块ID.文件权限等,EditLog保存有对HDFS的操作记录. DataNode存放分块的数据,并採用CRC循环校验方式对本地的数据进行校验,DataNode周期性向NameNode汇报本机的信息. NameNode单点故障:HDFS仅仅有一个Name

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

1.HDFS-HA架构原理介绍 hadoop2.x之后,Clouera提出了QJM/Qurom Journal Manager,这是一个基于Paxos算法实现的HDFS HA方案,它给出了一种较好的解决思路和方案,示意图如下: 1)基本原理就是用2N+1台 JN 存储EditLog,每次写数据操作有大多数(>=N+1)返回成功时即认为该次写成功,数据不会丢失了.当然这个算法所能容忍的是最多有N台机器挂掉,如果多于N台挂掉,这个算法就失效了.这个原理是基于Paxos算法 2)在HA架构里面Seco

Hadoop HA架构搭建

Hadoop HA架构搭建 共七台服务器,节点角色分配如下: 192.168.133.21 (BFLN-01):namenode ?zookeeper ?journalnade?DFSZKFailoverController192.168.133.23 (BFLN-02):namenode?resourcemanager zookeeper ?journalnade?DFSZKFailoverController192.168.133.24 (BFLN-03):resourcemanager z

架构之高可用性(HA)集群(Keepalived)

Keepalived简介 Keepalived是Linux下一个轻量级别的高可用解决方案.高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管, 它与HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的.功能完善的高可用软件,它提供了HA 软件所需的基本功能,比如:心跳检测.资源接管,检测集群中的服务,在集群节点转移共享IP地址的所