编辑注:《运维之下》一书涵盖了系统、网络、数据库、安全、标准化、自动化等多个方面。它从创业初期到BAT级别的规模化运维,从PaaS、IaaS到公有云,从运维理念到平台实践都有所涉及。作者以个人成长经历为出发点,分享了在运维工作发展过程中遇到的问题以及解决问题的思考方式。这本书不仅仅是一本传授管理经验和工作秘诀的书籍,更是一本关于运维体系化的指南。在大量理论类书籍充斥市场的同时,作者将多年的从业经验整合成一本书,其价值不言而喻。本文是《运维之下》第十一章。
第十一章:CDN
CDN是Content Delivery Network的缩写,直译为“内容分发网络”。其工作原理是将用户需要访问的内容缓存在边缘节点上,以实现就近访问,从而避免经过互联网骨干传输数据时的不稳定性和速度瓶颈,提升用户体验。CDN系统通过在网络各处放置节点服务器,构建了一个基于现有互联网基础的智能虚拟网络。该系统能够根据网络流量、节点连接和负载状况,以及用户与节点之间的距离和响应时间等综合信息,将用户的请求重新导向离用户最近的服务节点。其目的是使用户能够就近获取所需内容,解决互联网拥堵问题,提高用户访问网站的响应速度。
CDN主要分为静态加速和动态加速两部分,下面将分别介绍。
静态加速:通过将静态资源缓存到CDN节点上,用户可以就近访问CDN节点获取资源,避免直接从源站获取数据,提升用户的访问速度和质量。相比用户直接访问源站,访问CDN节点带来以下好处:CDN节点更接近用户,提供更小的网络延迟和更快的访问速度;CDN节点数量远大于源站,可以支持更大的请求数量;CDN节点分布在多个地理位置,提供更好的容灾能力。静态加速可以分为小文件类业务和下载类业务,两者的区别在于文件大小、访问方式以及业务侧重点。
小文件类业务:主要包括网页、图片、JS、CSS等尺寸较小(一般为数KB至几百KB)的文件,通过浏览器访问。这类业务的特点是单次请求文件较小,请求总数较大,主要消耗CPU和带宽资源。一般直接在浏览器中展示,对访问成功率要求较高,需要尽量降低RTT延迟,即节点要部署在离用户较近的位置。
下载类业务:相对于静态资源类业务,下载类业务的单个文件尺寸较大,需要更多的磁盘空间和带宽资源,对CPU的消耗较小。下载类业务的下载时间较长,更注重吞吐量而不是RTT延迟。
动态加速:静态加速通过缓存文件来提高用户访问速度,而动态加速则通过减少用户与源站之间请求的网络耗时来提高用户体验。动态加速可采用的技术包括TCP单边加速、多路TCP合并回源和回源压缩。
TCP单边加速:主要原理是在用户通过公网直接访问源站速度较慢时,通过各种方式使用户请求绕过拥堵的网络环节。例如,在用户访问质量良好的区域建立CDN节点,用户访问先经过CDN节点,再通过CDN节点中转至源站;或者在某些关键CDN节点使用专线与源站联通,以确保CDN节点到源站的回源质量。
多路TCP合并回源:在CDN节点将多个用户的数据合并在一个TCP连接上回源至源站,以减少回源时新建TCP连接带来的额外时间消耗。
回源压缩:对回源数据流进行压缩,减少在网络上传输的回源数据量。
自建CDN:在初期,公司通常会使用第三方CDN服务。随着业务量和需求的增加,第三方CDN在质量和运维效率方面逐渐无法满足需求。为了提升CDN的质量和运维效率,自建CDN成为一个不错的选择。在某个案例中,自建CDN不仅提升了业务质量,降低了成本,还提高了与第三方CDN服务商的议价能力。
该案例中,自建CDN支持静态加速和动态加速业务,带宽容量达到数百Gbps,日常支撑了公司90%以上的CDN流量,并多次应对大型发布推广活动(活动带宽相比日常带宽增长数倍)。自建CDN在设计之初就针对公司业务特点进行了调整,从节点选择、软硬件配置到参数优化都进行了有针对性的调整。
在该案例中,首先进行了大文件静态加速的工作,随后逐步进行小文件静态加速和动态加速的工作。同时,CDN管理和调度系统也随着CDN的发展不断完善。CDN系统整体框图如图11-4所示。
CDN业务系统:提供CDN加速的缓存服务器和代理服务器。
私有调度系统:公司的HTTP调度服务器和302调度服务器。
GSLB系统:支持智能解析的DNS服务器。
流量收集系统:采集节点交换机、服务器和各业务的流量。
质量收集系统:采集质量评测数据。
日志统计系统:统计CDN访问日志和调度系统日志。
质量分析系统:通过质量评测数据和日志统计数据,汇总统计质量排序结果。
CMDB系统:管理CDN节点的资产信息和状态跟踪。
调度决策系统:根据质量排序结果、流量数据和CMDB系统的服务器状态,计算最优调度方案并生成相关配置文件。
监控系统:对节点设备进行基础监控和业务可用性监控。
告警系统:在发生告警时通知运维人员,并向调度决策系统发送信号,实现某些特定故障的自动化处理。
自动化接口:提供给CDN业务使用者的刷新、预加载等接口。
Portal展示系统:展示CDN业务运行的各项数据。
配置变更系统:用于CDN运维人员进行日常运维操作。
CDN硬件和节点选型
CDN的目标是以尽可能低的成本为用户提供尽可能高的服务质量,因此在硬件选型时成本是一个重要的考虑因素。对于静态资源类业务,主要评估的是在节点出口带宽满载时所使用的硬件的总成本。例如,相同配置的1台万兆服务器和10台千兆服务器都可以满足10Gbps带宽的需求,但肯定会选择万兆服务器。当然,在硬件选型时还要考虑实际业务对CPU、内存和磁盘的使用情况。
静态资源类业务使用的机型规格为E5-2620 *2 + 128GB RAM + 2TB SAS *4 + 480GB SSD *6。关键指标是万兆网卡+大内存+SSD存储。使用万兆网卡可以有效避免单机网络吞吐达到瓶颈;大内存可以将更多的数据缓存在内存中,降低磁盘IO的使用;SSD可以提供更好的随机IO读/写性能,以避免出现木桶效应。
动态加速类业务使用的机型规格为E5-2620 *2 + 64GB RAM + 600GB SAS *2。由于这类业务对带宽使用量较少,主要消耗CPU资源,所以在硬件选型上主要侧重于CPU和内存,对磁盘和网卡没有特殊要求。
在硬件选型时,发现相对于Broadcom网卡,Intel网卡在CPU使用率和小包性能方面都更优秀,因此无论是千兆还是万兆服务器,都推荐使用Intel网卡。
CDN节点建设策略
随着业务的发展,需要陆续新建CDN节点以保证整体带宽使用率在合理水平。最佳的节点建设策略是在带宽缺口最大的区域新建CDN节点。通过日志统计系统可以得出各省份运营商的带宽使用量及使用比例,与当前已有节点的分布进行对比,即可得到各省份运营商的带宽需求、当前带宽供应和当前带宽缺口的一览表(表11-1为示例数据,非真实数据)。
确定新建CDN节点的区域后,下一步是实际选点。在选点过程中,主要考虑候选节点的成本和质量。节点的成本可以通过单位带宽成本来衡量,这里不做详细讨论。在选点时,主要评估候选节点的质量。为了使评估结果更接近用户真实体验并具有可比性,可以使用JS测速来评估候选节点的质量。简单来说,就是让部分真实用户下载一个固定大小的文件,记录每次用户下载的成功率和耗时,统计全部用户的平均下载成功率和耗时作为衡量节点质量的依据。这种方法在实践中效果良好。
CDN缓存系统
常见的缓存服务器有以下几种:
Squid:老牌的缓存服务器,但性能较差,无法满足自建CDN对高性能的需求。
Nginx:性能好,插件丰富,支持广泛,但缓存功能较弱。在某个案例中,动态加速服务是在Nginx的基础上进行修改的。
Varnish:配置方便,性能好,但不支持持久化缓存。
Apache Traffic Server(ATS):性能好,对缓存的支持很完善,但插件不够丰富,某些业务需求需要自行开发插件。
经过综合比较,自建CDN的静态加速服务使用了ATS。
ATS具有完整的正向代理和反向代理功能,并支持集群工作模式。它可以使用parent配置自动屏蔽故障源站。ATS具有内存缓存和磁盘缓存自动淘汰功能,并支持直接写裸磁盘。此外,ATS还具有丰富的日志格式配置,并支持插件开发,可以定制业务专有需求。
ATS的配置要点如下:
回源配置:使用parent配置可以实现多个源站的负载均衡,自动屏蔽故障源站,并将源站DNS解析和回源Host解耦合。
缓存配置:内存缓存配置包括内存缓存大小、内存缓存的最大单文件尺寸、记录内存缓存命中等。磁盘缓存配置可以选择文件系统缓存或直接写裸盘。
interim storage缓存配置:为了解决SATA磁盘随机读/写差的问题,ATS支持内存-SSD-SATA磁盘三级缓存。将最常访问的内容放到SSD中,降低对SATA磁盘的随机读数量。
CDN调度系统
DNS调度是通过对不同的Local DNS服务器返回不同的解析结果来实现智能解析和就近调度的。例如,给黑龙江联通的Local DNS返回黑龙江联通CDN节点的IP地址,给广东电信的Local DNS返回广东电信CDN节点的IP地址。
CDN的DNS服务主要实现两个需求:智能解析和edns-client-subnet支持。有很多开源的DNS软件支持IP解析调度和edns-client-subnet,如PowerDNS。在某个案例中,CDN主要使用DNSPod服务,部分使用自建DNS服务。自建DNS服务主要考虑到一些特殊的业务场景和监控需求。
自建DNS服务的实现方式之一是SmartDNS(智能DNS)。SmartDNS根据配置,根据请求IP地址的特性返回不同的解析结果。它可以获取DNS请求的源IP地址或客户端IP地址(支持EDNS协议的请求可以获取客户端IP地址),根据本地的静态IP地址库获取请求IP地址的特性,然后根据调度配置返回解析结果。SmartDNS支持A、SOA、NS记录的查询,支持DNS forward功能。
自建DNS服务的另一个需求是edns-client-subnet支持。CDN的DNS支持该协议后,可以获取用户真实的IP地址,进行准确的调度。
以上是CDN的基本概念、节点建设和调度系统的介绍。CDN在提升用户体验和优化网络性能方面发挥着重要作用。通过合理的节点建设和调度策略,以及优化的缓存系统,可以实现高效的CDN服务。