CDN简介
CDN(Content Delivery Network)是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
搭建CDN系统可以选择3种主流方案:
squid
varnish
Nginx+memcache
这里选用varnish搭建CND节点集群。
网站的基本访问方式
如果varnish上面没有缓存
client -> /hosts/dns -> varnish -> 服务器-> varnish -> client
如果varnish上面有缓存
client -> /hosts/dns -> varnish -> client
varnish简介
Varnish是一款高性能的开源HTTP加速器,Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存。
Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失。
Varnish可以有效降低web服务器的负载,提升访问速度。根据官方的说法,Varnish是一个cache型的HTTP反向代理。
Varnish 处理 HTTP 请求的过程如下
-
Receive 状态(vcl_recv):也就是请求处理的入口状态,根据 VCL 规则判断该请求应该 pass(vcl_pass)或是 pipe(vcl_pipe),还是进入 lookup(本地查询);
-
Lookup 状态:进入该状态后,会在 hash 表中查找数据,若找到,则进入 hit(vcl_hit)状态,否则进入 miss(vcl_miss)状态;
-
Pass(vcl_pass)状态:在此状态下,会直接进入后端请求,即进入 fetch(vcl_fetch)状态;
-
Fetch(vcl_fetch)状态:在 fetch 状态下,对请求进行后端获取,发送请求,获得数据,并根据设置进行本地存储;
-
Deliver(vcl_deliver)状态:将获取到的数据发给客户端,然后完成本次请求;
Varnish与Squid的对比
相同点
-
都是一个反向代理服务器;
-
都是开源软件;
Varnish的优势
-
Varnish的稳定性很高,两者在完成相同负荷的工作时,Squid服务器发生故障的几率要高于Varnish,因为使用Squid要经常重启;
-
Varnish访问速度更快,因为采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取,而squid是从硬盘读取,因而Varnish在访问速度方面会更快;
-
Varnish可以支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快,因而在高并发连接情况下可以支持更多TCP连接;
-
Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的;
-
squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以可以合理的使用所有核来处理相应的请求;
Varnish的劣势
-
varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力;
-
在varnish使用中如果单个url的请求通过HA/F5等负载均衡,则每次请求落在不同的varnish服务器中,造成请求都会被穿透到后端;而且同样的请求在多台服务器上缓存,也会造成varnish的缓存的资源浪费,造成性能下降;
varnish运行的两类进程:management进程和child/cache进程。
management进程作用:
编译VCL书写的策略,应用新的配置,初始化varnish,监控child进程,提供管理接口
management进程间隔数秒探测child进程,若timeout时间内没有获得回应,会重启child进程。
management提供的管理接口有三种:命令行接口和telnet远程接口,还有gui图形接口(要收费的)。
child/cache进程作用:
使用accept线程:接收新的连接请求并响应
使用worker线程:child为每一个会话启用一个worker线程,在高并发场景中会有多个worker线程存在。
使用expiry线程:从缓存中清理过期的内容
使用Log/stats线程:管理日志
使用command line线程:管理接口
使用storage/hashing线程:管理存储
使用backend communication线程:管理后端主机
Varnish搭建CDN节点集群
部署环境:
三台redhat6.5版本虚拟机+一台物理机;
server1:172.25.81.1
server2:172.25.81.2
server3:172.25.81.3
Client:172.25.81.250
主机环境:rhel6.5 selinux 和iptables 都必须是disabled状态
一.Varnish服务器的搭建及配置
Client:172.25.81.250
Varniah节点机:(Server1)172.25.81.1
Apache服务器:(Server2)172.25.81.2
Server1配置:
<1>下载并安装varnish软件包
[root@foundation81 Desktop]# scp varnish-* root@172.25.81.1:~
root@172.25.81.1's password:
varnish-3.0.5-1.el6.x86_64.rpm 100% 444KB 443.8KB/s 00:00
varnish-libs-3.0.5-1.el6.x86_64.rpm 100% 42KB 41.6KB/s 00:00
[root@server1 ~]# ls
anaconda-ks.cfg varnish-3.0.5-1.el6.x86_64.rpm
install.log varnish-libs-3.0.5-