web服务器 网络加速 CND加速
人都有幸福的权利,但少数人有幸福的能力。
CDN主要由2部分组成:全局负载均衡和缓存系统;
这里的网络加速,主要将的是CDN加速;
为什么会出现CDN加速:
- 由于客观地理距离的存在,直连网站访问速度会很慢,所以就出现了CDN;
- CDN构建了全国、全球级别的专网,让用户就近访问专网里的边缘节点,降低了传输延迟,实现了网站加速;
- GSLB是CDN的“大脑”,使用DNS负载均衡技术,智能调度边缘节点提供服务;
- 缓存系统是CDN的“心脏”,使用HTTP缓存代理技术,缓存命中就返回给用户,否则就要回源。
什么是CDN?
专门为解决“长距离”上网络访问速度慢而诞生的一种网络应用服务。
三个关键词:“内容”“分发”和“网络”。
CDN能加速什么内容呢?
在CDN领域里,“内容”其实就是HTTP协议里的“资源”,比如超文本、图片、视频、应用程序安装包等等。
资源按照是否可缓存又分为“静态资源”和“动态资源”。
“静态资源”是指数据内容“静态不变”,任何时候来访问都是一样的,比如图片、音频。所谓的“动态资源”是指数据内容是“动态变化”的,也就是由后台服务计算生成的,每次访问都不一样,比如商品的库存、微博的粉丝数等。
很显然,只有静态资源才能够被缓存加速、就近访问;
动态资源只能由源站实时生成,即使缓存了也没有意义。不过,如果动态资源指定了“Cache-Control”,允许缓存短暂的时间,那它在这段时间里也就变成了“静态资源”,可以被CDN缓存加速。
CDN负载均衡
全局负载均衡(Global Sever Load Balance)一般简称为GSLB,它是CDN的“大脑”,主要的职责是当用户接入网络的时候在CDN专网中挑选出一个“最佳”节点提供服务,解决的是用户如何找到“最近的”边缘节点,对整个CDN网络进行“负载均衡”。
GSLB最常见的实现方式是“DNS负载均衡”;
原来没有CDN的时候,权威DNS返回的是网站自己服务器的实际IP地址,浏览器收到DNS解析结果后直连网站。
但加入CDN后就不一样了,权威DNS返回的不是IP地址,而是一个CNAME( Canonical Name )别名记录,指向的就是CDN的GSLB。它有点像是HTTP/2里“Alt-Svc”的意思,告诉外面:“我这里暂时没法给你真正的地址,你去另外一个地方再查查看吧。”
因为没拿到IP地址,于是本地DNS就会向GSLB再发起请求,这样就进入了CDN的全局负载均衡系统,开始“智能调度”,主要的依据有这么几个:
看用户的IP地址,查表得知地理位置,找相对最近的边缘节点;
看用户所在的运营商网络,找相同网络的边缘节点;
检查边缘节点的负载情况,找负载较轻的节点;
其他,比如节点的“健康状况”、服务能力、带宽、响应时间等。
GSLB把这些因素综合起来,用一个复杂的算法,最后找出一台“最合适”的边缘节点,把这个节点的IP地址返回给用户,用户就可以“就近”访问CDN的缓存代理了
CDN的缓存代理
缓存系统是CDN的另一个关键组成部分,相当于CDN的“心脏”。如果缓存系统的服务能力不够,不能很好地满足用户的需求,那GSLB调度算法再优秀也没有用。
有两个CDN的关键概念:“命中”和“回源”。
“命中”就是指用户访问的资源恰好在缓存系统里,可以直接返回给用户;
“回源”则正相反,缓存里没有,必须用代理的方式回源站取。
相应地,也就有了两个衡量CDN服务质量的指标:“命中率”和“回源率”。命中率就是命中次数与所有访问次数之比,回源率是回源次数与所有访问次数之比。显然,好的CDN应该是命中率越高越好,回源率越低越好。
怎么样才能尽可能地提高命中率、降低回源率呢?
- 最基本的方式就是在存储系统上下功夫,硬件用高速CPU、大内存、万兆网卡,再搭配TB级别的硬盘和快速的SSD。软件方面则不断“求新求变”,各种新的存储软件都会拿来尝试,比如Memcache、Redis、Ceph,尽可能地高效利用存储,存下更多的内容。
- 缓存系统也可以划分出层次,分成一级缓存节点和二级缓存节点。一级缓存配置高一些,直连源站,二级缓存配置低一些,直连用户。回源的时候二级缓存只找一级缓存,一级缓存没有才回源站,这样最终“扇入度”就缩小了,可以有效地减少真正的回源。
- 使用高性能的缓存服务,据我所知,目前国内的CDN厂商内部都是基于开源软件定制的。最常用的是专门的缓存代理软件Squid、Varnish,还有新兴的ATS(Apache Traffic Server),而Nginx和OpenResty作为Web服务器领域的“多面手”,凭借着强大的反向代理能力和模块化、易于扩展的优点,也在CDN里占据了不少的份额。