https://code.google.com/p/memagent/

标签:memcached magent 高可用 HA 架构
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://centilinux.blog.51cto.com/1454781/968104

magent是一款开源的Memcached代理服务器软件,可以用它做一些高可用架构尝试。目前magent已更新到0.6,我在centos 6.0 64bit机器上面未编译通过,所以我在这里用0.5的源码来测试;

google项目地址:http://code.google.com/p/memagent/

一、安装步骤:
1、编译安装libevent:

2、编译安装Memcached:

3、编译安装magent:

  • mkdir magent
  • cd magent/
  • wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
  • tar zxvf magent-0.5.tar.gz
  • /sbin/ldconfig
  • vim Makefile
  • CFLAGS = -Wall -O2 -g
  • 改为:
  • CFLAGS = -lrt -Wall -O2 -g
  • sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
  • vim ketama.h
  • 加入
  • #ifndef SSIZE_MAX
  • #define SSIZE_MAX     32767
  • #endif
  • make
  • cp magent /usr/bin/magent
  • cd ../

安装中常遇到的问题

  • gcc -lrt -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c
  • magent.c: In function ‘writev_list’:
  • magent.c:729: error: ‘SSIZE_MAX’ undeclared (first use in this function)
  • magent.c:729: error: (Each undeclared identifier is reported only once
  • magent.c:729: error: for each function it appears in.)
  • make: *** [magent.o] Error 1

解决办法:

  • vim ketama.h
  • 加入
  • #ifndef SSIZE_MAX
  • #define SSIZE_MAX     32767
  • #endif

二、高可用网络架构
此架构生产环境需要负载均衡器做负载,具体使用什么软件或硬件就要看你的具体情况来定了。

生产环境每台服务器分别启动一个memcached进程和magen进程做冗余

  • memcached -d -m 256 -l 192.168.10.11 -p 11211 -u www -c 10240 -P /tmp/memcached.pid  -vv >/home/logs/memcached.txt 2>&1
  • memcached -d -m 128 -l 192.168.10.12 -p 11211 -u www -c 10240 -P /tmp/memcached.pid  -vv >/home/logs/memcached.txt 2>&1
  • memcached -d -m 128 -l 192.168.10.13 -p 11211 -u www -c 10240 -P /tmp/memcached.pid  -vv >/home/logs/memcached.txt 2>&1
  • magent -u www -n 51200 -l 192.168.10.11 -p 12000 -s 192.168.10.12:11211 -s 192.168.10.13:11211 -b 192.168.10.11:11211
  • magent -u www -n 51200 -l 192.168.10.12 -p 12000 -s 192.168.10.12:11211 -s 192.168.10.13:11211 -b 192.168.10.11:11211
  • magent -u www -n 51200 -l 192.168.10.13 -p 12000 -s 192.168.10.12:11211 -s 192.168.10.13:11211 -b 192.168.10.11:11211

参数说明:
-s 为要写入的memcached, 
-b 为备份用的memcached。
说明:测试环境用magent和memached的不同端口来实现,在生产环境中可以将magent和memached作为一组放到多台服务器上。
看到了吧这样的架构最好做负载了,用一个VIP分别映射三台magent的12000端口即可。
#实验环境测试过程:

  • [root@odb ~]# telnet 127.0.0.1 12000
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • set key 0 0 8                       <—在10000端口设置key的值
  • STORED
  • quit
  • Connection closed by foreign hos
  • [root@odb ~]# telnet 127.0.0.1 11211
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • get key                     <—在11211端口获取key的值成功
  • VALUE key 0 8
  • END
  • quit
  • Connection closed by foreign host.
  • [root@odb ~]# telnet 127.0.0.1 11211
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • get key                     <—在11211端口获取key的值成功
  • VALUE key 0 8
  • END
  • quit
  • Connection closed by foreign host.
  • 高可用性测试:
  • [root@odb ~]# ps aux |grep -v grep |grep memcached
  • root     23455  0.0  0.0  5012 1796 ?        Ss   09:22   0:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11212
  • root     24950  0.0  0.0  4120 1800 ?        Ss   10:58   0:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11211
  • [root@odb ~]# ps aux |grep -v grep |grep ‘magent -u’
  • root     25919  0.0  0.0  2176  484 ?        Ss   12:00   0:00 magent -u root -n 51200 -l 127.0.0.1 -p 10000 -s 127.0.0.1:11211 -b 127.0.0.1:11212
  • root     25925  0.0  0.0  3004  484 ?        Ss   12:00   0:00 magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s 127.0.0.1:11212 -b 127.0.0.1:11211
  • [root@odb ~]# telnet 127.0.0.1 10000
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • set stone 0 0 6                      <—在10000端口设置stone的值
  • STORED
  • quit
  • Connection closed by foreign host.
  • [root@odb ~]# telnet 127.0.0.1 11000
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • set shidl 0 0 6                      <—在11000端口设置shidl的值
  • STORED
  • get stone                      <—在11000端口获取stone的值成功
  • VALUE stone 0 6
  • END
  • incr stone 2                      <—在11000端口修改stone的值成功
  • get stone
  • VALUE stone 0 6                     <—在11000端口验证stone的值,证明上面的修改成功
  • END
  • get shidl                      <—在11000端口获取shidl的值成功
  • VALUE shidl 0 6
  • END
  • quit                     <—退出11000端口
  • Connection closed by foreign host.
  • [root@odb ~]# telnet 127.0.0.1 10000
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • get stone                      <—在10000端口获取stone的值,已被修改
  • VALUE stone 0 6
  • END
  • get shidl                      <—在10000端口获取shidl的值成功
  • VALUE shidl 0 6
  • END
  • delete shidl                      <—在10000端口删除shidl
  • DELETED
  • get shidl                      <—在10000端口删除shidl生效
  • END
  • quit
  • Connection closed by foreign host.
  • [root@odb ~]# telnet 127.0.0.1 11000
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • get shidl                      <—在11000端口验证删除shidl生效
  • END
  • get stone                      <—在11000端口获取stone的值成功
  • VALUE stone 0 6
  • END
  • quit
  • Connection closed by foreign host.

