亿级吞吐第二战-CDN内容分发
CDN(Content Delivery Network)
内容分发网络是一种构建在现有网络基础上的智能虚拟网络,依靠部署在全球各地的节点,通过负载均衡、内容分发、机器调度等功能,使用户的请求能够被分发到离自身最近的节点处理,就近获取所需的资源,最终达到提升用户访问速度以及降低服务器访问压力等目的。
CDN
出现的本质是为了解决不同地区用户访问速度不一致问题,在之前的《TCP/IP》文中曾提到过,网络上的数据传输本质上最终都会依赖于物理层的传输介质,那么当用户和目标服务器的"实际地理距离"越长,访问的速度自然会越慢,而CDN
的核心就在于:各地区都会部署子节点,当用户访问时,会将其请求分发到距离最近的节点处理,就好比生活中的例子:
某个想吃北京烤鸭的人身在美国,最初仅北京有相应的店铺,因此想吃的时候必须得跑到北京去买,那么这一去一回的过程自然会需要很长时间,而
CDN
的思想就是在各地都开分店,好比美国也有北京烤鸭的分店,当某个用户想吃时,不再需要跑到北京去买,而是可以直接选择就近的店铺进行购买,这样速度自然会更快。
2.1、CDN分发的内容
通常一个平台的资源都会分为静态与动态两种类型,而CDN
本质上是一种类似于缓存的技术,缓存必然会存在延迟性,对于会经常发生变化的动态资源,使用CDN
意义并不大,因为CDN
无法确保数据的实时性。
由于静态资源很少发生变更,所以CDN
一般会用于静态资源的分发,如果你要使用CDN
服务,国内有大量的CDN
提供商提供这类服务,当购买CDN
服务后,将静态资源传给CDN
服务,那么这些静态资源将自动的被分发到提供商全球各地的CDN
节点。
2.2、CDN实现原理
在系统接入CDN
服务并将静态资源传递给CDN
后,那么当用户再访问系统时,对应的一些请求就会被分发到距离用户最近的CDN
节点处理,但这究竟是如何实现的呢?接下来简单聊一聊。
一般用户发送请求都是通过域名去进行访问的,域名最终会被解析成一个
IP
,那么如何解析出一个距离用户最近的服务器IP
,这是普通的DNS
服务器做不到的,因此CDN
为了实现这点,需要特殊的DNS
服务器去解析域名请求,该DNS
服务器需要解决两个问题:①需要得知用户目前的所在位置。
②
CDN
所有节点中,哪个节点离用户最近。
对于上述两个问题,第一个问题可以直接从用户的请求中提取客户端IP
,然后根据IP
去判断,可以将IP
解析为上海电信、北京移动等,从而能够确定用户的大概位置。
第一个问题容易找到答案,但实现CDN
请求分发的难点在于第二个问题:如何确定距离用户最近的CDN
节点 。这时就需要用到DNS
解析中的CNAME
机制了,DNS
域名解析主要会分为两种:
- ①将一个域名解析为一个具体的
IP
,这种方式被称为A
记录机制。 - ②将一个域名解析为另一个域名,这种方式就被称为
CNAME
机制。
在CDN
中,这个CNAME
会被配置为CDN
专用DNS
服务器的域名地址。
某个用户通过域名static.xxx.com
请求静态资源时,这个域名会映射着一个CNAME
,例如cdn.xxx.com
,当普通的DNS
服务器收到用户的static.xxx.com
域名请求后,经过解析得到一个CNAME
,该CNAME
对应的则是CDN
专用的DNS
服务器,那么会将域名解析工作转交给该DNS
服务器处理,CDN
专用DNS
服务器对cdn.xxx.com
域名解析,根据服务器上记录着的所有CDN
节点信息,选出距离用户最近的CDN
服务器地址并返回给用户,最后用户就可通过该地址访问距离自己最近的CDN
节点。
上述这个过程也被称为智能
DNS
解析技术。
2.3、CDN带来的优势
大致聊了CDN
分发原理后,再来思考思考CDN
的引入能够给系统带来哪些好处呢?
- ①加快用户的访问速度,带来更好的用户体验感。
- ②分担系统
50%
以上的访问流量,降低系统的负载压力。 - ③节省系统源站的带宽消耗,降低网络带宽的成本。
- ④进一步提升系统安全性,大部分攻击请求会被
CDN
节点阻挡。
从上看来,系统接入CDN
服务后带来的收益很大,就算原本的系统访问速度很慢,在接入CDN
后也能够快速加载,对于用户而言体验感会进一步提升,并且最关键的是:对于网站整体而言,几乎90%
以上的静态请求会由CDN
去响应,系统源站能够减轻很大的访问压力,从而能够确保系统本身拥有更大的"动态请求"吞吐能力。