Introduction
CDN(Content Delivery Network或Content Distribute Network),中文叫内容分发网络,是一种利用数学运算法则来处理内容的动态路由算法技术。它在当下的互联网环境中被广泛使用,作用也非常明显。在这篇博客我将简单分享CDN技术。
Why CDN
要认识CDN,我们首先要知道CDN解决了什么问题,先来看看在没有CDN之前,我们遇到了什么问题。
现在大家都喜欢追剧、看直播,假设有1千万人在大年三十晚上一起用一个视频APP看春晚,如果大家看的清晰度是1080p(大约是4Mpbs的带宽),那么对于服务器来说累计的流量带宽就需要10,000,000 * 4Mbps = 40Tbps
。
对于服务器来说这个带宽是什么概念呢?PC的网卡一般是1Gbps的带宽,而服务器现在比较贵的就是万兆网卡,是10Gbps的带宽。假设这个视频APP很有钱,服务器全都用万兆网卡,那么它就需要4000块万兆网卡,而且这些网卡必须要百分百跑满,才能让1千万用户比较流畅地看。
这里面的风险在哪?第一,这里我们只讨论的是1千万的用户,对于春晚来说,用户数量肯定是远超这个数量级的;第二,这里我们的清晰度是1080p,很多用户的要求远远不止这个清晰度;第三,4000块万兆网卡非常贵,同时还必须跑满,如果有部分出问题了,就会影响很大部分的用户;第四,这里的服务器还需要考虑突发流量的问题。
解决这个问题有几个方法,第一是服务提供商进行负载均衡,或许可以缓解一些压力,但是流量出口的压力还是不能有效减少;第二种就是CDN了。
What is CDN
我尝试用现实生活的一个例子去说明CDN的基本理念。双十一购物节大家从A电商买了好多东西,假设A商城的仓库在北京,我在广州买了东西,那么我的快递就要先从北京的仓库发出,然后千山万水送到。有没有一种更加快的方式呢?答案是显然的,如果A电商在全国几个大城市设立自己的仓库,预先把这些商品放到分布在各地的仓库,那么当我在广州购买的时候,直接可以从附件的仓库发出,这样早上下单我可能下午就收到了,这个就是CDN的思想。
CDN的核心理念是将内容缓存在终端用户的附件,通过在终端用户附件建立缓存服务器,把远端的内容缓存一份在服务器上。因为这里把原来在服务器的内容复制了到了缓存服务器上,所以这里就叫分发。
具体地说,整个CDN机制是通过尽可能部署多的缓存服务器(CDN边缘节点)在用户密集的地方,当终端用户访问资源时,通过全局负载技术,优先将用户的访问导流到距离最近的缓存服务器。
这里需要区分缓存服务器和镜像服务器。镜像服务器是对源服务器的完全拷贝,拥有和源服务器完全一样的资源;而缓存服务器只缓存部分的内容。
How CDN works
在这一部分我们来看看CDN在用户的整个请求中是怎么样工作的,先给图,然后再一步一步分析。
- 当用户在自己的终端发起请求时,会根据请求的URL到本地的DNS寻求IP地址解析(目的是通过域名换取对应的服务器ip地址);
- 本地DNS会把这个域名的解析权交给CDN专用DNS服务器;
- CDN专用DNS服务器会把一个全局的负载均衡设备的IP地址返回给用户;
- 用户拿到这个负载均衡设备的IP地址,去用刚刚的URL请求这个设备;
- CDN负载均衡设备根据请求来源的IP地址,以及请求的内容,选择一台与用户距离较近的缓存服务器;
- CDN负载均衡设备告诉用户这台缓存服务器的IP地址;
- 用户拿到缓存服务器的IP地址后,直接向这个缓存服务器请求,并在本地的DNS缓存这个服务器的IP地址,下次走到本地DNS时就可以直接使用了;缓存服务器响应用户的请求,返回内容;
- 如果CDN缓存服务器没有用户请求的内容,它回到网站的源服务器请求;
- 源服务器返回内容给缓存服务器,缓存服务器把内容返回给用户,并缓存一份在自己本地。
Pros and Crons
大致了解了CDN的工作过程后,我们可以对CDN技术的优缺点做一下分析和总结。
优点:CDN的优点就是加速用户的请求访问速度,提升用户的使用体验。其次,CDN在安全方面还有好处。用户的请求直接指向CDN的缓存服务器,这样对拼皮了源服务器的IP地址,能够有效降低源服务器被攻击的概率,同时当源服务器短时间不可用时(故障、维护),用户的访问可以不受影响。
缺点:CDN的优点为我们解决了访问延迟的问题,但是它也有一定的限制。其一,CDN缓存的只能是静态资源,对于动态的内容如用户的实时交互数据,是不能缓存的;其二,有些服务提供商为了保证他们的数据的私密性,会不允许第三方公司的CDN服务器缓存他们的数据;其三,部署CDN缓存服务器需要很多钱,覆盖的区域越多,耗费的资源越多,但是实际的利用率可能很低,这其中就会有一定程度的浪费。
Summary
CDN目前已经广泛地应用在了我们日常的生活中,包括我们看视频,浏览各种网页等,对于coder来说,CDN也非常常见,比如要使用某些依赖包时,直接访问源服务器可能速度非常慢,为了加快加载速度,常常会替换成国内的CDN源。CDN的一些基本情况就和大家分享到这里,谢谢你的支持!