系列文章是博主對沈劍的《架構師訓練營》分享內容的個人筆記總結,原內容公衆號“成爲架構師”。
1 CDN
CDN(content delivery network)即內容分發網絡,它的核心就是實現就近訪問
CDN非常適合用於靜態資源的加速訪問(js、css、html、多媒體文件等)
2 就近訪問
那麼什麼是就近訪問呢,就近的實際含義就是物理網絡的”地理位置“近
假設有一個靜態資源 abc.jpg在不同地理區域的機房都有存放,那麼當北京用戶試圖訪問這一資源的時候瀏覽器的請求就會被解析到北京機房,或許你會有疑問,請求根本就沒到服務器,怎麼會知道要到那個機房呢?
這一過程的實現依賴的DNS的解析服務,DNS解析可以根據請求的ip,依照一定的配置規則,將域名解析爲不同的nginx的公網ip,比如北京的ip,www.daojia.com的域名就會被解析爲北京機房的公網ip
地理位置是CDN最常用的一種邊緣網絡配置規則
3 CDN的構成部分
從CDN的就近訪問實現來看,我們可以知道dns-server是這一過程的核心,除了dns-server,CDN作爲一個分發網絡,還需要其他的組成部分
CDN網絡的主要構成:
- 源:主數據庫,所有的、最新的資源
- 鏡像:多個”穿透緩存“,源的複製
- 智能DNS,決定我們訪問哪一個
4 源與鏡像的一致性問題
一致性問題的解決方案
數據在多處存儲,就一定會有一致性問題,而一致性問題的解決有共性,又有具體問題具體分析的個性,每種場景下都有適合它的更優方案
假如源裏更新了abc.js,但是鏡像沒有更新,數據不一致了,如何處理?
這是一致性問題屬於(分佈式)緩存的不一致問題,通常有兩種方案:
- 源更新的時候,過期掉鏡像裏的abc.js (緩存淘汰)
- 等待鏡像裏的abc.js過期(緩存過期)
就方案一來說,考慮這要如何實現,源需要維護一份鏡像的List,然後for循環這一List對緩存進行淘汰,這是典型的反向依賴,源依賴了鏡像在增加或者減少減少鏡像節點的時候都要修改源的配置,是不合理的
來看方案二,在緩存未過期的時間段內,將有很長一段時間客戶端會得到髒數據,這讓人也不太能接受
在這一場景下,有一種更加的實踐:使用文件版本號
爲每一個靜態文件的命名帶上版本號,若原先的abc_v1.2.3.js升級爲abc_v1.2.4,那麼dns-server在解析域名試圖獲取這一文件的時候就能知道鏡像裏並不存在,就可以直接去源裏取得數據,十分的高效
資源更新
資源更新無外乎兩種方式:
- 資源更新的時候,源一次性推送所有鏡像
- 發現資源缺失的時候,鏡像主動去拉取源
方案一如前文所說的,發生了反向依賴的問題,所以在CDN的實踐中通常採取第二種,即拉取的策略,鏡像可以定時主動與源進行同步
上一篇回顧:【成爲架構師2-5】維護session一致性的四種方案
下一篇更精彩:【成爲架構師2-7】TCP負載均衡,長連接的負載均衡策略