11月1日到3日,由InfoQ 主辦的全球軟件開發大會(簡稱QCon)在上海光大會展中心國際大酒店隆重召開,這是一次技術開發者的頂級盛宴,又拍云作為國內最大的針對企業級的云服務平臺,又拍云首席架構師黃慧攀也受邀在會上分享《又拍云CDN技術架構探秘》的主題。
分享過程中,黃慧攀著重介紹了又拍云的四大模塊——防盜鏈模塊,流量統計模塊,緩存調度模塊和防攻擊模塊。
防盜鏈模塊:防盜鏈模塊在Nginx啟動時并沒有任何防盜鏈策略,但會到數據中心獲取一份完整的客戶域名列表,但針對某個空間域名的具體防盜鏈策略是未獲取的,而是在某個URL請求訪問過來的時候觸發策略更新動作(該次請求只判斷是否是合法的空間域名,如果該URL的空間域名不在客戶列表上是不允許被訪問的),前往數據中心獲取該URL對應空間域名的防盜鏈策略,并以自定好的數據結構存儲于Nginx的共享內存中,下次訪問該空間的所有URL都能檢索到對應的防盜鏈策略。也就是說防盜鏈模塊是以按需被動觸發、主動更新的模式進行操作,本地的防盜鏈策略不會跟數據中心保證嚴格一致,通常會延遲幾分鐘。因防盜鏈模塊會每間隔幾分鐘前往數據中心獲取一份防盜鏈策略更新的客戶列表,如檢測到某個空間域名的防盜鏈策略有更新,將把本地共享內存中的對應記錄標記為“需更新”,當該空間再次有訪問請求進來的時候再主動觸發一個更新操作。
流量統計模塊:為降低數據統計的數據量,我們采用先在前端進行初步統計一個中間結果再交予數據中心進行大匯總的模式。每個URL訪問請求進入Nginx,將通過流量統計模塊并把該次請求的內容大小(如:102400字節)記錄到該請求對應的空間域名記錄下,而不是直接就把這次請求的流量數字報到后端數據中心。在前端的流量統計模塊上暫時保留5分鐘的記錄,每隔5分鐘后進行每個空間域名的匯總統計,得到一個中間值再報入到數據中心進行全部節點的匯總統計。這樣一來,數據量從幾百萬條記錄降低到每5分鐘幾百條記錄,那么在數據中心的匯總統計就相對簡單很多。
緩存調度模塊:調度模塊在Nginx共享內存中存有幾百萬條URL信息,這些信息是標記某個URL應該調度到SSD磁盤或者SAS磁盤。這數百萬條記錄主要通過Nginx內部提供的RbTree 算法進行查找,百萬條記錄,最多只需20步就能定位到記錄。而我們在RbTree算法基礎上加入了LRU和MRU算法,以實現在固定范圍內對這些URL進行排序操作,當某些URL訪問密度明顯大于其他URL時,它將被調到SSD磁盤的Squid緩存進行讀寫。
雖然每個訪問請求都會經過緩存調度模塊的判斷,但模塊的判斷速度非常快,不會帶來任何延遲。可將熱門內容(占訪問總量70%以上)都被調度到SSD磁盤上讀取,明顯提高系統整體性能。
防攻擊模塊:該模塊核心算法跟緩存調度模塊類似,都是要對大量的URL進行排序,對訪問量大的URL進行判斷。如果某個URL的訪問頻密度超過正常閾值,系統將對此URL的所有請求進行初步屏蔽處理(該次屏蔽以302重定向的方式進行保護,如果該次請求不是瀏覽器發起的正常訪問一般是不會識別302重定向信號,從而可屏蔽掉機器刷新類型的攻擊),如情況還繼續惡化,系統將禁止該URL的訪問請求,每隔5分鐘再次審核該URL的請求量是否恢復到正常閾值,自動判斷是否可以解除禁止。
黃慧攀還介紹:“雖然又拍云CDN系統的業務功能較傳統的CDN系統復雜,多了好幾個模塊運算,但對訪問請求的處理耗時并沒產生影響,可忽略。并且使用到SSD固態硬盤來提供熱門內容的緩存服務,整體的服務處理能力還大大增加(前后對比,使用SSD固態硬盤后單臺服務器的服務能力提升了1倍多)。
整體系統分為三層,可充分降低數據中心的訪問壓力。我們還在第二層中間結點部署有圖片處理服務器和音頻處理服務器的集群,把一部分數據中心工作向外擴,進一步減輕壓力并能提高整體系統性能。
又拍云CDN系統上線正式投入服務到今已穩定運行3年多,較我們早年部署的CDN系統有了很大提升。未來我們還將繼續完善UpCDN系統,在自動化管理方面加大研發力度(這將涉及到服務器硬件、系統環境和軟件部署等方面,需制定軟硬件標準和完善的節點監控系統),以實現一個智能化、自動維護的CDN系統。”