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_TW繁體中文