Memcachedb
协议:New BSD License
作者:stvchu, gary.caokai, forever.sky81
团队:新浪互动社区事业部──博客产品
网址:http://www.memcachedb.org/
Memcachedb = memcache + Berkeley DB
Memcachedb是一款支持高并发的分布式持久存储系统,对任何原有memcached客户端来讲,它仍旧是个memcached,但是,它的数据是可以持久存储的。
前端:memcached的网络层
后端:Berkeley DB存储
写速度:从本地服务器通过memcache客户端(libmemcache) set 2亿条16字节长的key,10字节长的Value的记录,耗时16572秒,平均速度12000条记录/秒。
读速度:从本地服务器通过memcache客户端(libmemcache) get 100万条16字节长的key,10字节长的Value的记录,耗时103秒,平均速度10000条记录/秒。
• 支持的memcache命令
get, set, add, replace
incr, decr
delete
stats
flush_all
• 私有命令
db_checkpoint, db_archive
db_ismaster, db_whoismaster (for replication)
编译及安装方法:
http://blog.csdn.net/simonlsy/archive/2008/01/07/2027940.aspx
ncache
协议:New BSD License
作者:shinepf, shuiyang
团队:新浪互动社区事业部──博客产品
网址:http://code.google.com/p/ncache/
ncache是一款基于nginx的缓存系统,比Squid更快更高效。
01
02
03
04
05
06
07
08
09
10
以上图片来自PPT:http://ncache.googlecode.com/files/ncache.ppt
协议:New BSD License
作者:stvchu, gary.caokai, forever.sky81
团队:新浪互动社区事业部──博客产品
网址:http://www.memcachedb.org/
Memcachedb = memcache + Berkeley DB
Memcachedb是一款支持高并发的分布式持久存储系统,对任何原有memcached客户端来讲,它仍旧是个memcached,但是,它的数据是可以持久存储的。
前端:memcached的网络层
后端:Berkeley DB存储
写速度:从本地服务器通过memcache客户端(libmemcache) set 2亿条16字节长的key,10字节长的Value的记录,耗时16572秒,平均速度12000条记录/秒。
读速度:从本地服务器通过memcache客户端(libmemcache) get 100万条16字节长的key,10字节长的Value的记录,耗时103秒,平均速度10000条记录/秒。
• 支持的memcache命令
get, set, add, replace
incr, decr
delete
stats
flush_all
• 私有命令
db_checkpoint, db_archive
db_ismaster, db_whoismaster (for replication)
编译及安装方法:
http://blog.csdn.net/simonlsy/archive/2008/01/07/2027940.aspx
ncache
协议:New BSD License
作者:shinepf, shuiyang
团队:新浪互动社区事业部──博客产品
网址:http://code.google.com/p/ncache/
ncache是一款基于nginx的缓存系统,比Squid更快更高效。
01
02
03
04
05
06
07
08
09
10
以上图片来自PPT:http://ncache.googlecode.com/files/ncache.ppt
ncache有意思,不过,bug不少。
希望实现其rfc2616关于cache部分的描述。支持Expire等。
#####################
-----------------Build dir /tmp/data-------------------------------
/bin/chown: 参数太少
请尝试执行‘/bin/chown --help’来获取更多信息。
-----------------Build dir cachedir-------------------------------
./mkdir_ngx_cache.sh: line 36: [: too many arguments
/bin/chown: 参数太少
请尝试执行‘/bin/chown --help’来获取更多信息。
如下情况还是不能被缓存阿。已经包含了:(Cache-Control: max-age=8640000)
HTTP/1.1 200 OK
Server: nginx/0.5.34
Date: Thu, 10 Jan 2008 03:54:26 GMT
Content-Type: text/html
Connection: keep-alive
ID: 12345678
Set-Cookie: 1234555
Cache-Control: max-age=8640000
Content-Length: 217
能有这样的团队真的很不错.
可以写自己喜欢的代码和做很多实验.
看来有了前进的目标了.
项目除了在GOOGLE CODE上开.
有没有放到SF上?
那里能得到更多协助.
新浪有的缓存用的所谓的 CachePower,把 squid改了名字,却连 X-Squid-Error 都没改,显得不厚道!
比如:http://218.30.66.101/
Generated Thu, 10 Jan 2008 10:34:00 GMT by xa-176.sina.com.cn (CachePower/1.3.1.dev)
HTTP/1.x 403 Forbidden
Server: CachePower/1.3.1.dev
Mime-Version: 1.0
Date: Thu, 10 Jan 2008 10:34:00 GMT
Content-Type: text/html
Content-Length: 1063
Expires: Thu, 10 Jan 2008 10:34:00 GMT
X-Squid-Error: ERR_ACCESS_DENIED 0
X-Cache: MISS from xa-176.sina.com.cn
Connection: close
这种底层程序.本来就很讲求性能吧
好的程序甚至需要调整内核性能来满足应用的性能.
改名字只是表面
一样没有改反馈信息也是表面
很多东西.比如内部性能.只有开发人员才知道了
http://code.google.com/p/ncache/wiki/HowToUseNCache
这个上面没有完整的配置信息(比如fcgi的配置)
然后给一个ncache和varnish的性能比较看看。
hooo。谢谢
回复 outrace :NCACHE本身不支持FCGI,本来NGINX是支持的,不过我们只提取NGINX的核心模块,有很多功能都去掉了.varnish我们之前做过测试,效果并不好,尤其是跑了一段时间之后性能急剧下降,而且它是一种纯内存CACHE,相比来说NCACHE目前的版本还不具备内存CACHE功能,等NCACHE的内存CACHE功能出来后,我们会进行一个比较详细的生产环境测试和比较,谢谢
回复 乐百氏: 谢谢你提出了这个BUG,SIMON同学已经根据你的描述修改了这个SH文件,谢谢. 目前新的版本中NCACHE已经将MAX-AGE自动转为了分钟,最大支持65535分钟的缓存过期时间,超过的就全都按这个时间来计算, 8640000(100天不过期) 是不是大了点?不用这么设置吧?我们公司最大设置才30天左右,够用就好~.ncache 确实不支持RFC的很多描述,因为我们本来就是想让它成为一个完全定制的,精简的小系统,这也是我们为什么更快的原因之一,谢谢
谢谢,诚恳的答复
memcachedb 最大的应用是用来做点击数的存储。
================================
其实是适合对于点状数据,无关联的数据存储,点击量只是其中一种,如果以这个来做文章的存储,然后用另外的关系数据库存储文章的关系,就挺合适的,只是不知道这样的性能会不会下降了
然后用nginx直接做对外服务呢
varnish或者squid都是利用内存和它的连接数来做到加速服务.
但是如果是squid->nginx->fastcgi->mysql
这样当中很多连接是开销在内部的连接之中
而且如果客户端请求php.squid还需要将请求再转发至nginx,然后nginx再转发至fastcgi
对于动态内容的多加了一个步骤.
考虑到nginx有了不低于squid以及varnish的连接能力
那么可以将网站程序直接放在tmpfs中
这样如果是静态的.就会直接从内存读取后返回给用户(和其他缓冲服务器的效果一样)
如果是PHP就丢给后面的fastcgi处理
这样更快.
至于程序同步的问题.
在程序更新的时候使用svn或者rsync去同步tmpfs里面和文件服务器中的内容就可以了
至于服务器重启tmpfs清空的问题
只需要在服务器重启之前,需要将内存中的程序复制到本地硬盘
然后启动之后,将硬盘数据再复制到tmpfs中然后启动服务即可
至于服务器宕机以后无法事先保存tmpfs内容
既然服务器都挂了.在它启动之后用10分钟20分钟把程序全部重新同步过来也不是什么大的开销.
如果是多节点的负载均衡或者HA,那就更没必要担心tmpfs内容丢失的问题.
至于上传文件
如果你都用这么样的架构来加速了.
你的图片还会直接上传到web服务器么?
肯定是直接传到图片服务器了.
我觉得最重要的是利用 nginx 的功能,在硬盘上保存缓存数据,提供最大的并发请求和吞吐。squid 在缓存文件个数多了以后,效率下降的比较厉害。
纯内存的 cache 非常有用,但内存是有限的稀缺资源(别和我说现在内存便宜,我现在用的CACHE机都是16G插满的内存),可能对 web 页面等比较适合,但是对于图片等大字节的东西就不太适合了。我目前也只在静态专区上使用这种方式。图片?动不动就上几百G的量,不可能了。
而图片恰恰是同步最麻烦的,如果 ncache 能和 squid 一样,自动拉和保存大量的缓存文件,并提供优秀的吞吐量,我觉得就可以满足我对缓存的需要了。
varnish 我也测试过,感觉不太稳定,有跑着跑着就崩掉的现象,当时我测试时用的版本是 1.0.x 的,新版本的没测试过,不敢乱说,应该在稳定性上有提高。
术数有专攻,在 ncache 中集合太多的功能,感觉不好,还是做精来的合适。
另:为什么 ncache 不作为 nginx 的一个补丁来开发?这样可以集成到nginx里面,让用户在编译时选择?
[root@localhost memcachedb-1.0.3]# make
make all-recursive
make[1]: Entering directory `/usr/local/src/bdb/memcachedb-1.0.3'
Making all in doc
make[2]: Entering directory `/usr/local/src/bdb/memcachedb-1.0.3/doc'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/usr/local/src/bdb/memcachedb-1.0.3/doc'
Making all in tools
make[2]: Entering directory `/usr/local/src/bdb/memcachedb-1.0.3/tools'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/usr/local/src/bdb/memcachedb-1.0.3/tools'
make[2]: Entering directory `/usr/local/src/bdb/memcachedb-1.0.3'
gcc -DHAVE_CONFIG_H -I. -I/usr/local/BerkeleyDB.4.6/include -g -O2 -MT memcachedb.o -MD -MP -MF .deps/memcachedb.Tpo -c -o memcachedb.o memcachedb.c
memcachedb.c: 在函数 ‘do_store_item’ 中:
memcachedb.c:696: 错误:‘DB’ 没有名为 ‘exists’ 的成员
memcachedb.c: 在函数 ‘process_stat’ 中:
memcachedb.c:885: 错误:‘DB_REPMGR_SITE’ 未声明 (在此函数内第一次使用)
memcachedb.c:885: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
memcachedb.c:885: 错误:所在的函数内只报告一次。)
memcachedb.c:885: 错误:‘list’ 未声明 (在此函数内第一次使用)
memcachedb.c:895: 错误:‘DB_ENV’ 没有名为 ‘repmgr_site_list’ 的成员
memcachedb.c:921: 错误:‘DB_ENV’ 没有名为 ‘rep_get_priority’ 的成员
memcachedb.c:924: 错误:‘DB_ENV’ 没有名为 ‘repmgr_get_ack_policy’ 的成员
memcachedb.c:927: 错误:‘DB_ENV’ 没有名为 ‘rep_get_timeout’ 的成员
memcachedb.c:927: 错误:‘DB_REP_ACK_TIMEOUT’ 未声明 (在此函数内第一次使用)
memcachedb.c:930: 错误:‘DB_ENV’ 没有名为 ‘rep_get_config’ 的成员
memcachedb.c:930: 错误:‘DB_REP_CONF_BULK’ 未声明 (在此函数内第一次使用)
memcachedb.c: 在函数 ‘process_rep_command’ 中:
memcachedb.c:1377: 错误:‘DB_REPMGR_SITE’ 未声明 (在此函数内第一次使用)
memcachedb.c:1377: 错误:‘list’ 未声明 (在此函数内第一次使用)
memcachedb.c:1394: 错误:‘DB_ENV’ 没有名为 ‘repmgr_site_list’ 的成员
memcachedb.c:1417: 错误:‘DB_ENV’ 没有名为 ‘rep_set_priority’ 的成员
memcachedb.c:1433: 错误:‘DB_ENV’ 没有名为 ‘repmgr_set_ack_policy’ 的成员
memcachedb.c:1449: 错误:‘DB_ENV’ 没有名为 ‘rep_set_timeout’ 的成员
memcachedb.c:1449: 错误:‘DB_REP_ACK_TIMEOUT’ 未声明 (在此函数内第一次使用)
memcachedb.c:1464: 错误:‘DB_ENV’ 没有名为 ‘rep_set_config’ 的成员
memcachedb.c:1464: 错误:‘DB_REP_CONF_BULK’ 未声明 (在此函数内第一次使用)
make[2]: *** [memcachedb.o] 错误 1
make[2]: Leaving directory `/usr/local/src/bdb/memcachedb-1.0.3'
make[1]: *** [all-recursive] 错误 1
make[1]: Leaving directory `/usr/local/src/bdb/memcachedb-1.0.3'
make: *** [all] 错误 2
[root@localhost memcachedb-1.0.3]#
不知道怎么回事,请赐教。
谢谢你的建议,目前我们也是这么做的,尤其在相册上做的测试,吞吐比SQUID大了很多,内存缓存已经开发完了,但效果并不明显,作为一个编译选项进行了提供,至于整个NCACHE为什么没座位NGINX的MODULE提供,主要是由于NGINX的MODULE开发结构本身并不适合开发CACHE 尤其是PROXY CACHE,所以改了很多源代码,今后可能会考虑给每个NGINX打PATCH
再次请教一个问题,这个memcachedb是否也可以使用cacti 监控呢(跟cacti的模块memcache 同样的)
我想问一下memcachedb不支持expire吗?
我测试了一下,好像不支持啊,能回复一下吗,因为我们正在准备用这个memcachedb,谢谢!