wiki:WikiStart

Version 11 (modified by xiazhuoyan, 14 years ago) (diff)

--

新技术简介

在应用访问数据库很频繁,数据库顶不下来的时候,我们大多数情况下会在应用与数据库之间加入缓存;

但如果是数据库没压力,SQL正常等这些情况下,应用顶不下来,那我们该怎么处理???

(PS:在这旁路缓存中,我们只讨论动态页的缓存)

在现阶段,我们暂时只有的办法是:1. 加资源进行扩充; 2. 如果程序还存在优化空间,就对程序进行相应的优化。

可不可以有一种方式:在资源不增加和应用基本不该动的情况下,进行架构的调优?

针对这样一个提问,最近诞生一个不切实际的想法:旁路缓存。

基本目标是:外部条件帮助应用生成动态链点的缓存,应用代码不需更改或只需要增加个投递功能。

基本原理为:Nginx做mc|redis的存取,用户第一次访问Nginx,Nginx进行读取mc|redis,

如果没有则留下痕迹,旁路缓存根据痕迹生成相应的缓存数据,并把相应数据存入相应的缓存中。架构图如下:

团队成员

项目成员:欧彬 余方明

重要信息展示

http://rdtrac.pc.com.cn/2012bypasscache/attachment/wiki/WikiStart/%E6%97%81%E8%B7%AF%E7%BC%93%E5%AD%981.jpg

http://rdtrac.pc.com.cn/2012bypasscache/attachment/wiki/WikiStart/bypasscache.JPG

http://www1.pconline.com.cn/hr/2009/global/images/logo.gif

旁路缓存分为两种方式:方法一:应用程序查完数据后投递到相应地方,相应地方的程序就会把投递过来的信息进行缓存存取。

方法二:旁路缓存生成缓存程序会从相应log中拿出相应记录,已相应访问方法生成相应缓存,然后再投递到相应地方,相应地方的程序就会把投递过来的信息进行缓存存取。

MongoDB作用:存储相应缓存key和value的信息,为删缓存提供依据,可能你会问:旁路缓存的key不是根据uri中相应参数做组合生成的么?

key组成的大部分信息可以在uri的参数中找到,但不排除有特例,因为当组成的key太长的时候,我们可能对这些长做一个md5然后再进行存储,

这时候如果要删缓存的时候就是个问题了。Cache Manager System 缓存管理系统就是为应付这种情况而存在。这会产生一个问题,把大部分连点都缓存下来,那数据量是非常可观,

例如:现在dlc2中使用的key是由dlid linkid 和useragent组成,那它一个连点可以有的最大缓存数为23*10*25*2,现在不使用useragent所以key的组合为dlid和linkid,

那它一个连点可以有的最大缓存数为22*10*25*2。如何管理起这不能眼看为实(即从连点得出key)的缓存也是个要解决的问题。当然如果不存在奇怪的组合key,缓存管理系统是没存在的必要。

Redis选择:Redis除了具有mc相应的一些功能外,它还存在硬缓存,就算是发生重启缓存还不至于丢失。

用一些缓存保存时效性比较长的应用中,应该效果还不错,但需要经测试证实,在以往的测试中redis在我们的一些应用使用上并发连接不是很好--以后是在小图片缓存上进行测试过。

所需的东西介绍:nginx-1.0.10.tar.gz lua-nginx-module memc-nginx-module nginx-eval-module echo-nginx-module ngx_devel_kit lua-5.1.4.tar.gz lua-nginx-module

调用lua进行在nginx编程,主要用户做逻辑,要求功能处理(例如:组建key,对key进行md5)总体概括为使nginx具有动态动能,与之前介绍的perl-nginx-module用法相当,

但lua对使用者要求会低,更容易上手,另一方面资料会多很多,功能也会多一点。memc-nginx-module 这个是个nginx对mc处理的第三方模块(在nginx自我模块中还存在memcached模块,

但它只具有读取功能),但memc第三方模块具有增删改功能,memc_cmds_allowed get set add delete flush_all; nginx-eval-module 可以将eval里面语句动作一个子程序来进行运行然后得到相

应结果,大部分利用在proxy_passmemc_pass等;例如:我需要访问dl.pconline.com.cn然后以其body内容作为变量,就可以使用

eval $result {proxy_pass  http://dl.pconline.com.cn}ngx_devel_kit 配合lua进行开发者的相应功能。echo-nginx-module

这样用来打印信息,使用这个模块可以在nginx中使用echo string 变量等进行信息的调试

Attachments