一、CDN资料链接
CDN(Content Delivery Network),即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度和成功率。
控制时延无疑是现代信息科技的重要指标,CDN的意图就是尽可能的减少资源在转发、传输、链路抖动等情况下顺利保障信息的连贯性。
CDN就是扮演者护航者和加速者的角色,更快准狠的触发信息和触达每一个用户,带来更为极致的使用体验。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
二、Varnish资料链接
1.简介
Varnish是一款高性能、开源的反向代理服务器和缓存服务器。Varnish使用内存缓 存文件来减少响应时间和网络带宽消耗。这个项目是由挪威的一家报纸Verdens Gang的网络分支起始的,其架构设计和开发总监Poul-Henning Kamp是FreeBSD核心的开发人员之一,最初项目的管理与基础设施及额外开发由挪威一家Linux咨询公司Linpro提供。
说到varnish,squid就不得不提及。squid算得上是古老的缓存服务器。由于 varnish先进的设计理念,性能要比squid高上许多,varnish还可以通过端口进行管理,使用正则语句做到清除指定缓存的功能,这些squid都做不到。但是varnish在高并发的情况下,资源消耗较高,而且varnish服务进程一旦崩溃,重启,内存中的缓存数据将全部丢失。
缓存服务器的类型常用的有: memched、squid、varnish
2.工作原理
Management进程:
Management进程主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。 Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回 应,Management将会重启此Child进程。
Child进程:
Child进程包含多种类型的线程,常见的如:Acceptor线程:接收新的连接请求并响应;Worker线程:child进程会为每个会话启动一个worker线程,因此,在高并发的场景中可能会出现数百个worker线程甚至更多;
Expiry线程:
从缓存中清理过期内容;
Varnish依赖“工作区(workspace)”以降低线程在申请或修改内存时出现竞争的可能性。在varnish内部有多种不同的工作区,其中最关键的当属用于管理会话数据的session工作区。
日志:
为了与系统的其它部分进行交互,Child进程使用了可以通过文件系统接口进行访问的共享内存日志(shared memory log),因此,如果某线程需要记录信息,其仅需要持有一个锁,而后向共享内存中的某内存区域写入数据,再释放持有的锁即可。而为了减少竞争,每个 worker线程都使用了日志数据缓存。
共享内存日志大小一般为90M,其分为两部分,前一部分为计数器,后半部分为客户端请求的数据。varnish提供了多个不同的工具如varnishlog、varnishncsa或varnishstat等来分析共享内存日志中的信息并能够以指定的方式进行显示。
client--->dns--->cdn(--->server--->cdn--->)cache--->client ##如果cache中的age没有超时,则不用括号内的步骤
三、使用Varnish部署CDN节点集群
物理机环境: rhel6 selinux and iptables disabled
实验主机: 172.25.129.2 varnish
172.25.129.3 apache
192.25.129.4 apache
文件最大数:内核sysctl -a > 操作系统 /etc/sysconfig/varnish > 应用 /ect/security/limits.conf
nofile 最大文件数
memlock最大锁定内存地址空间
nproc 进程最大数目
1.varnish的部署
vim /etc/sysconfig/network ##修改hostname为server1
hostname server1
scp varnish3.0.5* root172.25.129.2 ##下载varnish安装包
在server1中:
yum install * -y ##安装下载的安装包
vim /etc/sysconfig/varnish ##将端口6381改为80
vim /etc/varnish/default.vcl
/etc/init.d/varnish restart
vim /etc/security/limits.conf
在server2中:
yum install httpd -y
/etc/init.d/httpd start
vim /var/www/html/index.html ##写入www.westos.org --server2
测试:在物理机中curl -I www.westos.org ##前提是/etc/hosts中有解析
ps:当server2的httpd服务关闭后,client可从缓存中获取apache服务,默认缓存时间(可在配置文件中修改)为120s,120s后连接关闭,Age=0
2.多个不同域名后端服务器的部署
配置好server3的ip 安装httpd并开启服务
vim /var/www/html/index.html ##写入内容www.westos.org --server3
在server1中:
vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.129.3";
.port = "80";
}
backend web2 {
.host = "172.25.129.4";
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") { ##^(www.)?表示加不加www都可以
set req.http.host = "www.westos.org";
set req.backend = web1;
} elsif (req.http.host ~ "^bbs.westos.org") { ##只能用这两个域名访问。其他都为eroor
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
/etc/init.d/varnish restart
测试:curl bbs.westos.org
3.缓存命中测试以及缓存的清除
curl -I www.westos.org
- 清除缓存
varnishadm ban.url .*$ ##清除所有
varnishadm ban.url /index.html ##清除 index.html 页面缓存
varnishadm ban.url /admin/$ ##清除 admin 目录缓存
ps:清除缓存后再次测试,age=0,首次为未名中
4.负载均衡
负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性
在server3中:注意打开基于域名的虚拟主机选项 NameVirtualHost *:80
vim /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
DocumentRoot /www1
ServerName bbs.westos.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName www.westos.com
</VirtualHost>
/etc/init.d/httpd restart
mkdir /www1
vim /www1/index.html ##写入www.westos.com --server3
在server1中:
vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.129.3";
.port = "80";
}
backend web2 {
.host = "172.25.129.4";
.port = "80";
}
director lb round-robin { ##定义负载均衡,lb为名称可以自定义
{ .backend = web1; }
{ .backend = web2; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb; ##使用负载均衡lb
return (pass); ##越过cdn直接访问根服务器,若不添加此项,cdn会在cache过期后才会访问另一台根服务器
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
/etc/init.d/varnish restart
在物理机中测试:
ps:若stop掉server2或server3的httpd,再测试时,会只访问正常的服务器,这就真证明了varnish具有自我健康检查的功能