CDN 基础概念与设计– 系统设计12

system-design-系统设计12-CDN-基础概念与设计-how-cdn-work-hogantech

序言

如果是软体工程师,一定对CDN 这个名词不陌生,但是如果仔细去探讨CDN 原理以及如何设计,那就可能不一定这么清楚,因此接下来会先好好的讲解一下内容交付网路( Content Delivery Network)的概念,以及我们如何去实作。

CDN 之于系统设计

讲解CDN 之前,让我们回过头来看一下大型系统本身,如果全球有数百万使用者都在使用一个系统,并且我们的服务都是部署在单一的资料中心来满足使用者的请求(Request) ,那我们可能会出现什么问题?

高延迟(High latency)

使用者、资料中心、伺服器的实体距离如果过高,会使延迟提高。如果使用者感受到高延迟,通常不会是单一原因,而是由多个复杂的原因所组成,例如:传输延迟(Transmission Delays)、传播延迟(Propagation Delays)、排队延迟(Queuing Delays)和节点处理延迟(Nodal Processing Delays)。其中长距离的资料传输是一定会导致更高的延迟。根据我们人类的体感,会希望系统延迟低于200 毫秒,对于网际网路协定语音(VoIP),延迟不应超过150 毫秒,而影片播放平台不能超过几秒的延迟,例如:Youtube 如果每次点击影片都会延迟几秒,就会流失用户。

资料密集型应用(Data-intensive applications)

资料密集型应用(Data-intensive applications)通常指需要传输较大的流量。在较长的距离上,这可能会成为一个问题,因为网路路径经过不同类型的网路服务供应商(ISP)。随着使用者的数量增加,这类型问题会倍增甚至是指数型成长,因为伺服器必须向每个用户单独提供资料。换言之,当多个客户端请求时,主资料中心将需要发送大量无用的资料(Redundant Data)。

资料中心资源稀缺(Scarcity of data center resources)

当使用者数量增加时,资料中心资源的运算能力和频宽就会成为限制甚至是瓶颈。因此数百万用户的系统服务就会需要做扩展。不过即使在单一资料中心实现了扩充,当资料中心因自然灾害或网路连线问题而离线时,它仍然可能成为单点故障(Single Point of Failure)。

CDN 是什么呢?

内容分发网路(CDN)就是用来处理上述问题的解决方案之一。首先,CDN 是一组根据地理位置去做置放的代理伺服器(Proxy Server)。其中,代理伺服器是客户端和伺服器之间的中间伺服器,代理伺服器也会放置在网路边缘(Network Edge)。也因为网路边缘靠近最终用户,代理伺服器的放置有助于透过减少延迟和节省频宽来快速将对应的资料传送给使用者。 CDN 除了作为简单的代理伺服器之外还,也可以透过一些设定以及操作让他们变得更有效率。

CDN 透过在用户附近放置一个小型资料中心,并在那里储存资料副本来使资料更接近使用者。 CDN主要储存两种类型的资料:静态和动态,并且主要透过让资料更接近使用者来解决传播延迟问题。 CDN 供应商也需要付出额外的成本,提供足够的可用频宽,并使资料更接近使用者。

因此回归到前面提到的问题,CDN 是如何解决高延迟(High latency)、资料密集型应用(Data-intensive applications)、资料中心资源稀缺(Scarcity of data center resources)?

  • 高延迟 :CDN 的实体架设距离用户端比较近,因此使用者可以透过CDN 来去获得对应的资料,进而减少物理距离和延迟。
  • 资料密集型应用:由于资料的路径仅包括ISP和附近的CDN元件,因此在特定区域透过少量CDN元件服务大量使用者是没有问题的。如下所示,来源资料中心只需向本机CDN 元件提供一次数据,而本机CDN 元件可以单独向不同使用者提供资料。任何用户都不必从来源伺服器下载自己的资料副本。
  • 资料中心资源稀缺:CDN用于服务流行内容。由于这个原因,大部分的流量是在CDN 而不是来源伺服器处理。因此,不同的本地或分散式CDN 元件分担来源伺服器上的负载。

CDN的设计需求

在这篇文章 软体设计非功能性特性– 系统设计03 中,我们也有讲解了功能、非功能性的需求,因此既然要设计CDN ,我们就必须要先列出功能和非功能需求。

功能需求

一个CDN 可以把它当作是一个资料库,因此基本上会需要有的功能有以下:

  1. 接收(Retrieve):根据CDN 模型的类型,CDN 要能从伺服器接收内容。
  2. 请求(Request):代理伺服器根据使用者的请求进行内容传输,并且CDN代理伺服器应该能够回应每个使用者的请求。
  3. 传送(Deliver):伺服器应该能够将内容传送到CDN 代理伺服器。
  4. 搜寻(Search):CDN 应该能够针对用户查询执行搜寻,用来查CDN 内的快取或是其他方式储存的内容。
  5. 更新(Update):在大多数情况下,内容来自伺服器端,但如果我们在CDN 中执行程式脚本(Script),CDN 应该能够更新PoP 中对等CDN 代理伺服器内的内容。其中,存在点(PoP) 是两个或多个网路或通讯设备共享连线的分界点、存取点或实体位置。
  6. 删除(Delete):根据内容的类型(静态或动态),在一段时间后应该可以从CDN 伺服器中删除快取的条目。

