一個通用型的CDN,如果要服務廣域范圍內的用戶,那必然要在一個廣大的區域內部署服務節點。那么,一個很重要的問題就來了,就是如何將用戶的訪問導向到最優節點上。
最優的含義有兩層,一是訪問速度最快,二是地理上最接近。從廣域網絡的特性上來說,一般情況下是同城同運營商的兩端之間通信效果最好。
而普通用戶上網,大致的過程就是終端通過http協議訪問一個URL地址,然后由本地DNS解析得到服務器的IP地址。終端再向獲得的IP地址發起TCP連接,收取數據。
無CDN時的上網過程
上圖所示是一般的訪問互聯網的過程。而在CDN系統里,終端要想與同城同運營商的節點服務器連接上,這就是全局調度要解決的核心問題。
在圖中就是“返回服務器IP地址”這一步,最理想情況下,本地DNS返回的就是最優節點地址。接下來就說明從技術上如何實現這一步。
全局調度
基于智能DNS的調度
用戶有可能在全國任何一個地點上網,不過總是要通過DNS系統解析域名而獲得服務器的IP地址。如果能夠從DNS處就取得最優節點,這勢必能大大減少調度階段所耗費的時間。
于是需要解決的第一個問題,就是如何判定終端所在的地域與運營商環境。可是在早期的DNS協議中,并不支持這一功能,DNS僅是在執行遞歸查詢之后,將配置好的IP返回。
智能DNS技術為解決這個問題提供了實現方法。智能DNS的智能之處,就是它可以獲得用戶的IP,并對其進行分析,得到用戶所在的地域和使用的運營商線路。
具備了智能DNS功能的處理過程如下圖所示。
智能DNS全局調度
智能DNS技術選型
對于智能DNS的搭建,可以使用開源工具BIND(Berkeley Internet Name Domain),結合EDNS協議,再加上一個存儲了IP地址地理信息的數據庫,就可以實現智能DNS技術。
EDNS是google提交的擴展DNS協議,它相較于普通DNS,可以獲取終端真實IP地址。這樣就可以在存儲了IP地址地理信息的數據庫中通過查詢,得到終端所在的地域與所屬運營商信息,從而將其導向最優節點。
IP地址地理信息庫則可以使用GeoIP,從dev.maxmind.com站點可以下載源庫。不過,IP地理信息是時常會變化的,地址庫需要定期更新。如果在技術上要求精確,則應該考慮購買商業產品。
數據庫可使用關系型的MySQL,或者緩存型的redis。無論需要支持哪種數據庫,都必須在BIND的源碼中打上相應的補丁,經過編譯后才能使用。
技術棧:BIND(支持EDNS協議) + mysql或redis(GeoIP地理信息庫)。
基于http的重定向調度
智能DNS技術的優點突出,不過也存在一些缺陷。例如URL被本地DNS解析之后,則會將IP地址緩存起來,這樣其他終端就無法得到最優節點。
因此,在應用層根據訪問協議,以重定向的方式將終端導向最優節點,就是一個很好的解決辦法。目前應用最廣泛的,則是基于http協議的302返回碼進行跳轉。
http是一套基于文本,且簡單、清晰、易理解的應用層通信協議。它采用TCP協議進行傳輸,也是目前互聯網上最通用的應用協議。
相較于DNS的調度方式,http的調度可以擴展多個維度。因為DNS調度中只有終端IP這一個可參考依據,只能按地域和運營商來配置最優節點。
而http調度可以將內容、終端型號、用戶身份等作為參考依據,實現更加合理的調度。例如,已經緩存了內容的最優節點會被優先導向;如果是付費VIP用戶,則可以給其擁有最好線路的機房節點。
對于http全局調度服務,業界一般將其稱為GSLB(Global Server Load Balancing),即全局負載均衡。從技術實現上來說,GSLB一般是以WEB接口作為前端,然后各個廠家會實現自己的全局調度業務邏輯。
http重定向的全局調度
目前業界使用較多的是Nginx+lua的方式實現服務調度。
本地調度
全局調度完成的工作,是將終端導向到最優的節點。而一個邏輯上的節點,在物理上可能是一個機房,內有數臺至數十臺的服務器。
在這些服務器上則部署著本地負載均衡服務、反向代理服務,以及內容緩存服務。而本地調度要做的工作就是在節點內部,基于負載均衡策略,為終端與緩存服務之間構建起一條數據傳輸通道。
本地調度技術選型
從實施上來說,可以選擇硬件負載均衡設備F5。也可以采用OSPF+LVS+Keepalived的技術方案。
LVS是由章文嵩博士在1998年創立的開源軟件項目。LVS是linux Virtual Server的縮寫,它的目的是將若干臺Linux服務器通過網絡組建成高性能、高可用、可伸縮的集群。
LVS工作在網絡棧的第四層,即傳輸層。它支持多種本地負載均衡策略,有VS/NAT,VS/TUN,VS/DR三種工作模式。目前業界較多采用VS/DR模式。
VS/DR是直接路由方式,實現方式是LVS收到用戶請求后,按負載均衡策略從集群中挑選了一臺服務器,然后修改請求數據包中的目標mac地址,將其轉發給目標服務器進行處理。DR模式要求集群內的服務器都在同一個網段內。
基于LVS實現負載均衡的典型架構,一般是兩臺安裝LVS的服務器作為雙主雙活,配置一個虛擬地址VIP。然后安裝支持OSPF協議的開源路由工具:Quagga。
Quagga的作用是將LVS主機虛擬成一臺路由器,這樣通過OSPF協議將物理路由器與兩臺LVS服務器,構建出等價多路徑。以此實現LVS的雙主輪詢工作方式。
在對節點內服務器探測方面,采用Keepalived開源工具。它最初就是為了LVS而設計的,可對集群內的服務器進行檢測,并實現自動化的維護工作。
LVS負載均衡實現本地調度
技術棧:LVS + Quagga + Keepalived。
結語
CDN系統的調度工作分為兩個部分,一是全局調度,二是本地調度。
全局調度的目標是以最快的速度,將終端導向最優節點。最優的依據則是地理上接近、相同的運營商,節點本身緩存有請求的內容,以及節點狀況良好。
基于智能DNS技術的優點是可以解決地域與運營商的匹配,而且減少了終端與節點間建立連接的時間。但缺點是無法根據內容與用戶特點進行導向,難以擴展判斷維度。
基于http重定向的方式,則可以擁有多維度的判斷依據,而且也便于擴展。其缺點則是響應速度受限于中心服務的處理能力。
在實踐中可以采用兩者相結合的方式。例如DNS調度之后的節點如果不能滿足要求,則可以通過http的調度再匹配最優節點。
本地調度的目標,是在機房內實現數據傳輸的負載均衡。使用的技術可以是硬件F5,工作在四層的LVS,或者是Nginx。
采購硬件的方式是成本高,實施快捷。使用LVS技術能夠獲得較快的傳輸效率,但配置和管理會復雜一些。而使用Nginx則配置簡單,但傳輸效率會差一些,在吞吐量大的時候,其所在服務器可能會成為傳輸瓶頸。






