`

如何缓存万亿级别的html小文件

阅读更多

最近接到一个需求,需要对后面.Net产生的html静态文件做缓存,因为数量巨大,所以放弃了基于文件目录的存储方案,也是对.Net优化的重点。

常见于.Net开发的大型网站,应对高并发的情况。

缓存需要持久化,服务器意外重启后,不需要重新cache;

缓存在多台缓存服务器的内容是同步的,避免某台机器宕机造成的故障;

方案一采用lvs+两台Nginx+多台MongoDB+多台Memcached

因为lvs自动把用户请求负载到两台Nginx,所以缓存不能依靠Nginx自身的proxy_cache

此方案由“多台MongoDB+多台Memcached”组成两级Cache服务。

流程:

由.Net提交html文件至MongoDB,Nginx第一次读取文件取自MongoDB,缓存到Memcached,后续请求直接取自Memcached;

.Net更新/删除html文件至MongoDB,Nginx自动更新/删除Memcached;

存入memcached设置过期时间;

*考虑维护的工作量太大,简单采用了方案二,后期再过渡。

方案二采用lvs+两台Nginx\TT

详情待续...

目标

访问http://abc.hostname.com/1151/31678.html

如果缓存里面没有则代理访问到http://abc.hostname.com/shop/product.aspx?sid=1151&pid=31678&r=yes

一旦请求动态地址,即生成缓存,下次访问http://abc.hostname.com/1151/31678.html直接由缓存响应,不再由windows.Net响应;

此外需要提供一个清除缓存的接口:http://abc.hostname.com/capi/shop/product.aspxsid=1151&pid=31678&r=yes

(清除缓存注意sid前面没有问号)

================== 方案一的步骤 ===================

安装libevent和memcached,便于找到key,tt不支持stats cachedump x 0

1.先安装libevent。这个东西在配置时需要指定一个安装路径,即./configure --prefix=/usr/local;然后make;然后make install;
2.再安装memcached,只是需要在配置时需要指定libevent的安装路径即./configure --with-libevent=/usr/local;然后make;然后make install;
这样就完成了Linux下Memcache服务器端的安装。

//测试libevent是否安装成功:
# ls -al /usr/local/lib | grep libevent

//测试是否成功安装memcached:
# ls -al /usr/local/bin/mem*

安装TT

省略

找key步骤

#在Nginx里面切换缓存到memcached
stats items
stats cachedump 27 0
get key
#为了解key的格式

安装Nginx和必要的扩展

参考

nginx version: rhosync/0.9.52
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-52)
TLS SNI support disabled
configure arguments: --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/data/software/htmlcache/ngx_http_upstream_keepalive-d9ac9ad67f45 --add-module=/data/software/htmlcache/agentzh-memc-nginx-module-a0bc33a --add-module=/data/software/htmlcache/agentzh-srcache-nginx-module-921d9b2

开始漫长的调试配置

参考了(飞去来器,coding也是游戏)
http://fff.iteye.com/blog/697952

http://blog.s135.com/nginx_cache

http://labs.frickle.com/nginx_ngx_slowfs_cache/

待压力测试后附具体配置的下载地址和注释webmaster (#) rhomobi.com

keepalive single扫盲

keepalive

syntax keepalive num [single]

context upstream

Enables keep-alive connections for the upstream.

Num specifies the max number of connections to keep open before, if the max is reached it will close the least recently used connections.

Single treats everything as a single host. With this flag connections to different backends are treated as equal.

This module was tested to work with standard round-robin balancing, but it's believed to be compatible with more sophisticated balancers. The only requirement is to activate them before this module, e.g:

upstream htmlcache {
  server 10.0.0.1:11211;
  server 10.0.0.2:11211;
  ip_hash;
  keepalive 512;
}

HEADS UP: Description below is obsolete and needs editing. Keepalive connections to upstream servers are in the main code since 1.1.4, including the latest stable branch of 1.2.x. Check the documentation at nginx.org.

TT优化

大概测算按照现在每个缓存数据10K的大小计算

/usr/local/bin/ttserver -port 1978 -thnum 8 -dmn -pid /data/urlcache/ttserver.pid -log /data/urlcache/ttserver.log -le -ulog /data/urlcache/ -ulim 128m -sid 33 -mhost 10.10.10.33 -mport 1978 -rts /data/urlcache/ttserver.rts /data/urlcache/database.tch#bnum=500000

为什么放弃Nginx的文件缓存?

Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持404/301/302这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx模块,可以清除指定URL的缓存。

html文件数量太多,累计5G多,如果依靠nginx自身的文件缓存,每台nginx主机都会cache,有些浪费而且基于文件的IO存在瓶颈,不能很好发挥内存的作用。

附备忘

  我常用的Nginx 0.8.55版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge_v1.6模块(用于清除指定URL的缓存),已经可以完全取代Squid。

  在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为“负载均衡服务器”与“Web缓存服务器”来使用。
  
  1、Nginx 负载均衡与缓存服务器在 Linux 下的编译安装:

ulimit -SHn 65535
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.gz
tar zxvf pcre-8.00.tar.gz
cd pcre-8.00/
./configure
make && make install
cd ../

wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz
tar zxvf ngx_cache_purge-1.0.tar.gz

wget http://nginx.org/download/nginx-0.8.32.tar.gz
tar zxvf nginx-0.8.32.tar.gz
cd nginx-0.8.32/
./configure --user=www --group=www --add-module=../ngx_cache_purge-1.0 --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
cd ../

  2、/usr/local/webserver/nginx/conf/nginx.conf 配置文件内容如下:

user www www;

worker_processes 8;

error_log /usr/local/webserver/nginx/logs/nginx_error.log crit;

pid /usr/local/webserver/nginx/nginx.pid;

Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;

events
{
use epoll;
worker_connections 65535;
}

http
{
include mime.types;
default_type application/octet-stream;

charset utf-8;

server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;

sendfile on;
tcp_nopush on;

keepalive_timeout 60;

tcp_nodelay on;

client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;

#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path /data0/proxy_temp_dir;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

upstream backend_server {
server 192.168.8.43:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.8.44:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.8.45:80 weight=1 max_fails=2 fail_timeout=30s;
}

server
{
listen 80;
server_name www.yourdomain.com 192.168.8.42;
index index.html index.htm;
root /data0/htdocs/www;

location /
{
     #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
     proxy_next_upstream http_502 http_504 error timeout invalid_header;
     proxy_cache cache_one;
     #对不同的HTTP状态码设置不同的缓存时间
     proxy_cache_valid  200 304 12h;
     #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
     proxy_cache_key $host$uri$is_args$args;
     proxy_set_header Host  $host;
     proxy_set_header X-Forwarded-For  $remote_addr;
     proxy_pass http://backend_server;
     expires      1d;
}

#用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*)
{
 #设置只允许指定的IP或IP段才可以清除URL缓存。
 allow            127.0.0.1;
 allow            192.168.0.0/16;
 deny            all;
 proxy_cache_purge    cache_one   $host$1$is_args$args;
}    

#扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
location ~ .*\.(php|jsp|cgi)?$
{
     proxy_set_header Host  $host;
     proxy_set_header X-Forwarded-For  $remote_addr;
     proxy_pass http://backend_server;
}

access_log  off;
}
}

  3、启动 Nginx:

/usr/local/webserver/nginx/sbin/nginx

  4、清除指定的URL缓存示例:

补充写了工作备忘

  #proxy_next_upstream http_502 http_504 error timeout invalid_header;
  #proxy_cache pscms;
  #proxy_cache_valid 200 304 1h;
  #proxy_cache_valid 301 302 5m;
  #proxy_cache_valid any 1m;


 #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
 proxy_next_upstream http_502 http_504 error timeout invalid_header;
 proxy_cache cache_one;
 #对不同的HTTP状态码设置不同的缓存时间
 proxy_cache_valid  200 304 12h;
 #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
 proxy_cache_key $host$uri$is_args$args;
 proxy_set_header Host  $host;
 proxy_set_header X-Forwarded-For  $remote_addr;
 proxy_pass http://backend_server;
 expires      1d;


        location ~* \.(gif|jpg|jpeg|png|bmp|swf|js|css)(\?.*)$ {
            set $memc_cmd 'get';
            set $memc_key $uri;
            memc_pass jscache;
            error_page 404 = @jsfile404;
            }

location @jsfile{
    set $memc_cmd 'set';
    set $memc_key $uri;
     set $memc_exptime 24;
    proxy_pass http://www.wpadm.com:8080;
    memc_pass jscache;
}
分享到:
评论

相关推荐

    nginx静态文件缓存的解决方案1

    【Nginx 静态文件缓存解决方案】 Nginx 是一款高性能的 HTTP 和反向代理服务器,常用于处理静态资源,以减轻后端服务器的压力。为了进一步提高静态资源的访问效率,我们可以利用 Nginx 的缓存功能。下面详细介绍...

    缓存数据解析—很详细

    1. 静态文件缓存:服务器直接存储在内核级别的缓存,如IIS 6.0的HTTP.SYS管理的缓存,减少了从用户空间到内核空间的数据拷贝,提升了性能。 2. 动态缓存:处理动态生成内容的缓存,需要考虑数据的时效性问题。ASP...

    jsp 缓存处理

    2. **持久层缓存**:ORM框架如Hibernate提供了1级和2级缓存,1级缓存是Session级别的,2级缓存则是SessionFactory级别的。 3. **业务层缓存**:虽然较少直接设置,但在大型系统中,业务逻辑缓存能有效减少数据库交互...

    asp.net2.0缓存

    - **@OutputCache指令**:在页面级别设置输出缓存,指定缓存时间、依赖项等参数。 - **HttpRuntime.Cache对象**:在代码中直接操作全局缓存,添加、检索和移除缓存项。 - **SqlCacheDependency**:与SQL Server...

    asp.net缓存技术

    除了 OutputCache 外,ASP.NET 还支持内部缓存机制,它主要用于缓存应用程序级别的数据。内部缓存可以使用 `System.Web.Caching.Cache` 类来实现。 ##### 1. **添加缓存项** 添加缓存项的基本语法如下: ```csharp...

    缓存技术详解

    1. **动态页面静态化**:将动态生成的页面转换为静态HTML文件,减少服务器处理时间。 2. **Servlet缓存**:通过Servlet容器支持的缓存机制来缓存页面输出。 3. **OSCache Servlet缓存示例**:演示如何使用OSCache...

    asp.net缓存sql数据库

    1. **页面级别的缓存**:通过`OutputCache`指令在页面级别设置缓存,例如在`.aspx`或`.ascx`文件中添加`<%@ OutputCache %>`指令,指定缓存时间、依赖项等参数。 2. **方法级别的缓存**:对于特定的业务逻辑方法,...

    JAVA缓存技术_深入了解.ppt

    - **应用程序缓存**:应用级别的缓存,例如使用Ehcache、Guava Cache等第三方库实现的缓存。 - **Web服务器缓存**:如Apache的mod_cache或Nginx的HTTP caching模块。 - **客户端浏览器缓存**:浏览器自动缓存HTML、...

    缓存技术在视频网站中的应用

    除了页面级别的缓存,ASP.NET2.0还支持应用程序数据缓存,这允许开发者将常用但不常变的数据存储在内存中,比如热门视频列表、用户配置信息等。数据缓存可以设置过期策略,或者依赖性,当关联的数据库记录或文件发生...

    可缓存的分页控件

    `PageControls.ascx`是用户控件(User Control)的定义文件,通常包含HTML标记和服务器端控件,用于创建自定义的UI组件。`PageControls.ascx.cs`则是与之对应的代码隐藏文件,包含该用户控件的C#代码,用于实现业务...

    ASP_NET中Web页面缓存技术探讨

    除了页面缓存和局部页面缓存外,ASP.NET还支持数据缓存,即缓存应用程序级别的数据对象,以减少数据库访问的次数和提高应用的响应速度。 **3.1 使用Cache类** ASP.NET通过`System.Web.Caching.Cache`类提供了数据...

    java 缓存机制

    声明式缓存通常通过注解实现,如Spring框架中的`@Cacheable`、`@CacheEvict`等,这些注解使得开发者能够轻松地在方法级别启用缓存功能。`@Cacheable`注解用于标记一个方法,表示其结果应该被缓存,而`@CacheEvict`则...

    VB 清除IE缓存 源代码

    首先,IE浏览器的缓存存储着用户访问过的网页数据,包括HTML文件、图片、CSS样式表等,目的是为了提高网页加载速度。但是,这些缓存文件可能会占用大量磁盘空间,或者在某些情况下需要更新或保护用户的隐私,因此...

    PHP缓存技术[总结].pdf

    页面缓存是将整个HTML页面内容保存为文件,当用户请求时,系统首先检查是否有缓存页面,如果有则直接返回,无需再次生成。许多模板引擎和缓存类都支持这种功能,可以显著提升静态页面的加载速度。 3. 时间触发缓存...

    带二级缓存和业务封装的SSH项目源码

    在Hibernate中,一级缓存是每个Session级别的,而二级缓存是SessionFactory级别的,可以跨Session共享。这个项目中的二级缓存可能使用了EhCache或OSCache等第三方缓存解决方案,将经常访问的数据存储在内存中,减少...

    Android打开本地HTML网页AndroidStudio工程.rar

    这个"Android打开本地HTML网页AndroidStudio工程.rar"文件很可能包含了一个简单的示例项目,演示如何在Android应用中加载并显示本地HTML文件。这里我们将深入探讨实现这一功能所涉及的关键知识点。 1. **WebView...

    oscache缓存使用总结.doc

    其主要特点是配置简单,适用于页面级别的缓存管理。以下是对OSCache配置和使用过程的详细说明: 1. **下载与安装**: 首先,从官方网站http://www.opensymphony.com/oscache/download.html下载适合的OSCache版本。...

    上传文件到指定文件夹,共享数据和脚本,文件验证,脚本之间的通信

    - 文件系统共享,如写入/读取临时文件或缓存文件。 - 利用`$_SERVER['REQUEST_URI']`和`$_GET`/`$_POST`来获取不同页面的请求参数。 6. **数据库查询**:当需要从数据库检索文件信息时,使用`SELECT`语句配合`...

Global site tag (gtag.js) - Google Analytics