From : http://www.cnblogs.com/happyday56/p/3461113.html

首先说明下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/

memcache集群的实现

memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。

memcached的分布式

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

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

1.应用传入需要操作的key,通过CacheManager获取配置在Cluster中的客户端。

2.当获得Cache Client以后,执行Cache操作。

3.  A.如果是读取操作,当不能命中时去集群其他Cache客户端获取数据,如果获取到数据,尝试写入到本次获得的Cache客户端,并返回结果。(达到数据恢复的作用)

B.如果是更新操作,在本次获取得Cache客户端执行更新操作以后,立即返回,将更新集群其他机器命令提交给客户端的异步更新线程对列去异步执行。(由于如果是根据key来获取Cache,那么异步执行不会影响到此主键的查询操作)

存在的问题:如果是设置了Timeout的数据,那么在丢失以后被复制的过程中就会变成永久有效的内容。

越来越感觉到DB力不从心,在面对千万级用户量的应用时,DB面对平凡的curd,特别是查询的时候,早已不堪重负!如何解决高并发下数据的查询效率,在应用中显的越来越重要,好了废话不多说,首先介绍下magent与memcached

一、 magent

magent是一款开源的Memcached代理服务器软件,其项目网址为:http://code.google.com/p/memagent/

1. 安装:

1.mkdir magent   
2.cd magent/   
3.wget http://memagent.googlecode.com/files/magent-0.5.tar.gz   
4.tar zxvf magent-0.5.tar.gz   
5./sbin/ldconfig   
6.sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile   
7.make   
8.cp magent /usr/bin/magent   
9.cd ../

2. magent  命令参数说明:
1.-h this message   
2.-u uid   
3.-g gid   
4.-p port, default is 11211. (0 to disable tcp support)   
5.-s ip:port, set memcached server ip and port   
6.-b ip:port, set backup memcached server ip and port   
7.-l ip, local bind ip address, default is 0.0.0.0  
8.-n number, set max connections, default is 4096  
9.-D do not go to background   
10.-k use ketama key allocation algorithm   
11.-f file, unix socket path to listen on. default is off   
12.-i number, max keep alive connections for one memcached server, default is 20  
13.-v verbose

二、memcached   http://memcached.org/

1. 安装libevent

  1. tar zxvf libevent-1.4.13-stable.tar.gz
  2. cd libevent-1.4.13-stable
  3. ./configure  --prefix=/usr
  4. make
  5. make install

2. 安装memcached

  1. tar zxvf memcached-1.4.5.tar.gz
  2. cd memcached-1.4.5.tar.gz
  3. ./configure  --with-libevent=/usr

configure 需要加 libevent的安装路径

  1. make
  2. make install
  3. 安装完成后会把memcached放到 /usr/local/bin/memcached

启动: /usr/local/bin/memcached -d -m 512 -u root  -p 11211 -c 10000  -M -f 1.1 -P /tmp/memcached.pid

三、配置memcached   与 magent,无图无真相,一图抵千言:

magent与memcached 是可以混搭的,不必死板的一个magent s-memcached s-memcached b-memcached

上图此模型已经能够很好的解决一个节点,一组服务器的缓存数据服务,但是如果在北方网通架设了一组服务器,同时在南方电信又架设了另外一组服务器,那么这两组相对独立的节点之间如何做到数据的同步与共享,基于magent与memcached的解决方案如下:

需要注意的是,两组magent的配置最好完全一致,比如:

北方的magent配置为:magent s-memcached1 s-memcached2 b-memcached3

那么南方的magent配置也为:magent s-memcached1 s-memcached2 b-memcached3

其顺序都是一致的,因为magent在分配key到memcached上时只是简单的使用散列余数算法。

当然如果你够懒,那么你可以直接连接备份magent,因为所有的数据上面都有。

有个特别要注意的地方是:

1:其中一台Memcached死掉,从magent取数据,数据会从备份的Memcached取出,保证用户不受影响.

2:Memcached重启复活,由于这两台Memcached重启后无数据,因此magent取得的将是空值,尽管备份Memcached还有数据。可采用定时维护服务器,恢复memcached。

3。如果Memcached死掉,备份机同时死掉,那么只能说明你够倒霉,此时此刻你或许能见到上帝。

四、java客户端

推荐使用:xmemcached

http://code.google.com/p/xmemcached/

五、缓存与DB的同步

比较保险的做法是:查询的时候从缓存中取,add、updae、delete的时候同时操作缓存与DB。

当然你也可以定时同步缓存与DB的数据,个人认为不同的业务应该有不同的选择!

我在实际的应用中是同时使用这两种方式,比如用户个人信息之类的内容,就用定时同步的方式。

六、搜索引擎+缓存+DB

这个主题比较大,可以分为:

1。文件结构的存储代替DB持久化存储。

2。缓存在搜索引擎中的使用--文本库与索引库的缓存实现。

3。使用搜索引擎进行统一的数据查询。

4。文件同步读写。

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

  1. memcached+magent实现memcached集群

    首先说明下memcached存在如下问题 本身没有内置分布式功能,无法实现使用多台Memcache服务器来存储不同的数据,最大程度的使用相同的资源:无法同步数据,容易造成单点故障.(memagent代 ...

  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. Linux下jdk、Tomcat、MySQL的安装

    1. 安装JDK 1.上传jdk-7u45-linux-x64.tar.gz到Linux上(使用WinSCP工具) 2.解压jdk到/usr/local目录 tar  -zxvf  jdk-7u45- ...

  2. vs2010 打包安装

    https://jingyan.baidu.com/article/b7001fe184e4e50e7382dd4e.html 1 建立安装项目2 要安装的文件都添加到应用程序文件夹3 在应用程序文件 ...

  3. java 线程池(ExecutorService与Spring配置threadPoolTaskExecutor)

    一.java ExecutorService实现 创建ExecutorService变量private ExecutorService executor = null 2.执行对应任务时,首先生成线程 ...

  4. Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹

    Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹 Nmap工具的准备工作 当用户对Nessus工具有清晰的认识后,即可使用该工具实施扫描.但是,在扫描之前需要做一些准备工作,如探测网络中活动的主 ...

  5. BZOJ.3990.[SDOI2015]排序(DFS)

    题目链接 操作序列的顺序显然是无关的,所以只需按特定顺序求出一个长度为\(l\)的操作序列,它对答案的贡献为\(l!\). 我们从小到大枚举所有选择.若当前为第\(i\)个,如果有一段长度为\(2^i ...

  6. 【BZOJ-2888】资源运输 LCT + 启发式合并

    2888: 资源运输 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 63  Solved: 33[Submit][Status][Discuss] D ...

  7. ant design table column 设置width不生效解决方案

    当td里的内容超出了width的范围时,会出现width不固定,也就是width不生效 解决方案: 设置scroll的width等于所有列宽之和(scroll={{x: 100%}})

  8. 回顾JavsScript对象的克隆

    JS对象的数据类型分为两大类:原始类型(string, boolean, number,undefined, function)和 对象类型(array, object, null). 1.浅度克隆 ...

  9. LPC43xx SGPIO Slice 输入输出连接表

  10. EditPlus(4.0.0.395)中文免激活绿色版

    EditPlus一套功能强大,可取代记事本的文字编辑器,拥有无限制的撤消与重做.英文拼字检查.自动换行.列数标记.搜寻取代.同时编辑多文件.全屏幕浏览功能.而它还有一个好用的功能,就是它有监视剪贴板的 ...