基本常识
网络缓存技术,其目的就是减少网络中冗余数据的重复传输,使之最小化,将广域传输转为本地或就近访问。互联网上传递的内容,大部分为重复的Web/FTP 数据,Cache服务器及应用Caching技术的网络设备,可大大优化数据链路性能,消除数据峰值访问造成的结点设备阻塞。
cache服务器具有缓存功能,所以大部分网页对象(Webpageobject),如html、htm、php等页面文件,gif、tif、 png、bmp等图片文件,以及其他格式的文件,在有效期(TTL)内,对于重复的访问,不必从原始网站重新传送文件实体,只需通过简单的认证(FreshnessValidation)-传送几十字节的Header,即可将本地的副本直接传送给访问者。由于缓存服务器通常部署在靠近用户端,所以能获得近似局域网的响应速度,并有效减少广域带宽的消耗。
高速缓存服务器(CacheServer)是软硬件高度集成的专业功能服务器,主要做高速缓存加速服务,一般部署在网络边缘。根据加速对象不同,分为客户端加速和服务器加速,客户端加速Cache部署在网络出口处,把常访问的内容缓存在本地,提高响应速度和节约带宽;服务器加速,Cache部署在服务器前端,作为Web服务器的前置机,提高Web服务器的性能,加速访问速度。
如果多台Cache加速服务器且分布在不同地域,需要通过有效地机制管理Cache网络,引导用户就近访问,全局负载均衡流量,这就是CDN内容传输网络的基本思想。
CDN的全称是ContentDeliveryNetwork,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络”边缘”,使用户可以就近取得所需的内容,解决Internet网络拥塞状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,解决用户访问网站的响应速度慢的根本原因。
CDN工作原理
用户访问未使用CDN缓存网站的过程为:
1)、用户向浏览器提供要访问的域名
2)、浏览器调用域名解析函数库对域名进行解析,以得到此域名对应的IP地址
3)、浏览器使用所得到的IP地址,向域名的服务主机发出数据访问请求
4)、浏览器根据域名主机返回的数据显示网页的内容
用户访问使用CDN缓存网站的访问过程:
1)、用户向浏览器提供要访问的域名
2)、浏览器调用域名解析库对域名进行解析,由于CDN对域名解析过程进行了调整,所以解析函数库一般得到的是该域名对应的CNAME记录,为了得到实际 IP地址,浏览器需要再次对获得的CNAME域名进行解析以得到实际的IP地址;在此过程中使用全局负载均衡DNS解析,如根据地理位置信息解析对应的 IP地址,使得用户能就近访问
3)、此次解析得到CDN缓存服务器的IP地址,浏览器在得到实际的IP地址以后,向缓存服务器发出访问请求
4)、缓存服务器根据浏览器提供的要访问的域名,通过Cache内部专用DNS解析(一般通过host文件解析)得到此域名的实际IP地址,再由缓存服务器向此实际IP地址提交访问请求;
5)、缓存服务器从实际IP地址得得到内容以后,先在本地进行保存,用做缓存,然后把获取的数据返回给客户端,完成数据服务过程;
6)、客户端得到由缓存服务器返回的数据以后显示出来并完成整个浏览的数据请求过程。
F5产品资料
在3DNS的每个WideIP中,可以选择三种算法,这三种算法按照预定的优先级进行排列。
在通常情况下,选择RTT动态计算方法作为系统的优选算法,即所有的LocalDNS请求均被3DNS计算其就近性,以保证绝大部分用户访问的最优化性。而Topology算法则作为RTT动态计算的补充算法,在RTT计算方式没有结果的时候,将用户请求定义到其本网的线路上。 GlobalAvailability算法作为系统的默认算法,将所有无法计算结果并且不在Topology范围之内的LocalDNS请求,定义到系统的默认线路上。
RTT算法运行机制:
通过3DNS的RTT就近性算法会自动运算生成一个ldns就近分布表,通过这个动态的表,每个客户上来都会提供一个最快速的链路进行访问,由于站点有 ISP1和ISP2的两条广域网线路。在3DNS上会针对站点服务器(以www.f5.com.cn为例)解析ISP1和ISP2的两个不同的公网地址。
对应于www.f5.com.cn域名,在3DNS上配置wideip:www.f5.com.cn,对应两个 VirtualServer:VS1:202.106.83.177,VS2:219.17.66.100。分别属于ISP1和ISP2两条线路分配的 IP地址段。在3DNS内部,同时定义两个DataCenter分别与ISP1和ISP2相对应。
(1)首先向其所在运营商的LocalDNS发起www.f5.com.cn域名的DNS请求。步骤2
(2)运营商的LocalDNS服务器通过递归算法查找到工行的主、辅DNS服务器。步骤3和4。
(3)接受到请求的3DNS首先查询在本地是否有该LocalDNS的就近性表项,如果存在,则直接给LocalDNS返回速度最快的服务器地址。如果不存在,则通知另外一台3DNS发起对该LocalDNS的查询。步骤5。
(4)两台3DNS分别对LocalDNS进行Probe。例如ISP1侧3DNS查询该LocalDNS的RTT时间为150ms,而ISP2侧 3DNS查询同一LocalDNS的RTT时间为300ms,则此时在两台3DNS内都形成了该LocalDNS的对应就近性表记录。
(5)接受到LocalDNS请求得3DNS根据系统的就近性表返回相应的DataCenter内的WEB服务器地址。步骤6。
(6)在用户LocalDNS获得地址后,将该地址返回给用户。步骤7
(7)用户向www.f5.com.cn网站发起访问。步骤8。
通过以上流程可以看出,通过动态计算方式,可以最为准确的估算出用户LocalDNS与两条线路之间的速度。通过3DNS之间的信息交互,在两台3DNS上形成就近性表,并根据该表返回用户的最佳访问地址。
DNS_Dot:向localDNS发起一个包含”.”的测试,也就是向目标LocalDNS请求root清单,该解析一般默认配置的DNS服务器均提供支持。
DNS_REV:向localDNS发起LocalDNS本机IP的PTR请求
UDP:发起一个UDP的包,看是否回应
TCP:发起一个TCP的包看是否回应
ICMP:发起一个ICMP的ping包,看是否回应
在以上各检测方式中,无论目标系统返回那种类型的数据包,3DNS均可认为是有效数据包而记录数据包往返时间,最终形成就近性表。
公司CDN架构
由一台全局负载均衡器F5和分布在全国8个节点的CacheServer组成,提供页面访问加速与下载加速功能。
序号 名称 功能 机房
1 F5 负载均衡器 北京电信通
2 CDN-BZ CACHESERVER 山东网通
3 CDN-CS CACHESERVER 江苏电信
4 CDN-CX CACHESERVER 云南电信
5 CDN-CZ CACHESERVER 河北网通
6 CDN-HZ CACHESERVER 浙江电信
7 CDN-NC CACHESERVER 四川电信
8 CDN-NN CACHESERVER 广西电信
9 CDN-SY CACHESERVER 辽宁网通
Squid安装配置
squid对硬件要求不算高。内存是最重要的资源。内存短缺会严重影响性能。磁盘空间也是另一个重要因素。更多的磁盘空间意味着更多的缓存目标和更高的命中率。快速的磁盘和驱动器也是有利的。当然快速的CPU也是好的,但它并不是提高性能的关键因素。
squid对每个缓存响应使用少数内存,因此在磁盘空间和内存要求之间有一定联系。基本规则是,每G磁盘空间需要32M内存。这样,512M内存的系统,能支持16G的磁盘缓存。内存需求依赖于如下事实:缓存目标大小,CPU体系(32位或64位),同时在线的用户数量,使用的特殊功能。
1、更改操作系统最大打开文件数
# echo “102211″ > /proc/sys/fs/file-max
# vi /etc/sysctl.conf 加入以下一行
fs.file-max = 65535
# vi /etc/security/limits.conf 加入以下两行
* hard nofile 65535
* soft nofile 65535
# vi /etc/rc.local 加入以下一行
ulimit -HSn 65535
重新启动后,使用# ulimit ?a 检查一下open files是否与所设置对应。
2、目录划分
/usr/local/squid 指定安装目录
/var/squid/var/logs 日志目录
/cache缓存目录,单独一块硬盘
3、软件版本与安装
#./configure ?prefix=/usr/local/squid
?enable-async-io=20 ?enable-kill-parent-hack ?enable-poll ?enable-snmp
?disable-icmp ?disable-arp-acl ?disable-delay-pools ?disable-mem-gen-trace ?disable-ident-lookups ?disable-useragent-log
解释
?enable-async-io=20 使用squid异步I/O技术,提升存储性能,aufs模块使用18个线程来执行磁盘I/O操作
?enable-kill-parent-hack
?disable-icmp squid能利用ICMP消息来确定回环时间尺寸
?disable-arp-acl ARP访问控制列表
?disable-delay-pools 延时池是squid用于传输形状或带宽限制的技术。
?disable-mem-gen-trace
?disable-ident-lookups ident是一个简单的协议,允许服务器利用客户端的特殊TCP连接来发现用户名。
?disable-useragent-log 可选的useragent.log包含来自客户端请求的User-Agent头部值。
4、/usr/local/squid/etc/squid.conf
visible_hostname JL-CC01 # 服务器输出的机器名
http_port 80 vhost
cache_effective_user squid # 运行squid服务的用户
cache_mgr cdn@vale.com.cn #squid管理员邮件地址
pid_filename /usr/local/squid/var/logs/squid.pid
coredump_dir /cache
icp_port 0 #取消对代理阵列的支持
hosts_file /etc/hosts # 定义hosts文件位置
half_closed_clients off
client_lifetime 8 hours
##ACL###
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
#定义IP地址段
acl all src 0.0.0.0/0.0.0.0
acl lan src 192.168.1.0/24
acl localhost src 127.0.0.1/32
#定义目的(原始)主机表,存储IP地址
acl dstnetwork dst ‘/usr/local/squid/etc/src_ip’
#定义目的域名表,存储域名
acl dstdm dstdomain ‘/usr/local/squid/etc/dstdomain’
# 定义端口
acl SSL_ports port 443 563
acl Safe_ports port 21 # ftp
acl Safe_ports port 80 81 # http
acl Safe_ports port 443 563 # https, snews
#acl Safe_ports port 70 # gopher
#acl Safe_ports port 210 # wais
#acl Safe_ports port 1025-65535 # unregistered ports
#acl Safe_ports port 280 # http-mgmt
#acl Safe_ports port 488 # gss-http
#acl Safe_ports port 591 # filemaker
#acl Safe_ports port 777 # multiling http
#定义协议
acl http proto HTTP
# 只允许仅允许加密请求到端口443、563
acl CONNECT method CONNECT
http_access allow CONNECT SSL_ports
http_access deny CONNECT
# 只允许本地强制删除缓存对象
acl purgemethod method PURGE
http_access allow purgemethod localhost
http_access deny Purge
# 允许本地管理缓存端口
acl manager proto cache_object
http_access allow manager localhost
http_access deny manager
always_direct allow dstdm # 请求转发到目的主机
never_direct allow !dstdm # 无效请求不转发
http_access deny !http # 禁止访问非http协议
http_access deny !safe_ports # 禁止访问非安全端口
http_access deny !dstdm # 禁止访问非目的主机
http_access allow dstnetwork # 允许访问目的域
http_access allow lan # 允许局域网主机访问
http_access deny all # 禁止所有地址访问
client_persistent_connections off
server_persistent_connections off
logformat common %>a %ui %un [%tl] “%rm %ru HTTP/%rv” %Hs %
cache_dir aufs /cache 20480 16 256
# 缓存目录,存储机制默认是ufs,这里是aufs,目录在/cache,一级目录16个,二级目录256,20G空间使用,建议将一块硬盘空间单独用做缓存,保留10%空间存放swap.state文件和临时文件。
access_log /var/squid/var/logs/access.log squid
# 访问日志存储在/var/squid/var/logs/
cache_log /var/squid/var/logs/cache.log
# cache.log包含多种消息,例如配置信息、性能警告、以及严重错误
cache_store_log /var/squid/var/logs/store.log
# 存储或删除cache目标的日志,位置在/var/squid/var/logs/
logfile_rotate 1
cache_mem 512 MB # squid使用内存大小,建议为系统内存的1/2
maximum_object_size 100 MB # 最大缓存对象为100M
minimum_object_size 0 KB # 最小缓存对象为0K,意思是无限制。
maximum_object_size_in_memory 1024 KB
cache_swap_low 80 # 缓存磁盘空间使用基准,低于80%不会删除缓存对象
cache_swap_high 90 # cache_swap_high在目前版本没有太大作用
refresh_pattern -i \/$ 15 90% 600 reload-into-ims
refresh_pattern -i \.html$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nwe$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nwo$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nwf$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nvi$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nmv$ 15 90% 60 reload-into-ims
refresh_pattern -i \.nwx$ 15 90% 60 reload-into-ims
refresh_pattern -i \.htm$ 15 90% 600 reload-into-ims
refresh_pattern -i \.shtml$ 15 90% 600 reload-into-ims
refresh_pattern -i \.vhtml$ 30 90% 600 reload-into-ims
refresh_pattern -i \.hml$ 15 90% 600 reload-into-ims
refresh_pattern -i \.php$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.asp$ 15 90% 600 reload-into-ims
refresh_pattern -i \.jsp$ 1440 90% 8640 reload-into-ims
refresh_pattern -i \.gif$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.swf$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.jpg$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.png$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.bmp$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.js$ 120 90% 600 reload-into-ims
refresh_pattern -i \.css$ 120 90% 600 reload-into-ims
refresh_pattern -i .wma 1440 90% 21600 reload-into-ims
refresh_pattern -i .zip 1440 90% 21600 reload-into-ims
refresh_pattern -i .mp3 1440 90% 21600 reload-into-ims
refresh_pattern -i .rar 1440 90% 21600 reload-into-ims
refresh_pattern -i .rm 1440 90% 21600 reload-into-ims
refresh_pattern -i \.flv$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .WMV$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .ui$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .exe$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .unix$ 1440 90% 21600 reload-into-ims
refresh_pattern -i .suc$ 1440 90% 21600 reload-into-ims
# -i 不区分大小写,最小存活时间1440,最大存活时间21600,最后修改系数比例90%,reload-into-ims检查LM-factor百分比之前先检查min值。
注:最低和最高时间限制之间的响应, 遵循最后修改系数 (LM-factor)算法。squid计算响应的年龄和最后修改系数,然后将它作为百分比值进行比较。
基于LM-factor计算过期时间
squid缓存某个目标3个小时(基于Date和Last-Modified头部)。LM-factor的值是50%,响应在接下来的1.5个小时里是存活的,在这之后,目标会过期并被当作过时处理。假如用户在存活期间请求cache目标,squid返回没有确认的cache命中。若在过时期间发生请求,squid转发确认请求到原始服务器。
squid的refresh_pattern算法的简单描述:
假如响应年龄超过refresh_pattern的max值,该响应过期;
假如LM-factor少于refresh_pattern百分比值,该响应存活;
假如响应年龄少于refresh_pattern的min值,该响应存活;
其他情况下,响应过期。
5、squid常用命令
# /usr/local/squid/sbin/squid ?z
初始化cache目录,建立新的CACHE目录后需要执行,另外需要squid用户对此目录拥有权限。
# /usr/local/squid/sbin/squid -k parse
在启动squid之前,你应该谨慎的验证配置文件。
# /usr/local/squid/sbin/squid ?Ds
启动squid。禁止初始化DNS测试。正常情况下,squid直到验证它的DNS可用才能启动。将日志记录到syslog进程
# /usr/local/squid/sbin/squid -k shutdown
停止squid。
# /usr/local/squid/sbin/squid -k rotate
滚动日志。
# vi /etc/rc.local
ulimit -HSn 102211
/usr/local/squid/sbin/squid -Ds
/usr/local/apache2/bin/apachectl -k start
# crontab ?e
0 */8 * * * /usr/local/squid/sbin/squid -k rotate # 每8小时回滚日志一次
0 */12 * * * /usr/sbin/ntpdate 210.72.145.44 && clock ?w # 每12小时校正时钟一次
6、业务系统问题解决
问题:缓存不同步
现象:不同地区显示页面不一致
解决:在8台cache服务器手工刷新缓存,由业务部门提供有问题的URL链接。
# /usr/local/squid/bin/squidclient ?m purge ?u squid ?g squid http://
squidclient 常用命令
取得squid运行状态信息: squidclient -p 80 mgr:info
取得squid内存使用情况: squidclient -p 80 mgr:mem
取得squid已经缓存的列表: squidclient -p 80 mgr:objects
取得squid的磁盘使用情况: squidclient -p 80 mgr:diskd
强制更新某个url:squidclient -p 80 -m PURGE http://www.yejr.com/static.php
更多的请查看:squidclient -h 或者 squidclient -p 80 mgr:
7、squid业务监控
目前是手工监控。主要监控服务状态和磁盘空间、squid日志情况。后期实现cacti对服务状态、磁盘空间进行自动监控。
# netstat ?nlp ?t
查看80端口是否正常
# df ?h
查看磁盘空间是否正常
参考资料
squid中文权威指南 http://www.php-oa.com/books/squid/chap01.html
squid 官方站点http://www.php-oa.com/books/squid/chap01.html
原文链接:http://www.careerman.cn/?p=192