CDN基础
基本常识网络缓存技术,其目的就是减少网络中冗余数据的重复传输,使之最小化,将广域传输转为本地或就近访问。互联网上传递的内容,大部分为重复的Web/FTP 数据,Cache 服务器及应用Caching
基本常识
网络缓存技术,其目的就是减少网络中冗余数据的重复传输,使之最小化,将广域传输转为本地或就近访问。互联网上传递的内容,大部分为重复的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 # 服务器输出的机器名
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
,# 只允许本地强制删除缓存对象
acl purgemethod method PURGE
# 允许本地管理缓存端口
acl manager proto cache_object
always_direct allow dstdm # 请求转发到目的主机
never_direct allow !dstdm # 无效请求不转发
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 链接。