非功能需求

如果尚不了解非功能需求的读者,可以观看此文章  软体设计非功能性特性– 系统设计03

  1. 效能性(Performance):CDN最重要的一个任务就是将延迟最小化,并且也是不少开发者之所以使用CDN的主要理由。
  2. 可用性(Availability):可用性用来确保系统可以保持持续可用,因此CDN 可以用来防止一些系统攻击,例如:DDoS。
  3. 可扩充性(Scalability):越来越多的使用端的应用程式可以从CDN 请求资料,因此可以针对CDN 来去做系统性扩充。
  4. 可靠性(Reliability):CDN 设计要确保没有单点故障(Single Point of Failure)。除了故障之外,设计的CDN 还必须有高可靠性来处理大量流量负载。

CDN系统设计

因为CDN 设计本身比较复杂,我引用Grokking Modern System Design 的图解,来仔细讲解CDN 系统设计。这边会分别介绍CDN 的组成元件,接着再根据组成元件讲解CDN 运作原理。

CDN元件

CDN(Content Delivery Network,内容传递网路)是一种分布式网路,由遍布全球的伺服器组成,用于加速向使用者传递内容。 CDN 可以提高网站效能、降低延迟、并改善使用者体验。

以下是CDN 系统设计的主要元件:

  1. 客户端(Clients)使用者在各种客户端,例如:浏览器、智慧型手机和平板电脑,来从CDN 请求内容。
  2. 路由系统(Routing System):路由系统负责将使用者引导至最近的CDN 设施。为了做到这一点,路由系统需要考虑以下因素:
      • 内容放置位置
      • 使用者请求量
      • 伺服器负载
  3. 清理器伺服器(Scrubber Servers):清理器伺服器用于将良好流量与恶意流量分开,并防止攻击。常见的攻击类型包括DDoS 攻击。
  4. 代理伺服器(Proxy Servers):代理伺服器将内容提供给使用者。代理伺服器通常会将热门内容储存在RAM 中,以提高效能。代理伺服器还会从分发系统接收内容。
  5. 分发系统(Distribution System):分发系统负责将内容分发到CDN 的不同设施。分发系统可以使用各种技术来分发内容,例如:
    • 缓存
    • 压缩
    • 流式传输
  6. 来源伺服器(Origin Servers):来源伺服器是原始内容的存放位置。当CDN 上没有内容时,使用者会从来源伺服器请求内容。
  7. 管理系统(Management System):管理系统用于监控CDN 的效能和健康状况。管理系统可以收集有关延迟、停机时间、流量和错误率等指标的资料。
system-design-系统设计12-CDN-基础概念与设计-how-cdn-work-hogantech-00

CDN 原理

此CDN 流程为Grokking Modern System Design 的讲解:

  1. 来源伺服器将CDN 中快取的所有物件的URI 提供给请求路由系统。
  2. 来源伺服器将内容发布到负责跨活动边缘代理伺服器进行资料分发的分发系统。
  3. 分发系统在代理伺服器之间分发内容并向请求路由系统提供回馈。此回馈有助于优化为请求客户端选择最近的代理伺服器。此回馈包含有关哪些内容快取在哪个代理伺服器上以将流量路由到相关代理伺服器的资讯。
  4. 客户端向路由系统请求适当的代理伺服器。
  5. 请求路由系统传回适当代理伺服器的IP位址。
  6. 出于安全原因,客户端请求透过清理器伺服器进行路由。
  7. 清理器伺服器将良好的流量转送到边缘代理伺服器。
  8. 边缘代理伺服器服务于客户端请求并定期将记帐资讯转发到管理系统。管理系统更新来源伺服器并向路由系统发送有关内容的统计和详细资讯的回馈。但是,如果内容在代理伺服器中不可用,则请求将路由到来源伺服器。如果在边缘代理伺服器中找不到内容,也可能有代理伺服器的层次结构。对于这种情况,请求将转送到父代理伺服器。

后记

CDN 是一个软体工程师常使用的工具,也可以使用一些网路服务商的现成CDN 服务,不过也会建议在使用前可以多了解CDN 背后原理,也有助于系统设计的理解。下一篇也会持续讲解CDN 相关内容,如果喜欢系统设计的读者,也不妨观看其他内容。

相关文章

Key-Value Store 键值资料储存解说– 系统设计11

Data Partitioning 资料分区是什么? – 系统设计10

Data Replication 如何优化资料库? - 系统设计09

资料库基础介绍– 系统设计08

负载平衡器解说– 系统设计07

DNS 是什么?网域名称系统介绍– 系统设计06

系统设计元件介绍Building Block – 系统设计05

Back-of-the-envelope 封底计算– 系统设计04

软体设计非功能性特性– 系统设计03

抽象在系统设计中的应用– 系统设计02

现代系统设计介绍– 系统设计01

引用

Grokking Modern System Design

What is a content delivery network (CDN)? | How do CDNs work?

 

 

zh_CN简体中文