Down机模拟测试:
Down掉11211端口的memcached:

  • [root@odb ~]# kill -9 24950
  • [root@odb ~]# telnet 127.0.0.1 10000
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • get stone                      <—在10000依然可以获取stone的值
  • VALUE stone 0 6
  • END
  • quit
  • Connection closed by foreign host.
  • [root@odb ~]# telnet 127.0.0.1 11000
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • get stone                      <—在11000依然可以获取stone的值
  • VALUE stone 0 6
  • END
  • quit
  • Connection closed by foreign host.
  • Down掉11000端口的magent:
  • [root@odb ~]# kill -9 25925
  • [root@odb ~]# telnet 127.0.0.1 10000
  • Trying 127.0.0.1…
  • Connected to localhost.localdomain (127.0.0.1).
  • Escape character is ‘^]’.
  • get stone                      <—在10000依然可以获取stone的值
  • VALUE stone 0 6
  • END
  • quit
  • Connection closed by foreign host.

本文出自 “Centi.Linux” 博客,请务必保留此出处http://centilinux.blog.51cto.com/1454781/968104

Memcached HA架构探索的更多相关文章

  1. 腾讯云原生数据库TDSQL-C架构探索和实践

    作为云原生技术先驱,腾讯云数据库内核团队致力于不断提升产品的可用性.可靠性.性能和可扩展性,为用户提供更加极致的体验.为帮助用户了解极致体验背后的关键技术点,本期带来腾讯云数据库专家工程师王鲁俊给大家 ...

  2. 分布式缓存系统 Memcached 整体架构

    分布式缓存系统 Memcached整体架构 Memcached经验分享[架构方向] Memcached 及 Redis 架构分析和比较

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

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

  4. Hadoop2.X HA架构与部署

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

  5. HA架构

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

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

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

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

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

  8. 新闻网大数据实时分析可视化系统项目——5、Hadoop2.X HA架构与部署

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

  9. Sentry(v20.12.1) K8S 云原生架构探索,SENTRY FOR JAVASCRIPT SDK 配置详解

    系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...

随机推荐

  1. Java Swing界面编程(25)---事件处理:鼠标事件及监听处理

    假设想对一个鼠标的操作进行监听,假设鼠标按下.松开等.则能够使用MouseListener接口. package com.beyole.util; import java.awt.event.Mous ...

  2. 彻底解决zend studio 下 assignment in condition警告

    最近在mac系统下安装zend studio作为php开发工具,把以前的代码导入,发现项目中有很多 “assignment in condition”的警告,造成原因是在条件判断的if.while中使 ...

  3. ubuntu16.04 Cmake学习二

    本节主要总结编译程序的时候使用了第三方库的情况,以调用开源opencv-2.4.9为例子,具体安装详见http://www.cnblogs.com/xsfmg/p/5900420.html. 工程文件 ...

  4. 果园里有一堆苹果,一共n头(n大于1小于9)熊来分,第一头为小东,它把苹果均分n份后,多出了一个,它扔掉了这一个,拿走了自己的一份苹果,接着第二头熊重复这一过程,即先均分n份,扔掉一个然后拿走一份,以此类推直到最后一头熊都是这样(最后一头熊扔掉后可以拿走0个,也算是n份均分)。问最初这堆苹果最少有多少个。

    include "stdafx.h" // ConsoleApplication12.cpp : 定义控制台应用程序的入口点. // #include<iostream> ...

  5. Hive报错:Failed with exception Unable to rename

    之前也安装过hive,操作过无数,也没发现什么错误,今天因为之前安装的hadoop不能用了,不知道为什么,老是提示node 0,所以重新安装了hadoop和hive.安装完测试hive创建表也没发现什 ...

  6. SecureCRT的上传和下载

    securtCRT对于后台开发者并不陌生,在windows下是得力的助手.而文件从服务器上上传和下载是很基本.很日常的操作.下面就谈谈关于它的命令及操作: 借助securtCRT,使用linux命令s ...

  7. 数据库ACID操作---事务四原则

    事务操作四原则: 1>原子性:简单来说——整个事务操作如同原子已经是物理上最小的单位,不可分离事务操作要么一起成功,要么一起失败. 2>一致性:倘若事务操作失败,则回滚事务时,与原始状态一 ...

  8. 01 http协议概念及工作流程

    一:HTTP协议 重要性: 无论是以后用webserverice ,还是用rest做大型架构,都离不开对HTTP协议的认识. 甚至可以简化的说: webservice = http协议+XML Res ...

  9. 【转】php和java之间rsa加密互通

    以下是php封装好的类,引入即可使用 <?php /** * 作者:pjp * 邮箱:vippjp@163.com */ class RSA{ private $privateKey='';// ...

  10. java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;

    spring3_hibernate 集成报错信息 java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljav ...