CDN

CDN

CDN 即内容分发网络,没有 CDN 的时候,不管哪里的用户访问我们的站点,都需要到我们数据中心来获取数据(单纯的 DNS 过程)。而有了 CDN 之后,用户根据自己的地理位置会选择距离自己最近的缓存数据中心来获取数据。不会每次都到源站(应用服务器)来获取数据。

  • 提高页面加载速度:这是最显而易见的一个优势,通过上面的图,大家也可以直观感受下,用户访问距离自己最近的机器,速度肯定是最快的。并且网站的加载速度越快那么用户体验越优秀,你的网站更会受到对应用户的喜爱。至于如何实现就近访问的,后面原理部分介绍。

  • 增加内容的冗余:CDN 是一个典型的分布式架构,它通过增加数据的冗余,一方面保障在大流量面前有多台服务器能够提供相同的数据;另一方面当部分机器出现故障时,可以进行故障转移。

  • 节省带宽:如果大家自己买过云服务就知道,带宽每增加一点价格就飙升。使用 CDN 后,由于流量被分流了,那么原机器带宽要求自然就降低了。当然带宽费用降低了,你还需要为 CDN 付费。

  • 保障服务安全:CDN 可防止的攻击:DDOS 攻击,该攻击就是通过巨大流量打满你的带宽,让你丧失服务能力。那么由于 CDN 的存在,它将巨大的流量进行了分流。那么源站压力自然小了。这其实也是高并发需要考虑的。CDN 目前不仅仅是只能缓存静态的 HTML、CSS、JS、VIDEO,现在还有能够缓存动态接口内容的 CDN,这为我们在架构高并发的服务时,提供了更多的手段进行选择。

工作原理

在介绍 DNS 的时候,介绍了客户端是如何获取到 IP 地址的。那么有了 CDN 之后,这个过程该怎么处理呢?

CDN 其实就是放在应用服务器与用户之间的一层缓存。所以如果使用 DNS 的时候,返回给客户端的是 CDN 机器的 IP 而不是应用的 IP,那么自然就走到了 CDN 机器上。

为了实现上述目的,我们会为该域名配置一个 CNAME(大家注意上面提到的 CNAME 与 A 记录的优先级),那么这个 CNAME 是最终如何解析到对应的 CDN 机器呢?其实流程与 DNS 解析是一样的。当发现一个域名设置了 CNAME 时,DNS 解析器会继续解析这个 CNAME 别名(其实就是另一个域名)。对这个 CNAME 解析的时候会用到全局负载 DNS 解析,它会根据访问者的地理位置信息返回对应的 IP(CDN 机器的 IP)。因此客户端实际上得到的是距离它最近的 CDN 机器的 IP 地址。

如果说用户访问 CDN,但是 CDN 上没有对应内容会怎么办?此时 CDN 机器其实会根据自身专用的 DNS 解析服务,根据域名得到源站的 IP,然后向源站发送请求获取数据,并把这些数据缓存到本地,方便后续使用;同时返回本次结果,完成本次请求的访问。

需要说一下的是,CDN 其实也是分层的。距离用户最近的称之为边缘节点。而 CDN 的中心服务器集群被称为二级缓存。在上面就是应用部署的源站。一般边缘节点没数据就去找二级缓存,二级缓存没数据就去找源站(被称为回源)。