[TOC]
web性能-CDN架构介绍和优化
CDN的中文全名是内容分发网络,其功能是将内容“发布”到离用户最近的服务器上,有效地避免网络拥塞(越远的距离越容易遇到拥塞)。
大型网站一般分布较广,用户地域跨度大,而网站机房的位置离用户的距离有远有近,CDN提供就近访问的能力,消除了由于用户离机房的距离不一样带来的体验差异,是大型网站不可缺少的基础组件,CDN的优化对于提供高性能的用户体验起到了关键的作用
CDN对于一个大型网站而言,主要提供了4种能力
- 静态加速能力
通过本地化缓存加速能力给用户提供一个尽力而为的就近访问的高性能访问架构,将用户访问的内容缓存在边缘节点上,消除由用户地域差异而导致的用户体验不一致,提供不同地区用户的相对一致的高性能访问体验。 - 减轻源站压力
CDN将资源缓存在它的服务器上,访问是在用户和CDN之间进行的,原来用户的直接请求都发送到网站服务器上,移交到 CDN 上后,源站的访问量和带宽占用都会大幅度减小。- 特别是对大型电商网站而言,图片等静态资源占了网站所有请求的90%以上。服务器要提供具备相应吞吐能力的服务,其架构设计、运维规划、监控和预警要十分完善,否则很容易出现稳定性问题。
- CDN的命中率对于减小源站的压力十分关键。总而言之,CDN的存在大大减小了源站的压力,提高了网站的稳定性。
- 防攻击能力
一般比较成熟的 CDN 提供商至少有数百个 CDN 节点,甚至数千个,而把资源放在 CDN上,对网站的恶意攻击大部分都会将目标放到CDN节点上,CDN是一个天然的跨地区甚至跨洲的大型分布式系统。大量CDN节点的存在,可以有效地将攻击由中心化分散到CDN的边缘上,从而有效地阻止或者减小攻击造成的危害 - 资源预取
CDN 如果能获取网页的 HTML,就可以实现资源预取- 获取网页的HTML后,CDN服务器会将HTML中的图片、CSS和JS标签的资源提前预取到 CDN 的边缘节点上,等浏览器下载序列到相对应的资源时,边缘节点上已经存在该资源,从而避免回源站处理并获取资源,减少性能损耗。
CDN相关术语解析
- 边缘服务器(Edge Sever)
对于边缘服务器,CDN提供了就近访问的能力,边缘服务器节点就是实际提供给用户就近连接、访问的服务器。 - CDN命中率 (也叫:卸载率 Offload Rate,卸载源站的压力)
CDN命中的概率即CDN命中率。
CDN 一般提供的是静态加速能力,是通常通过缓存架构来实现
CDN 命中指的是CDN服务器有该资源缓存存在,请求到达CDN节点时,CDN服务器可以在本地缓存获取资源直接返回给客户端,如果没有命中,则需要通过CDN节点到源站获取资源。 - 回源
当CDN没有命中缓存时,需要到源站去获取资源,这个过程称为回源,回源需要从CDN节点层层代理访问,最终到源站获取资源。 - 中间层服务器(Midgress Server)
边缘节点比较分散,因此存在缓存穿透的问题。为了避免回源引起的性能大幅下降,在CDN的中间层服务器中将多个CDN节点的访问进行收敛,从而大幅提高命中率。
从应用看CDN的基本原理
CDN基本架构:用户访问图片的一般路径如下:
- 在DNS Lookup时,由全局负载均衡器调度将离用户近的节点发给用户的浏览器。
- 浏览器与CDN的边缘节点建立TCP连接,并将请求发送给边缘服务器。
- 如果边缘服务器没有命中缓存,会将请求代理给CDN的L1 Cache节点。
- 如果CDN的L1 Cache服务器也没有命中,会将请求继续发送给源站。
- 注:CDN L1 Cache节点通常将相邻的几个CDN节点的请求进行收敛,当同一资源在一个节点预热过,又从另外一个节点访问时,可以在L1 Cache层命中缓存,避免回到源站去获取资源,从而避免性能大幅下降。
- 源站接收请求,并通过源服务器的处理,给CDN L1 Cache服务器响应,直到最终将响应逐层返回用户端浏览器。
简单地说,用户浏览器获取图片或者静态资源的一般过程是,先通过 CDN 的全局负载均衡器的调度获取离用户“最近的”CDN节点的VIP(虚拟IP),并建立TCP连接,发送请求给CDN的边缘节点,如果在CDN节点上没有命中缓存,请求会逐步传递给最终的源服务器,并最终由源服务器回应给用户浏览器,并在各个CDN节点上建立各自的本地缓存。
CDN全局调度
CDN全局调度的基本结构和全局负载均衡器的实现原理比较简单,它能够接收在域名查询请求时,根据用户IP地址的(Local DNS)来源,返回给Local DNS和用户IP地址区域匹配的CDN边缘节点的VIP。
- 通常一个地区有两个CDN集群节点,两个CDN节点同时给不同的用户提供服务(容灾和负载均衡)。为了防止DNS Cache过长,导致一个节点过载,通常CDN节点的TTL控制在一分钟以内,当一个节点发生问题时,可以在较短的时间内切换到另外一个节点。
- CDN服务原则是就近调度,但有些时候厂商还是要考虑成本问题。比如CDN提供商在美国有数千集群,而在乌克兰和中国台湾才20个节点,为了节省成本和容量,有些流量会调度给美国的CDN节点。
全局调度器从本质上说是一个智能的DNS解析工具,无非是做得更加智能、功能更加强大
- 全局调度器的基本结构如图:
CDN优化参考
- 尽早了解CDN的基本工作原理
- 尽早了解license的细节,比较不同服务等级license的差别
CDN提供商提供的license版本很多,需要和售前人员清晰地了解license提供的功能和SLA的细节,这样可以综合ROI(Return on Investment 投资回报率)多方面来确定使用哪个版本,也可以对某些高级功能进行测试和线上效果实测。 - 做好上线前的测试验证工作
测试验证工作,需要有比较健全的功能验证流程。在沟通过程中,经常遇到各种口头“承诺”,双方在口径和理解上存在一定的误差。- 例如在WebP性能优化的项目中,首先笔者和售前人员沟通了方案的可行性,准备将WebP格式的图片上线替换JPG格式的图片,售前人员说这是可行的,即CDN提供商有能力缓存WebP格式的图片。上线测试时,我们发现性能并没有好转,一直猜测是由于上线新格式图片的范围太小,导致热度不够,热点不突出,最终导致命中率降低而引起的。后来去源站查看,发现WebP格式的图片大量回源,而且几乎每次访问都产生了回源,再跟售前人员进行沟通,发现是配置没有启用。其实发生过多次类似的问题,如前面提到的命中率超低的问题也是配置不正确引起的,这些问题都需要做好沟通和测试工作。
- 尽早做好监控规划
细化监控对于发现问题非常关键,监控还需要做一定的规划,针对主要的域名最好做细分。针对不同类型的命中率需要分开监控,根据命中率从低到高的排行数据,能够对回源站的请求进行归类和分析 - 避免全量发布新图片格式
在使用 CDN 的过程中命中率越高对网站的卸载能力就越好,一般回源意味着性能会急剧下降,回源数量突增,非常可能造成系统故障。
而全量发布新图片格式,会造成大量的回源,某电商网站已经因这个问题发生过多次故障。- 例如在搜索列表页面,商品图片多达数十个,搜索访问量非常大,网站流量的很大比例来源于搜索,因此一旦有新图片格式,相当于在 CDN节点上的缓存全部被击穿,回到源站,造成大规模的性能下降。对于这种情况,一般在发布时可以通过将发布周期变长来解决。例如某个应用有100台机器,根据源站能够支撑的容量,逐步切换机器来增加权重,同时观测监控系统的变化情况,关注关键指标是否发生变化。
- 尽量对图片只新增不修改
图片一般很少会涉及修改,在设计时,尽量和图片名称解耦,这样可以做到图片只会新增而不用修改。
图片新增设计对于提高图片的命中率将会起到非常重要的作用,涉及修改需求时,只需要修改图片的名称,也就是通过新增图片的方式来让图片过期,可以将图片的过期时间设置成3年,甚至10年(不能设置过长的过期时间,因为CDN的存储空间有限,会导致图片被淘汰、性能下降,特别是针对热度相近的场景)。 - 尽早设计好源站架构
源站是高风险防范的最后一道防线,在大量回源时,能够抵挡住容量的压力,而在实际架构的过程中,特别是在网站的高速发展时期,在对 CDN 优化还不是很了解的时候,很容易出现 CDN 命中率不高的情况,源站承受很大的压力。当命中率不高的时候,静态资源的访问大量回源,CDN的卸载能力没有充分发挥,这对源站的容量要求很高,特别是在网站发展初期,机房网络建设不健全的时候,交换机的千兆网卡,造成流量稍大时丢包大量增加,网络延迟大幅增加,用户无法及时打开网站,从而引起订单量大幅下降。所以在源站的架构优化过程中,要提前考虑网络架构的优化,以及源站吞吐量的优化。 - 尽早了解CDN的配置规则
CDN里面有些默认的配置规则,如默认用户真实IP地址的字段使用的是TRUE_CLIENT_IP,默认没有配置的图片格式使用的是WebP,这些配置是否开启需要CDN提供商进行准确的确认。 - 提供合理、准确的数据对CDN进行优化
比如:通过LastMile监控,提供准确的数据分析问题 - CDN的性能问题一般和大量回源相关
由于某种原因造成大量的回源,会引起CDN性能的大幅下降。CDN提供的SLA的基本保障是可用性,当性能发生衰减时,大都跟大量的回源相关,可以通过细分监控来确定是由哪个域名引起的,通过监控的衰变时间点,确定项目发布是否会引起大量的回源,一般成熟的CDN是能够保障稳定性的。 - CDN高命中率是CDN应用的基本要求
- 应用CDN需要考虑ROI(Return on Investment 投资回报率)
CDN的优化方案非常多,不是所有的CDN优化方案都适合在项目中使用,要把合适的方案应用在合适的地方。通过ROI分析,可以比较清楚地知道,哪些方案是有用的和合适的。
CDN的应用有时候会带来架构的复杂性,这些复杂性的引入不仅浪费大量的人力和物力,还会造成用户体验的下降。CDN的应用一定要达到理想的目标,否则就是过度应用。
如有误可留言。 如果有用,谢谢点赞~
参考丛书《大型网站性能优化实战:从前端、网络、CDN到后端、大促的全链路性能优化详解》
性能优化合集快速入口: