搭建自己的 CDN 的乐趣和好处

如你所见,我也喜欢页面能快速加载,越快越好.但在我们开始讨论之前,先要有一个清楚的认知:CDN 并不是万能的.如果因为糟糕的前端工作导致你的网站变慢,CDN 并不能帮到你太多,你需要先做好前端工作.但一旦你已经做好了所有的优化,就需要来研究一下内容传输这块了.

我碰到的主要问题是即使能通过一次 HTTP 请求来完成初始网站的加载,但因为我的服务器托管在法兰克福,在澳大利亚的人仍需要等待2-3秒后才能访问到它.超过300ms的往返延时和中间大量的服务提供商使得页面加载就跟 Wordpress 网站一样慢.

那如何解决这个问题呢? 一种解决方案是使用传统的 CDN.然而大多数商业 CDN 在从服务器请求到数据之后,都会缓存一段时间.

由于 CDN 的存在,在内容获取上稍微绕行了一下,导致在使用传统 CDN 之后,初始页面的加载反而变慢了.如果你的网站流量高,内容一直缓存着,这没什么大问题.但反过来说,如果和我一样仅仅是运行一个小博客,内容并不会常驻缓存,传统的 pull-CDN 反而会让网站变得更慢.当然,我也可以通过 push-CDN 直接上传内容,但跟我要搭建的 CDN 相比,这种成本要昂贵许多.

CDN 是如何工作的?

我们的方案很明确:为了扩大世界影响力,我们应该保证内容在任何位置都能被快速访问.这意味着内容所在位置应该尽量靠近访问者.方便的是,很多云服务商在多个地区都提供了廉价的虚拟服务器.我们是否仅需要把内容放到比如6台服务器上,就万事大吉了呢?

好吧,没那么快.那如何把用户路由到正确的服务器上呢?我们看一下实际访问网站的过程.首先,浏览器通过 DNS 查询网站的 IP 地址,获取到 IP 之后,就可以连接网站并下载请求的页面.

上层的解决方案其实很简单:需要一台智能 DNS 服务器,对请求的IP 做 GeoIP 查询并返回离它最近的 IP 地址.事实上,几乎所有的商业 CDN 都是这么做的.虽然还牵扯到许多工程学领域的内容,比如延迟测量等,但基本原理还是这个.

让 DNS 服务器快起来

接下来新的问题出现了:如何让 DNS 服务器快起来?从最近节点上访问网站仅仅解决了一半问题,如果 DNS 查找不得不绕行地球一周,还是会有极大的延迟.

事实证明,支撑互联网的基础设施非常适合解决这个问题.网络提供商使用边界网关协议来相互告知可连接的网络和跃点的多少.多数情况下,最终互联网提供商会采用最短路线来到达目标地址.

如果在多个位置使用一个 IP 地址,DNS 总是会路由到最近的节点,这就是 BGP Anycast.

为何网站下载不使用 BGP Anycast?

如果能做到,我们为何不简单使用 BGP 来路由网络流量呢?主要有三个原因.

首先,使用 BGP Anycast 需要在网络硬件上做控制,并且需要一个至少包含256个 IP 地址的池子,这超出了我们的预算.

其次,BGP 路由并不那么稳定.不同于 DNS 请求仅仅只需要向两个方向发送单个数据包,HTTP web 请求需要创建一个连接来下载内容.期间如果路由改变或者连接不稳定,HTTP 连接就会断开.对这种规模的工程来说反而增加了很多复杂性.

最后,跃点作为 BGP 路由计算基础,它数目的减小并不能保证往返延迟的减小.一个跨大洋的跃点可能仅仅是一个跃点,但却是时间最长的一个.

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180302A0791N00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券