本文导读:
- 物流仓库配送如何加速
- 静态资源文件部署方式
- 静态资源加速之CDN技术
- 解析过程中的名词解释
- 最后的总结
1、物流仓库配送如何加速
我们还是从生活中购物的例子来展开。
将时光倒回到几年前,在那时候我的老家县城里,如果你从京东APP上购物下单,起码需要等上个几天时间,才能将商品送到你的手中。
因为他们的物流仓库中心当时并没有在县城里来建设,所以一般可能从地市或者省会(看做区域仓库)物流仓库去查找是否有库存,如果区域物流仓库还是没有库存,则可能会从北京物流仓库(看做中心仓库)发货,一旦中心仓库也无货,那就只能从厂商进货了(看做源站)。
但是,现在不一样了,不管你是身在一线城市还是在老家,从京东网站上购物(默认以自营商品为主)下单,基本隔天就能收到货了,快递小哥送货效率都是一样的。
这就是京东强大的物流优势,将物流仓库扩建到离老百姓最近的地方,使得用户购物体验得到了非常大的提升。
通过这个案例,我们就理解了商品送货的加速过程。
商品有普通商品,大件商品等,这些商品最开始都是备货到中心物流仓库,中心物流仓库可以认为是几乎是最全的商品仓库中心。
当区域物流仓库建设好之后,就可以将这些商品提前备货到区域仓库,进一步提高商品送达时间。
当仓库在县城里建设后,就可以将这些商品提前备货到县城仓库,只要仓库离你越来越近,你下单后不需要费那么大的周折,从区域或中心仓库发货了,甚至你都可以去当地仓库某个点上门自提了。
如下图所示:
县城仓库就是离用户最近的仓库,也就是在用户与中心仓库之间通过增加多级中间仓库,就近发货,加快送货速度,提升了用户体验。
2、静态资源文件部署方式
那么,如果在网络上,当你访问一个购物商城时,点击进入商品详情页,可以看到会有大量图片以及广告视频,这些都属于静态资源,那么这些静态资源用户是如何访问到的?
最开始,我们考虑部署个 Nginx 集群,每台机器上都会存储这些静态资源,可以通过某个服务将文件上传到其中一台机器,然后 rsync 方式分发到其他 Nginx 机器上。对于小的静态资源文件这么做没有问题。
但是,对于图片、视频这些资源可能从几M到几百M不等,是不建议放到 Nginx 集群上的,而且也不建议使用分布式缓存,分布式缓存本身也不建议存储过大的Key。假设你的确这么做了,把 Nginx 集群或者分布式缓存都部署在北京机房,当用户访问这些资源时,由于要经过多个骨干网络上的传输,会导致网络延迟高,给你在视觉上感觉就是图片无法加载,视频播放卡顿的现象。
此时,我想你也不会有兴趣在继续等下去了,对于电商网站来说用户就此流失了。
通常,我们可以将小的静态资源文件使用 Nginx 集群当做源站,而对于流媒体音视频数据,会使用单独的分布式存储作为源站。所谓源站,即你的静态数据原始存储的地方。为了达到高可用的、高稳定性的目的,结合企业成本考量,一般要部署成 BGP 多线机房。
BGP 机房示意图如下所示:
所谓的 BGP,它可以实现让网站在各运营商线路之间实现互联互通,做到所有互联运营商的用户访问网站都很快,结合用户网络选择最优质的网络链路。因此,BGP 机房带宽的成本更高。
BGP 机房带宽成本一般在80~400元/M,所以假设每 1M 流量按照 100元算,那么 1G 流量就是 10 万块的,如果是几十或者上百 G流量,这个成本可想而知了。
3、静态资源加速之 CDN 技术
在上面的案例中,我们知道了用户访问静态资源,会直接访问 BGP 源站,带宽成本是很昂贵的。一个网站用户会分布在全国各地,甚至是分布在全球,如何让用户更快的访问这些静态资源呢?
我们也可以借鉴物流仓库的例子来理解,跟物流仓库类似,当然是这些静态资源离用户越近,访问就越快了。由此,CDN 技术应运而生了。
什么是 CDN 技术?
CDN 的全称是 (Content Delivery Network/Content Distribution Network),即内容分发网络。CDN解决的问题是在网络中增加一层CACHE(缓存)层,将源站的资源分发到距离用户最近的网络"边缘"节点上,使用户就近访问内容,提高网站响应速度,避免网络拥塞,保证了用户访问资源的速度和体验。
增加 CDN 节点后,如下图所示:
CDN 的分发架构:
跟物流仓库做个类比:中心仓库物流就是相当于 CDN 中心节点,区域物流仓库相当于 CDN 区域节点,县城物流仓库中心就相当于 CDN 边缘节点。
CDN 分发架构示意图:
当前 CDN 技术应用是非常普遍的,有实力的公司,也会自建 CDN,而且有自己的CDN研发团队支撑,提供了更加稳定可靠的 CDN 服务。但是大多数公司,还是会选择专业的 CDN 厂商,如果你的服务部署在云上,可以选择阿里云、腾讯云提供的 CDN 服务。此外,还可以选择老牌的 CDN 厂商,如网宿和蓝汛。
CDN 工作原理
那么用户是如何访问到离他最近的 CDN 节点的呢?
我们还是用一张图来整体理解下,更加直观:
上述这张图解决了两个问题:
访问域名如何映射到 CDN 地址的
如何找到离用户最近的 CDN 节点
接下来,我们根据上面两个问题,结合图示来详解下这个流程。
1. 访问域名如何映射到CDN地址
当你通过浏览器访问 static.example.com 域名时,假设这就是个静态域名,并且做了 CDN 静态资源加速。
1)首先会经过本地 DNS 解析器,查看下本机 /etc/hosts 文件是否存在域名对应的IP,如果找到,直接使用该 IP 发起请求。否则,执行步骤2)。
2)由于本地 DNS 服务器解析,如果在本地 DNS 缓存中找到域名对一个IP,则直接用该 IP 访问。否则,继续步骤3)。
3)本地 DNS 服务器会向根域名服务器发起请求,根域名服务器返回顶级 DNS 域名服务器地址,让你去它那里查找。
4)本地 DNS 服务器会向顶级 DNS 域名服务器发起请求,.com 顶级域名服务器返回权威 DNS 域名服务器地址,让你去它那里查找。
5)本地 DNS 服务器继续向 example.com 权威 DNS 域名服务器发起请求,权威 DNS 域名服务器一看这个域名我能解析,发现是有做过CDN加速域名配置,它会 CNAME 到 static.xxx.example.cdn.com 域名。
到此,其实我们通过访问静态域名 static.example.com 经过一番波折,终于找到了 CDN 域名地址。
如果你不需要找离用户最近的节点,通过 static.xxx.example.cdn.com 域名就可以找到正确的 IP 地址了。
2. 如何找到离用户最近的 CDN 节点
结合上图,继续解析如果找到距离用户最近的 CDN 节点。
1)本地 DNS 服务器会将 static.xxx.example.cdn.com 会向第一层 GSLB 全局负载均衡发起请求,第一层全局负载均衡会根据用户所在运营商网络分析,比如移动运营商,返回 CNAME 到如 static.yd.example.cdn.com 域名地址。
2)本地 DNS 服务器会继续向第二层 GSLB 全局负载均衡发起请求,第二层全局负载均衡依据 DNS 地理位置判断,返回 SLB CDN 负载均衡地址。
3)本地 DNS 服务器从返回的多个 CDN 节点 IP 中,可以通过本地简单轮询的方式去选择一个 CDN IP 访问。
此时,最终通过 GSLB 全局负载均衡找到的这些 CDN 节点,就是离用户最近的 CDN 节点了。
3.什么是 GSLB?
GSLB(Global Server Load Balance),即全局负载均衡,它的含义是对于部署在不同地域的服务器之间做负载均衡。一方面可以让流量均衡负载到它下面的服务器上,另一方面能根据地理位置判断,找到离用户最近的服务器。
找到了离用户最近的 CDN 节点,并不一定能直接从该 CDN 节点上获取对应的资源,如果资源不存在,会继续从上级区域或中心 CDN 节点查找,如果都不存在,最终就会回源到源站获取资源,然后设置 CDN 缓存失效时间。
一般对于一些小的静态资源文件,存储在源站,由 CDN 节点主动拉取方式来访问的。
对于大的音视频流媒体文件,可以通过 CDN 厂商提供的接口提前将资源写入到 CDN 某一个节点上,再由 CDN 内部机制将资源分发到其他 CDN 节点上。
但是,即使主动同步资源,也是存在延时的,最终可能会导致回源,而回源带宽成本又是很大的。所以,我们在使用 CDN 的时候就有必要关注 CDN 命中率和源站带宽情况。
4、解析过程中的名词解释
CNAME( Canonical Name ):
它可以将一个域名解析到另外一个域名。
举个例子:
当你使用 docs.example.com 去访问一些资源时,希望通过 docs-xyz.example.com 也能访问相同的这些资源,你可以在 DNS 解析服务商添加一条 CNAME 记录,将 docs-xyz.example.com 指向 docs.example.com,添加后,所有访问 docs-xyz.example.com 的请求都会被转发到 docs.example.com 域名。
CNAME 域名:
接入 CDN 时,在 CDN 厂商控制台添加完加速域名后,会得到一个 CDN 给你分配的 CNAME 域名, 需要在你的 DNS 解析服务商添加 CNAME 记录,将自己的加速域名指向这个 CNAME域名,这样该域名所有的请求才会都将转向 CDN 的节点,达到加速效果。
DNS (Domain Name System):
域名解析服务。
将域名解析为网络上可识别的IP地址。服务器之间认识的都是IP,但用户习惯记忆的都是域名,所以域名与IP地址之间关系是一对一的。它们之间的转换工作,就称为域名解析,由专门的解析器来完成域名解析,可参见上述图中的 DNS 解析过程。
5、最后的总结
大家可能觉得作为一名工程师,离上述提到的 CDN 技术很遥远,忽略 CDN 技术的重要性,好像都是运维干的事情,与我何干。这个想法是错误的,咱们的思维不能太过于局限,如果你做一些直播、视频相关技术,多多少少肯定能接触到这块的技术。
你有没有考虑过抖音、快手上的短视频的整个流程,A城市用户上传视频后,经过转码分发后,B城市用户很快就能看到了,视频播放也是非常流畅,这其中也是得益于 CDN 分发技术的应用。
本文通过引入物流仓库的例子与 CDN 技术做个类比,对于 CDN 分发架构有了感官认识。
同时对 CDN 解析工作原理做了进一步剖析,大家通过 CDN 工作原理分析的那张图好好理解一下,里面包含了 DNS 解析的详细过程,DNS GSLB 是如何查找离用户最近节点的。
CDN 是各大系统的门面,更擅长缓存静态数据、图片、流媒体数据。CDN 作为一种特殊的缓存,它的命中率和高可用性也是我们需要重点关注的。