Memcached 集群架构方面的问题
Memcached 集群架构方面的问题 您的评价:????? ?Memcached的应用
作者:Lightning@小宝?发布时间:November 2, 2009?分类:互联网系统架构
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached由Danga Interactive(运营LiveJournal的技术团队)开发,用于提升LiveJournal.com访问速度的。 LJ每秒动态页面访问量是几千次,用户700万。Memcached将数据负载大幅度降低,更好的分配资源,更快速访问。
其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名
Memcached可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable.
虽然memcached使用了同样的“Key=>Value”方式组织数据,但是它和共享内存、APC等本地缓存有非常大的区别。 Memcached是分布式的,也就是说它不是本地的。它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程 序或守护进程(Daemon方式)。
Memcached最吸引人的一个特性就是支持分布式部署;也就是说可以在一群机器上建立一堆 Memcached 服务,每个服务可以根据具体服务器的硬件配置使用不同大小的内存块,这样一来,理论上可以建立一个无限巨大的基于内存的cache storage 系统。
Memcached使用libevent库实现网络连接服务,理论上可以处理无限多的连接,但是它和Apache不同,它更多的时候是面向稳定的持续连接 的,所以它实际的并发能力是有限制的。在保守情况下memcached的最大同时连接数为200,这和Linux线程能力有关系,这个数值是可以调整的。 关于libevent可以参考相关文档。 Memcached内存使用方式也和APC不同。APC是基于共享内存和MMAP的,memcachd有自己的内存分配算法和管理方式,它和共享内存没有 关系,也没有共享内存的限制,通常情况下,每个memcached进程可以管理2GB的内存空间,如果需要更多的空间,可以增加进程数。
Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的, 所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。 另外,memcached也经常作为服务器之间数据共享的存储媒介,例如在SSO系统中保存系统单点登陆状态的数据就可以保存在memcached中,被 多个应用共享。
需要注意的是,使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中, 在前端能够迅速的进行存取。由于memcached使用内存管理数据,所以它是易失的,当服务器重启,或者memcached进程中止,数据便会丢失,所 以memcached不能用来持久保存数据。很多人的错误理解,memcached的性能非常好,好到了内存和硬盘的对比程度,其实memcached使 用内存并不会得到成百上千的读写速度提高,它的实际瓶颈在于网络连接,它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直 接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情 况。
Memcached是“分布式”的内存对象缓存系统,所以那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。
64位Linux系统安装Memcached作者:Lightning@小宝?发布时间:August 25, 2009?分类:概念&操作系统&中间件
作者:老唐
由于32位操作系统下面单进程最大内存使用不能超过2G,而我们用Memcached经常需要使用更大的内存空间,所以选择64位的Linux版本是必须的,64位OS下的Memcached安装和32位OS下差不多,只有一个地方稍有不同,详见下面的红色字体部分。
我们以版本memcached-1.2.6为例,对于其他版本替换相应版本号即可;
下载地址:http://www.danga.com/memcached/dist/memcached-1.2.6.tar.gz
由于Memcached用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-1.4.8-stable(如果你的系统已经安装了libevent,可以不用安装)。
下载地址:http://www.monkey.org/~provos/libevent-1.4.8-stable.tar.gz
直接用wget指令直接下载这两个东西,下载回源文件后,首先安装libevent,之后安装memcached即可;
详细步骤如下:
分别把memcached和libevent下载回来,放到 /tmp 目录下:
# cd /tmp# wget http://www.danga.com/memcached/dist/memcached-1.2.6.tar.gz# wget http://www.monkey.org/~provos/ libevent-1.4.8-stable.tar.gz
先安装libevent:
# tar zxvf libevent-1.4.8-stable.tar.gz# cd libevent-1.4.8-stable# ./configure --prefix=/usr/local/libevent-1.4.8-stable# make# make install
测试libevent是否安装成功:
# ls -al /usr/local/libevent-1.4.8-stable/lib | grep libevent# vi /etc/ld.so.conf 加入/usr/local/libevent-1.4.8-stable/lib
运行 ldconfig 否则运行memcached的时候,会提示找不到so文件
还有一种方法是直接在lib64目录中新增一个link链接
# ln -s /usr/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2
安装memcached,同时需要安装中指定libevent的安装位置:
# cd /tmp# tar zxvf memcached-1.2.6.tar.gz# cd memcached-1.2.6# ./configure --prefix=/usr/local/memcached-1.2.6 --with-libevent=/usr/local/libevent-1.4.8-stable --enable-64bit --enable-threads# make# make install# ln -s /usr/local/memcached-1.2.6 /usr/local/memcached
如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
安装完成后会把memcached放到 /usr/local/memcached/bin/memcached
测试是否成功安装memcached:
# ls -al /usr/local/memcached/bin/mem*-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug
启动memcached:
# /usr/local/memcached/bin/memcached -d -m 1024 -u admin -l 127.0.0.1 -p 11211
具体参数信息可通过memcached -h查看,核心参数如下:
-d :指定memcached在后台执行;-m :分配给memcached的可用内存大小,在32位OS中不能超过2G,64位OS中只受物理内存大小限制;-p :memcached的监听端口,默认为11211;Java与php共享Memcached存储数据中的问题与解决方法
作者:Lightning@小宝?发布时间:August 24, 2009?分类:Python/Java/Erlang学习
php写入的数据java读不出来,java写入的数据php读取乱码;
如果你根据php提供的memcache扩展协议来自行编写java memcached client将不会有问题,我们这里提到的是使用
java的 MemCachedClient 包;
php_extension: php_memcache.dll / memcache.sojava_jar: MemCachedClient [com.danga.MemCached.*]
解决方案:
经过查看MemCachedClient源码,发现是 set 时 flags不同,java是根据存储值类型来订flags的。
public static final int MARKER_BYTE = 1; public static final int MARKER_BOOLEAN = 8192; public static final int MARKER_INTEGER = 4; public static final int MARKER_LONG = 16384; public static final int MARKER_CHARACTER = 16; public static final int MARKER_STRING = 32; public static final int MARKER_STRINGBUFFER = 64; public static final int MARKER_FLOAT = 128; public static final int MARKER_SHORT = 256; public static final int MARKER_DOUBLE = 512; public static final int MARKER_DATE = 1024; public static final int MARKER_STRINGBUILDER = 2048; public static final int MARKER_BYTEARR = 4096;
为了方便,两者间的数据转换使用JSON格式;
php与java在存储的时候值类型均要求为String类型,
并且php在$mem->set(key,value,32,expire);加粗部门要注意,这个是必须的。
然后php写入的数据,java那边就能够顺利读取了,当php写入array,object时,java读取后json.decode就OK了。
作者:Lightning@小宝?发布时间:August 6, 2009?分类:Python/Java/Erlang学习
项目地址:http://www.tummy.com/Community/software/python-memcached/
ftp: ftp://ftp.tummy.com/pub/python-memcached/
CentOS5.2下 python已经升级到python2.6
>wget ftp://ftp.tummy.com/pub/python-memcached/
进入解压缩目录
>python setup.py install
安装完毕,启动memcached客服端 :/usr/local/bin/memcached -d -m 10 -u root -l 192.168.1.174 -p 11211 -c 256 -P /tmp/memcached.pid
memcached客服端参数说明:
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,
可以使用?kill `cat /tmp/memcached.pid`来结束进程
python-memcached test-code:
?
?
import memcache, time?
mc = memcache.Client(['192.168.1.174:11211'], debug=0)?
连接到192.168.1.174的11211端口,也就是memcachd启动的端口。
mc.set("some_key", "Some value")?
设置key和value,第三个参数默认为0,也就是数据永不超时。?
如果这样设置:?
mc.set("some_key", "Some value",1)?
表示一秒后超时?
过两秒打印value的话?
time.sleep ( 2)?
value = mc.get("some_key")?
print value?
结果就是None了。
删除mc.set("another_key",3)mc.delete("another_key")自增和自减mc.set("key",?"1")mc.incr("key")??#自增+1mc.decr("key")?#自减-1转自:http://www.open-open.com/lib/view/open1328604498889.html