很多人都知道淘宝买菜吧,今天下单明天即可取货或者送货上门快速、高效的服务,很是深得人心,不管是买瓜果蔬菜,还是其他饮品都是很高效的服务。今天我们学习的CDN就是与这个有一定的关联。
我们在浏览网络的时候,其实就和以上这个过程十分相似,我们访问一个页面的时候,会向服务器请求很多网络资源,包括各种图片、声音、影片、文字等信息。这和我们要购买的多种货物一样。
就像淘宝买菜会把货物提前存储在建设在全国各地的本地仓库来减少物流时间一样,网站也可以预先把内容分发至全国各地的加速节点。这样用户就可以就近获取所需内容,避免网络拥堵、地域、运营商等因素带来的访问延迟问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
所以,"内容分发网络"就像前面提到的"全国仓配网络"一样,解决了因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度和成功率。
有了仓配网络之后,除了可以提升货物的配送效率,还有很多其他的好处:
1、首先通过预先做好了货物分发,使得最终货品从出仓到消费者手中的过程是比较短的,那么同城范围内可选择的配送公司就有很多选择,除了比较大的四通一达、顺丰以外,还可以选用一些小的物流公司、甚至直接调用饿了么的蜂鸟配送也不是不可能。
2、对于仓配系统来说,最大的灾难可能就是仓库发生火灾、水灾等自然灾害。如果把原来的一个集中式的大仓库打散成多个分布式的小仓库,分别部署在不同地区,就可以有效的减小自然灾害带来的影响。
既然知道CDN是个啥,我们在来了解一下它的工作原理。
内容传送网络(CDN)是全球分布的Web服务器或存在点(PoP)网络,其本身的主要目的就是加快用户打开网站的速读,增加用户体验感。
一般来说网站的内容被复制,然后分发到整个CDN之中。因此用户可以访问到距离自己地里位置最近的服务器上的复制内容,大大减少光缆传输所造成的延迟!这个与昔日所有数据放在一个云服务器上的方式有很大的区别。同时还能一定程度防止DDoS。
了解一下DDOS是啥:
分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。通常,攻击者使用一个偷窃帐号将DDoS主控程序安装在一个计算机上,在一个设定的时间主控程序将与大量代理程序通讯,代理程序已经被安装在网络上的许多计算机上。代理程序收到指令时就发动攻击。利用客户/服务器技术,主控程序能在几秒钟内激活成百上千次代理程序的运行。这个时候就需要负载均衡,高可用来即时的解决问题。
更简单地说,CDN的目的是改善用户体验并为其提供更有效的网络资源利用率。媒体公司和电子商务供应商等内容提供商向CDN运营商付费,以向其受众(即最终用户)提供其内容。反过来,CDN向ISP,运营商和网络运营商支付费用,用于在其数据中心托管服务器。有两种关键机制可以解释CDN的功能:
1、将重要内容分发到多个全球分布的数据中心,使其更接近最终用户,从而加快下载速度。
2、使用基于内容类型的服务器优化来最有效地将该内容提供给用户。
3、除了更好的性能之外,CDN还可以卸载直接从内容提供商的原始基础设施提供的流量,从而可以为内容提 供商节省成本。
4、位置是内容交付速度的关键。用户离存储内容的服务器越远,内容到达用户所需的时间越长,这反过来又会对用户体验产生负面影响。
CDN架构的模型
优势包括降低带宽成本,缩短页面加载时间或提高内容的全局可用性。构成CDN的节点和服务器的数量根据架构而变化,其中一些节点在许多远程存在点(PoP)上有数万个节点,其中有数万个服务器。其他人建立了一个全球网络,并拥有少量的地理PoP。
CDN节点通常部署在多个位置,通常在多个主干上。优势包括降低带宽成本,缩短页面加载时间或提高内容的全局可用性。构成CDN的节点和服务器的数量根据架构而变化,其中一些节点在许多远程存在点(PoP)上有数万个节点,其中有数万个服务器。其他人建立了一个全球网络,并拥有少量的地理PoP。
有三种主要类型的内容:
动态内容:Web服务器使用几种常见的Web编程语言(如php,ruby或java)动态生成的内容。
静态内容:通常不会经常更改且不需要生成的内容。图像,CSS和JavaScript等
流媒体内容:通过Web浏览器控件播放的视频或音频文件。
CDN架构的搭建:
varnish介绍:
1 . varnish: 是一款具有高性能的开源http加速器,具有反向代理、缓存功能。Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存。Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失。
2 . varnish 如何工作: varnish主要存在两个进程,manage进程及child进程,manage 进程:更新配置,vcl 文件编译,varnish 监控,初始化 varnish 及提供 varnish 管理接口。child 进程:主要进行请求任务的处理,接受请求等。child 进程中各线程的处理任务:
accept 线程: 监听端口,接受连接;接受连接后组成 session 结构,查看是否有空闲线程,若有则分配给其处理,若无,则检查等待队列 overflow 的大小,若过大,则抛弃请求,否则加入 overflow 队列。
work 线程: 从 overflow 队列中获取任务, 走 Varnish 状态机流程处理任务,完成后通过 pipe 的线程通信,传递给 epoll 线程,等待下一个事件触发。
epoll 线程:将事件发送时对应的 session , 放入 overflow 队列,以供 work 线程从中取出继续处理。当然,在等待事件发送时,会检查该 session 是否过期。
expire 线程:对以二叉树形式组织的缓存对象,进行过期检查,对过期的对象进行处理(更新或者弃用。
CDN分布式网络的实现。
三台虚拟机,同时关闭防火墙等。
代理服务器:192.168.10.128
后端资源服务器:192.168.10.129
客户端物理机:192.168.10.139
代理服务端安装:
yum install varnish-4.0.5-1.el7.x86_64.rpm varnish-libs-4.0.5-1.el7.x86_64.rpm jemalloc-3.6.0-1.el7.x86_64.rpm -y
1)安装后检查varnish安装的配置文件是否生成。
2)查看varnish的服务文件
vim /usr/systemd/system/varnish.service
Varnish打开的最大文件数限制为131072
Varnish锁定的共享内存大小为82M
3)查看本机系统最大文件访问数量
我们需要在外面更改自己的内存,在虚拟机外面更改2G,然后在重新启动
4)全局临时更改共享内存及最大文件数
ulimit -n 131072 ##临时更改更改最大文件数
ulimit -l 82 ##临时更改更改最大共享内存
ulimit -a ##查看用户限制
5)编辑varnish用户的限制文件
vim /etc/security/limits.conf ##将最大文件访问数以及锁定的内存大小、单个用户的最大线程数写入文件最后
6)修改varnish服务端口
vim /etc/varnish/varnish.params 更改端口为80
7)varnish主配置文件中指定后端服务器
vim /etc/varnish/default.vcl 指定后端服务和端口
这里的host 就是自己的后端资源服务器,重启varnish服务 systemctl restart varnish
2,设置后端服务器 192.168.10.129
yum install httpd -y 安装阿帕奇
cd /var/www/html 进入目录中
vim index.html 编辑内容,随后重启阿帕奇
(在上面我们设置的后端服务器的端口是80,我们在阿帕奇里也要设置自己的端口是80 vim /etc/httpd/conf/httpd.conf)
3,测试:使用物理机直接访问代理服务器
Varnish缓存命中情况:
作为varnish代理端,在配置文件中添加了后端服务器的ip及端口,在访问代理端的时候实际是在访问后端服务器,则第一次访问会产生缓存,下一次访问的时侯则由缓存服务器直接响应客户端需求,减少延时。
修改配置文件,在缓存数据时发送信息给客户端(查看缓存命中情况),根据数据是来自后端服务器还是来自缓存的内容,返回不同的消息给客户端主机。
vim /etc/varnish/default.vcl
if (obj.hits>0){
set resp.http.X-Cache="HIT Via "+" "+server.ip ;
}else {
set resp.http.X-Cache="MISS Via "+" " + server.ip;
}
在代理服务器上对varnish缓存进行清理:
varnishadm ban req.url "~" / # 清理所有的缓存
varnishadm ban req.url "~" /index.html # 对指定文件的缓存进行清理
使用客户主机进行测试缓存命中情况:
第一次访问的时候不存在缓存内容,数据
由后端服务器获取
再次访问的时候已经有了缓存数据,命中缓存。