网站的一般访问模式:访问一个网站的时候->指定这个网站的域名->DNS 将域名解析为地址->用户请求这个地址,返回一个网页
那这里面还有没有可以优化的地方呢?
例如你去电商网站下单买个东西,这个东西一定要从电商总部的中心仓库送过来吗?
原来基本是这样的,每一单都是单独配送,所以你可能要很久才能收到你的宝贝。但是后来电商网站的物流系统学聪明了,他们在全国各地建立了很多仓库,而不是只有总部的中心仓库才可以发货。当然,这里面也有个难点就是,生鲜这类东西保质期太短,如果提前都备好货,但是没有人下单,那肯定就坏了。
同理访问网站,有些信息也没必要必须从原服务器获取,可以在数据中心缓存数据,用户访问数据的时候,就可以从就近的数据中心访问了
网站访问可以借鉴“就近配送”这个思路
在数据中心里部署几台机器,形成一个缓存的集群来缓存部分数据,那么用户访问数据的时候,就可以就近访问了。些分布在各个地方的各个数据中心的节点,就称为边缘节点。
边缘节点数目多但是每个集群规模较小,不可能缓存下来所有东西,因而可能无法命中资源。在边缘节点之上,还有区域节点,规模就要更大,缓存的数据会更多,命中的概率也就更大。在区域节点之上是中心节点,规模更大,缓存数据更多。如果还不命中,就只好回源网站访问了。
上图就是CDN 的分发系统的架构。CDN 系统的缓存,也是一层一层的,能不访问后端真正的源,就不打扰它。
客户端如何找到相应的边缘节点进行访问呢?
没有CDN 的情况
上图中虚线部分
- 用户向浏览器输入 www.web.com 这个域名
- 客户端访问本地 DNS 服务器。本地 DNS 服务器有缓存,则返回网站的地址;如果没有,本地 DNS 服务器进行DNS递归查询到网站的权威 DNS 服务器,权威 DNS 服务器返回 IP 地址。
- 本地 DNS 服务器缓存下 IP 地址,将 IP 地址返回
- 客户端直接访问这个 IP 地址,就访问到了这个网站。
有了CDN的情况
上图中实线部分
- 用户向浏览器输入 www.web.com 这个域名
- 客户端访问本地 DNS 服务器。本地 DNS 服务器访问权威 DNS 服务器,web.com 这个权威 DNS 服务器上,会设置一个 CNAME 别名,指向另外一个域名 www.web.cdn.com,返回给本地 DNS 服务器。
- 本地 DNS 服务器拿到这个新的域名进行解析,
- 这个时候,DNS 服务器再访问的就不是 web.com 的权威 DNS 服务器了,而是 web.cdn.com 的权威 DNS 服务器这是 CDN 自己的权威 DNS 服务器。
- CDN权威 DNS 服务器还是会设置一个 CNAME,指向另外一个域名,也即 CDN 网络的全局负载均衡器,返回给本地DNS服务器
- 本地 DNS 服务器去请求 CDN 的全局负载均衡器解析域名
- 全局负载均衡器会为用户选择一台合适的缓存服务器提供服务并将IP返回给本地DNS服务器
- 本地 DNS 服务器缓存这个 IP 地址,然后将 IP 返回给客户端
- 客户端去访问这个边缘节点,下载资源。
- 缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
全局负载均衡器会为用户选择一台合适的缓存服务器其选择的依据包括:
- 根据用户 IP 地址,判断哪一台服务器距用户最近;
- 用户所处的运营商;
- 根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需的内容;
- 查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。
CDN 可以进行缓存的内容
在进入数据中心的时候通过最外层接入层的缓存,将大部分静态资源的访问拦在边缘。而 CDN 则更进一步,将这些静态资源缓存到离用户更近的数据中心外。越接近客户,访问性能越好,时延越低。
流媒体也大量使用了 CDN,对于流媒体,预先缓存,也可预先推送到用户的客户端。很多 CDN 还提供预处理,如转码等。解决防盗链问题,防止流媒体被盗走。
对于静态页面,多采用主动推送模式,将热点数据推送到边缘节点。
然而比如在电商仓库中,有关生鲜的缓存就是非常麻烦的事情,这对应着就是动态的数据,比较难以缓存。怎么办呢?现在也有动态 CDN,主要有两种模式。
1、边缘计算的模式
(生鲜超市模式),既然数据是动态生成的,所以数据的逻辑计算和存储,也相应的放在边缘的节点。定时从源数据那里同步存储的数据,在边缘进行计算得到结果。
2、路径优化的模式
(冷链运输模式),数据不是在边缘计算生成的,而是在源站生成的,但是数据的下发则可以通过 CDN 的网络,对路径进行优化。CDN 节点较多,能够找到离源站很近的边缘节点,也能找到离用户很近的边缘节点。中间的链路完全由 CDN 来规划,选择一个更加可靠的路径,使用类似专线的方式进行访问。
更多CDN相关可以看下下面几篇英文文章
What is a CDN?
https://www.cloudflare.com/learning/cdn/what-is-a-cdn/
CDN Performance
https://www.cloudflare.com/learning/cdn/performance/
CDN SSL/TLS | CDN Security
https://www.cloudflare.com/learning/cdn/cdn-ssl-tls-security/
CDN Reliability & Redundancy
https://www.cloudflare.com/learning/cdn/cdn-load-balance-reliability/
参考资料:
趣谈网络协议(极客时间)链接:
http://gk.link/a/106nW
GitHub链接:
https://github.com/lichangke/LeetCode
知乎个人首页:
https://www.zhihu.com/people/lichangke/
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习