一、背景
? ? ? ? 上篇文章分析了一下CDN的基本原理以及使用代碼實現了一個乞丐版的智能DNS調度器。從整個例子我們可以清晰了解到CDN原理,也就那么回事。
? ? ? ? 但是,之前也講過了,CDN產品融合的技術比較雜、也比較多。所以我就想著,萬物皆有開源競品。試著找找有沒有現成的開源解決方案。例如Web服務器,我們要構建站點就有開源的Nginx。那我想做CDN的話,也會有對整套的開源解決方案嗎?
? ? ? ? 找了半天,發現能用的很少。我猜測原因可能是,因為CDN這種技術比較雜、涉及的技術面比較廣,不像只單純研究Web一樣研究nginx。所以基本上沒開發者去開發這么一套龐大并且涉及技術面很廣,又幾乎沒有人單獨自己去部署CDN的需求。 畢竟CDN的邊緣節點鋪設的密集度、節點穩定性、帶寬大小、算力大小等等,不是個人開發者或者普通企業去做的事情。
? ? ? ? 只有專業的CDN廠商,才會花費時間去鋪設邊緣節點,在各個城市大小機房架設節點,還有利用P2P技術、PCDN技術等等,才能為用戶提供可靠的、快速的CDN服務,達到加速效果。
? ? ? ? 不過我也找到了一款免費開源的類CDN解決方案,可以作為技術學習進行研究,例如整體架構、設計思路,給人一個直觀上的感受。這個產品名稱為GoEdge。
? ? ? ? 官網:?https://goedge.cloud/
? ??
? ? ? ? 從名稱就能看出,使用Go語言進行主要的實現。
二、架構介紹
1、CDN原理分析
? ? ? ? 這里借鑒官網文檔信息,讓大家對CDN的原理再次進行一次記憶加強。
從上圖可以看到:
- 不同區域或者不同網絡的用戶,可以通過DNS服務被分配到不同的邊緣節點上;
- 邊緣節點如果已經緩存內容,可以就近直接向用戶發送內容;如果還沒有緩存內容,則一級一級網上找,直至去源站(即內容提供原始的站點)去獲取內容,然后再一級一級返回,直至發送給用戶;
- 由于邊緣節點可以緩存內容,所以可以有以下幾個優點:
- 降低了網絡延時,加速了內容的分發,因為用戶可以就近獲取內容,就無需跨多個網絡千里迢迢訪問最原始的服務器;
- 大幅降低源站壓力,通過邊緣節點的分擔,源站通常可以減少絕大部分訪問;
- 增加數據傳輸的可靠性,因為每個邊緣節點都可以獨立發送內容,即使源站服務器宕機,也不會影響內容的訪問;
- 增強了源站的安全性,當遭遇大規模類似于DDOS的攻擊時,可以通過邊緣節點有效減少到源站的流量,也可以在邊緣節點增加防御規則(比如WAF),讓攻擊的流量無法到達源站,從而提升了源站的安全性。
?2、GoCDN架構圖
? ? ? ? 存在幾個角色的程序:
? ? ? ? 1、控制平面, 有后臺管理, 可以針對節點管理、節點監控管理、緩存預熱等等
? ? ? ? 2、邊緣節點,實際提供服務的節點,緩存了源站的相關靜態數據
? ? ? ? 3、API節點,為全局的服務提供一個出入口
三、docker部署GoEdge
1、運行admin控制臺
docker-compose.yml如下:
version: "3"networks:goedge:external: falseservices:mysqld:image: mysql:8container_name: mysqldenvironment:- MYSQL_ROOT_PASSWORD=root- MYSQL_USER=edges- MYSQL_PASSWORD=edges- MYSQL_DATABASE=edgesnetworks:- goedgevolumes:- ./data/db/mysql:/var/lib/mysql:rwrestart: alwaysedge-admin:image: icodex/edge-admin:1.3.3container_name: edge-adminports:- 7788:7788/tcp- 8001:8001/tcpnetworks:- goedgevolumes:- ./data/edge-admin/configs:/usr/local/goedge/edge-admin/configs- ./data/edge-api/configs:/usr/local/goedge/edge-admin/edge-api/configsrestart: always
2、安裝節點注冊到admin控制臺
?docker-compose.yml:
version: "3"services:edge-node:image: icodex/edge-node:1.3.3container_name: edge-nodeenvironment:- ENDPOINTS=http://xxx.com:8001 #admin所在信息- CLUSTERID=xxx #登錄控制臺后,查看集群節點信息- SECRET=xxx #登錄控制臺后,查看集群節點信息network_mode: hostvolumes:- ./data/edge-node/cache:/opt/cache- ./data/edge-node/configs:/usr/local/goedge/edge-node/configsrestart: always
3、配置admin
? ? ? ? ?進入admin的7788端口,首次進行安裝:
?
?
?
?
4、邊緣節點管理
? ? ? ? 我們可以根據邊緣節點,對這些邊緣節點進行如停止、重啟、查看日志、配置、監控等管理。還可以針對數據進行預熱、配置綁定域名、回源站策略等等。
? ? ? ? 除了CDN的能力,還有提供了WAF的相關功能。
四、總結
? ? ? ? CDN技術一般只有大廠或者本身就是做CDN的企業才會比較深入研究,所以針對此類開源產品相對較少,開發者不愿意花費很大的精力去研究這種技術。 這種技術要得到市場強大的支持,需要鋪設足夠多的邊緣節點,同時還要保證這些節點的帶寬充足、可用性高, 個人開發者沒那么多精力和心思去做, 大部分人花點錢買CDN廠家提供的服務也花不了幾個錢(靜態加速的情況下),沒必要去研究太深。
? ? ? ? CDN還涉及P2P分發、PCDN、WAF、DDOS、NAT內網穿透、流量清洗等等,太多東西了,開發者的精力有限,只能這么說.