首先说明下memcached存在如下问题

  本身没有内置分布式功能,无法实现使用多台Memcache服务器来存储不同的数据,最大程度的使用相同的资源;无法同步数据,容易造成单点故障。(memagent代理实现集群)

在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
  Memcached单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个Memcached进程 
  最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA 
  60*60*24*30控制 
  最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制 
  单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制, 
  它是默认的slab大小 
  最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,通过 
  settings.maxconns=1024 进行控制 
  跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步进方式

memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。
  memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。
  memcached作为小规模的数据分布式平台是十分有效果的。

memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。

集群配置

由于Memcached服务器与服务器之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器节点出现故障时,会出现单点故障,如果需要实现HA,则需要通过另外的方式来解决。

通过Magent缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存连接服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。如果其中一台缓存服务器down机,系统依然可以继续工作,如果其中一台Memcached机器down掉,数据不会丢失并且可以保证数据的完整性。具体可以参考:http://code.google.com/p/memagent/

memcached的分布式                                                                                                                                                                                                                                                                                                              

Memcached作为集中式Cache,就存在着集中式的致命问题:单点问题,Memcached支持多Instance分布在多台机器上,仅仅只是解决了数据全部丢失的问题,但是当其中一台机器出错以后,还是会导致部分数据的丢失,一个篮子掉在地上还是会把部分的鸡蛋打破。

因此就需要实现一个备份机制,能够保证Memcached在部分失效以后,数据还能够依然使用,当然大家很多时候都用Cache不命中就去数据源获取的策略,但是在SIP的场景中,如果部分信息找不到就去数据库查找,那么要把SIP弄垮真的是很容易,因此SIP对于Memcached中的数据认为是可信的,因此做Cluster也是必要的。

memcached和memcache的安装请看上一篇,这里不做介绍,下面直接安装magent

1、安装magent:

[root@lys2 src]# mkdir magent
[root@lys2 src]# mv magent-0.6.tar.gz magent
[root@lys2 src]# cd magent
[root@lys2 magent]# tar -zxvf magent-0.6.tar.gz
[root@lys2 magent]# /sbin/ldconfig
[root@lys2 magent]# sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
[root@lys2 magent]# make (此处遇到几个报错,解决方法请看文章末尾)
[root@lys2 magent]# cp magent /usr/bin/magent

2、测试magent +memcached的强大功能

开5个memcached端口依次执行

[root@lys2 magent]# memcached -m  -u root -d -l192.168.144. -p
[root@lys2 magent]# memcached -m -u root -d -l192.168.144. -p
[root@lys2 magent]# memcached -m -u root -d -l192.168.144. -p
[root@lys2 magent]# memcached -m -u root -d -l192.168.144. -p
[root@lys2 magent]# memcached -m -u root -d -l192.168.144. -p

先看看是否启动监听端口成功

[root@lys2 magent]# netstat -ulpnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0.0.0.0: 0.0.0.0:* LISTEN /rpc.statd
tcp 127.0.0.1: 0.0.0.0:* LISTEN /php-fpm
tcp 0.0.0.0: 0.0.0.0:* LISTEN /rpcbind
tcp 192.168.144.101: 0.0.0.0:* LISTEN /memcached
tcp 192.168.144.101: 0.0.0.0:* LISTEN /memcached
tcp 192.168.144.101: 0.0.0.0:* LISTEN /memcached
tcp 192.168.144.101: 0.0.0.0:* LISTEN /memcached
tcp 192.168.144.101: 0.0.0.0:* LISTEN /memcached

接着启动magent 设置启动参数 -u当然是启动账号 -n是最大连接数,-l是magent监听的IP -p是magent监听的端口后面的格式依次是 -s IP:端口 代表是主服务器 然后指定IP:端口的格式

#命令详解
'''
-h this message
-u uid
-g gid
-p port, default is . ( to disable tcp support)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip and port
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is
-D do not go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. default is off
-i number, max keep alive connections for one memcached server, default is
-v verbose
'''

这里设置了10001,10002,10003 为主Memcached服务器 10004,10005 为memcached备份服务器 

[root@lys2 magent]# magent -uroot -n  -l 192.168.144.101 -p  -s 192.168.144.101: -s 192.168.144.101: -s 192.168.144.101: -b 192.168.144.101: -b 192.168.144.101:

