zoukankan      html  css  js  c++  java
  • CDN网络(二)之配置和优化CDN核心缓存软件--squid

    前言

    squid是众多CDN厂商使用的核心缓存软件,都在已有的基础上进行二次开发。在部署squid的时候,建议遵循下面的规范。

    1. 使用大内存服务器

    对于热点文件,我们让squid用内存缓存,这样大大提高响应速度,访问日志access_log中体现为TCP_MEM_HIT。我们一般都是64g内存以上的服务器。

    2. 推荐每个磁盘单独使用

    对于仅次于热门文件的文件,我们采用磁盘缓存,squid是基于磁盘缓存的,不需要把磁盘设置成RAID 10 or RAID 5之类的,通过cache_dir配置使用每个独立磁盘进行 缓存以提高磁盘iops,配置参数如下:

    cache_dir   ufs   /mnt/sdb1 8096 32 256
    
    3. 禁用atime更新

    使用noatime,nodiratime来挂载文件系统。这样在读取磁盘缓存的时候不会更新相应的inode访问时间。在/etc/fstab中的配置指令如下:

    /dev/sdb1  /data/cache1   ext3   noatime,nodiratime 0 0
    
    4. 配置多实例

    所谓多实例就是启动多个squid进程。因为squid以单进程运行,对多CPU的架构支持不好,不能够重复利用多CPU处理器,配置多实例的时候,需要注意的是配置文件的部分参数;
    visible_hostname、unique_hostname、http_port、snmp_port、access_log、cache_log、pid_filename、cache_dir。以上参数必须不同。

    5. 使用URL作为调度算法

    在配置squid的时候,采用URL作为hash算法,优点如是增加缓存命中率,相同的URl会访问到squid的同一台服务器或者同一个实例上。避免重复回源和重复缓存同样的文件,提高缓存命中率。

    6. 禁用缓存间的通信协议

    缓存间的通信协议设计初衷就是为了架构缓存集群,尽量减少对源站的访问。目前有以下缓存间通信协议和方法:ICP,HTCP,Cache Digest,wccp,wccp2。从实践来看,缓存间通信协议会导致缓存响应的延时,同时不利于问题的排错,因此建议关闭缓存通信协议。禁用的方式就是在编译安装squid的时候添加以下参数

    --disable-icap-client --disable-wccp --disable-wccpv2 --disable-htcp --disable-ident-lookups --disable-auto-locale --enable-ltdl-convenience
    
    7. 构建二级缓存

    所谓的二级缓存就是在CDN边缘节点回源的时候先往CDN的核心节点获取内容,也就是这样的架构: CDN边缘squid ---> CDN核心squid ---> 源站 。 CDN核心squid就是边缘squid的上一级缓存,一级和二级缓存节点之间不使用缓存通信协议,直接使用HTTP进行内容获取后缓存。

    8. 使用squid Manager 获取运行状态

    squid manager 提供了对squid运行状态的详细信息展示通道,在配置文件配置后就可以使用该功能,配置参数如下:

    acl manager proto cache_object   # 安装好后默认配置就有。
    cachemgr_passwd 123..aa config reconfigure shutdown
    http_access allow manager localhost
    http_access deny manager   # 运行状态信息不缓存,默认配置就有。
    

    配置完成后,重启squid,在使用如下命令查看下squid信息
    当前运行状态

    [root@localhost ~]# squidclient -h 127.0.0.1 -p 3128 mgr:info     #3128是squid 的默认端口
    '''
    Cache information for squid:      # 重点关注cache信息
    	Hits as % of all requests:	5min: 0.0%, 60min: 0.0%
    	Hits as % of bytes sent:	5min: -0.0%, 60min: -0.0%
    	Memory hits as % of hit requests:	5min: 0.0%, 60min: 0.0%
    	Disk hits as % of hit requests:	5min: 0.0%, 60min: 0.0%
    	Storage Swap size:	0 KB
    	Storage Swap capacity:	 0.0% used,  0.0% free
    	Storage Mem size:	104 KB
    	Storage Mem capacity:	 0.0% used, 100.0% free
    	Mean Object Size:	0.00 KB
    	Requests given to unlinkd:	0
    '''
    

    当前配置

    [root@localhost ~]# squidclient -h 127.0.0.1 -p 3128 -w 123..aa mgr:config     #-w(小写w)指明看squid配置中的manager密码
    
    9. 优化http range

    Http range方法提供了允许客户端只获取某个静态文件部分内容的能力,典型的Range请求的头部信息如下:

    GET /test.rar HTTP/1.1
    Connection: close
    Host: file.ljf.info
    Range: bytes=1025-2048
    

    上述头部信息是说:客户端想获取http://file.ljf.info/test.rar 的文件从1024字节到2048字节的部分内容,这种请求方式在多线程下载器(如迅雷,快车),通过多线程分别获取同一个URL的不同部分然后组合起来,可以提高下载速度。
    在squid中,我们可以下面这个指令控制HTTP Range 请求的缓存:

    range_offset_limit 
    

    我在工作中,根据squid回源流量进行调整,在刚上线的一台squid服务器,一般设置为0,0表示所有都存。这样的情况下根据服务器负载的网络流量跑个几天再调调这个参数。
    个人建议配置以下经验值以平衡Range请求和缓存整个文件之间效率问题。

    range_offset_limit 3 MB
    

    这样的配置后,如果用户请求的起始Range字节的在3MB以内,如果squid本地没有缓存过这个文件,那么squid就会向后端请求整个文件,然后再进行缓存。如果Range起始范围超过了3MB,那么squid也是用range向后端请求,此时文件不会被缓存。

    如有问题请与本人联系,18500777133@sina.cn

  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6057502.html
Copyright © 2011-2022 走看看