执行命令后 可以先查看是否启动成功

[root@lys2 magent]# ps -ef | grep magent
root : ? :: magent -uroot -n -l 192.168.144.101 -p -s 192.168.144.101: -s 192.168.144.101: -s 192.168.144.101: -b 192.168.144.101: -b 192.168.144.101:
root : pts/ :: grep magent

3、在XP客户端上测试

直接连接magent 端口 12000 执行stats

说明magent 里面已经负载了3个memcached 端口接着我们继续set

好了 依次设置了3个key ,这里说明下参数 <command name> <key> <flags> <exptime> <bytes>\r\n

既然设置了3个key,我们来读取看执行命令get key1 get key2 get key3依次返回了

到此,一个缓存写入已经存取的过程就完成了

然后我们直接登陆memcached的端口get数据看 它是怎么样保存的

依次telnet 192.168.144.101 10001  192.168.144.101 10002  192.168.144.101 10003 192.168.144.101 10004 192.168.144.101 10005 去获取key值

telnet 192.168.144.101 10001:

telnet 192.168.144.101 10002:

telnet 192.168.144.101 10003:

telnet 192.168.144.101 10004:

telnet 192.168.144.101 10005:

然后我把主服务器的10001 10002 10003的进程全部kill了

[root@lys2 magent]# netstat -ulpnt | egrep "10001|10002|10003" | grep LISTEN | awk '{print $7}' | awk -F /  '{print $1}' | xargs kill
[root@lys2 magent]# netstat -unlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0.0.0.0: 0.0.0.0:* LISTEN /rpc.statd
tcp 192.168.144.101: 0.0.0.0:* LISTEN /magent
tcp 127.0.0.1: 0.0.0.0:* LISTEN /php-fpm
tcp 0.0.0.0: 0.0.0.0:* LISTEN /rpcbind
tcp 192.168.144.101: 0.0.0.0:* LISTEN /memcached
tcp 192.168.144.101: 0.0.0.0:* LISTEN /memcached

再在magent的端口上get key

并不影响取值。不过如果备用服务器也死了的话,就无力了,

集群搭建到此全部完成!

报错解决:

make

错误1:

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

解决办法:

vi ketama.h

在开头加入

#ifndef SSIZE_MAX

# define SSIZE_MAX      32767

#endif

错误2:

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.c

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a

/usr/lib64/libevent.a(event.o): In function `gettime’:

(.text+0×449): undefined reference to `clock_gettime’

/usr/lib64/libevent.a(event.o): In function `event_base_new’:

(.text+0x72a): undefined reference to `clock_gettime’

collect2: ld returned 1 exit status

make: *** [magent] Error 1

解决办法

vim Makefile

CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64)

改为:

CFLAGS = -lrt -Wall -g -O2 -I/usr/local/include $(M64)


错误3:centos 6

[root@test magent]# make

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.c

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a

gcc: /usr/lib64/libm.a:没有那个文件或目录

make: *** [magent] 错误 1

解决办法

ln -s /usr/lib64/libm.so /usr/lib64/libm.a

注:有可能还会报错 gcc: /usr/lib64/libevent.a: 没有那个文件或目录

如果有,可执行

vi Makefile

找到 LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a

修改 LIBS = /usr/libevent 的安装路径/libevent.a /usr/lib64/libm.a

例: LIBS = /usr/lib/libevent.a /usr/lib64/libm.a

查看magent是否安装成功

cd usr/bin/magent ./magent

please provide -s "ip:port" argument

 

memcached agent v0.6 Build-Date: Oct 15 2012 16:12:30

Usage:

  -h this message

  -u uid

  -g gid

  -p port, default is 11211. (0 to disable tcp support)

  -s ip:port, set memcached server ip and port

  -b ip:port, set backup memcached server ip and port

  -l ip, local bind ip address, default is 0.0.0.0

  -n number, set max connections, default is 4096

  -D don't go to background

  -k use ketama key allocation algorithm

  -f file, unix socket path to listen on. default is off

  -i number, set max keep alive connections for one memcached server, default is 20

  -v verbose

memcached+magent实现memcached集群的更多相关文章

  1. [转]memcached+magent实现memcached集群

    From : http://www.cnblogs.com/happyday56/p/3461113.html 首先说明下memcached存在如下问题 本身没有内置分布式功能,无法实现使用多台Mem ...

  2. Nginx+ 多个Memcached+ 多个Tomcat集群配置来实现 sticky Session

    假如有 大于2 台的Tomcat servers,如何实现sticky session特点的高可靠web 服务? 方案设计: 前端使用nginx(最好是淘宝的 tengine)作为we 流量分发器,向 ...

  3. 基于Memcached的Nginx服务器集群session共享

    原料:jdk1.8,tomcat7,nginx1.16,memcached-1.2.6,Mem-Tomcat需要的jar包,基于windows7.所有的点击以下链接可下载 链接:https://pan ...

  4. memcached+magent的集群部署详细过程

    问题描述 Memcached在实现分布集群部署时, Memcached服务端的之间是没有通讯的,服务端是伪分布式,实现分布式是由客户端实现的,客户端实现了分布式算法把数据保存到不同的Memcached ...

  5. memcached构建集群分析之一

    memcached本身是不支持集群的,集群所关注的容灾.容错.宕机恢复机制统统都没有,实战中需要自己实现容灾机制. memcached集群相比memcached的优势: 巨量数据分布到集群的多台应用主 ...

  6. Memcached 集群架构与memcached-session-manager

    Memcached 集群架构方面的问题_知识库_博客园https://kb.cnblogs.com/page/69074/ memcached-session-manager配置 - 学习中间件调优管 ...

  7. Tomcat集群环境下session共享方案 通过memcached 方法实现

    对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...

  8. Mcrouter-基于Memcached协议的缓存层流量管理工具(Memcached集群的另一个选择)(转)

    Mcrouter 是一个基于Memcached协议的路由器,它是 Facebook缓存架构的核心组件,在峰值的时候,它能够处理每秒50亿次的请求.近日,Facebook开放了Mcrouter的源代码, ...

  9. Couchbase集群和Redis集群解析

    Couchbase集群和Redis集群解析 首先,关于一些数据库或者是缓存的集群有两种结构,一种是Cluster;一种是master-salve. 关于缓存系统一般使用的就是Redis,Redis是开 ...

随机推荐

  1. leetcode-【中等题】2. Add Two Numbers

    题目 You are given two linked lists representing two non-negative numbers. The digits are stored in re ...

  2. jfinal相关

    1:jfinal工具类 1):密码加密工具 HashKit.md5(String password);2):数据缓存工具类 chacheKit3):获取项目路径工具类: PathKit 4):读取文件 ...

  3. 转 LoadRunner 技巧之 IP欺骗 (推荐)

    IP欺骗也是也loadrunner自带的一个非常有用的功能. 需要使用ip欺骗的原因: 1.当某个IP的访问过于频繁,或者访问量过大是,服务器会拒绝访问请求,这时候通过IP欺骗可以增加访问频率和访问量 ...

  4. iOS各种调试技巧豪华套餐

    转载自http://www.cnblogs.com/daiweilai/p/4421340.html 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global Break ...

  5. Kafka报错-as it has seen zxid 0x83808 our last zxid is 0x0 client must try another server

    as it has seen zxid 0x83808 our last zxid is 0x0 client must try another server 停止zookeeper,删除datadi ...

  6. ajax同步异步问题

    之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题.最近的项目用了到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去 ...

  7. 基于WDF的PCI/PCIe接口卡Windows驱动程序(5)-如何为硬件移植驱动程序

    原文地址:http://www.cnblogs.com/jacklu/p/6139347.html 正如前几篇博客所说,使用WDF开发PCIe驱动程序是我本科毕业设计的主要工作.在读研的两年,我也分别 ...

  8. sasscore22

    1.setting 如果不需要支持ie6,7,请在引入setting文件之前,设置$lte7:false;. $lte7: true !default  表示的是是否兼容it6/7 2.css3 是一 ...

  9. java正则随笔

    一.string校验 要求字符串只能输入数字,字母大小写和‘@‘’‘.’‘_’三个特殊字符 public static boolean check1(String str){ String patte ...

  10. Ajax嵌套调用 (jquery) $.ajaxSettings.async = false;

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...