資料中心內的負載均衡-MPTCP
1. 為什麼用MPTCP做負載均衡?
(1)充分利用網路資源
以手機為例,手機包含兩種上網方式,蜂窩移動資料網路(2G,3G,4G)和WIFI網路。我們希望在有WIFI的時候儘量使用WIFI,這樣可以節省成本,沒有WIFI的時候自動切換到蜂窩行動網路,避免斷連。同樣在PC端,我們希望有線網絡卡和無線網絡卡可以同時上網,提高網速。但是使用TCP協議是無法實現上述功能的。
(2)提供可靠傳輸
MPTCP在協議棧中,位於TCP之上,利用建立TCP子流進行資料傳輸。TCP是面向連線的4層協議,它可以提供可靠傳輸,並且擁有擁塞控制機制。但是TCP的單路徑傳輸的協議,即便網路上存在多條路徑資源,也無法利用這些路徑資源。因為TCP是通過四元組:{源IP,目的IP,源埠,目的埠} 唯一的確定一個連線,當四元組中的任一項發生變化時,會導致連線中斷。因為應用程式使用TCP協議只能和單個四元組繫結,無法同時使用多個IP。使用MPTCP正好可以解決這個問題。
資料中心存在大量的路徑資源,使用MPTCP可以更加充分地利用頻寬資源,且提供可靠傳輸。資料中心最常使用的負載均衡演算法為ECMP,通過根據資料流的五元組雜湊,將這些資料均勻隨機的分散到權重相等的路徑上。這種隨機選路負載均衡第一個問題是會產生雜湊碰撞。如圖一所示,紅色路徑與藍色路徑產生了碰撞。另一個問題是,用這種最優權重(如最短路徑)的方法選出的路徑,無法判斷路徑是否存在擁塞,很可能將流量繼續傳送到一個已經擁塞的鏈路上。而使用MPTCP進行資料中心的負載均衡,在利用多路徑的同時,還可以對流量進行擁塞控制,避免產生擁塞,動態的將資料更多的傳送到負載低的鏈路上。有效的提高負載均衡效能。
2.MPTCP(Multipath TCP)協議介紹
簡單的說MPTCP是TCP的一個演進協議,MPTCP可以使TCP同時使用多條路徑進行通訊。MPTCP在協議棧上的位置如圖2所示。MPTCP在2013年被正式定為標準,詳細內容可參考RFC 6824 ofollow,noindex" target="_blank">https://tools.ietf.org/html/rfc6824。
MPTCP在設計上的挑戰
(1)對應用層透明,MPTCP對於原本基於TCP的應用應該是完全透明的,即不需要應用做出任何改變,也不需要重新編譯,即可像原來一樣正常工作。應用程式並不知道在4層工作的其實是MPTCP。
(2)對網路中介軟體透明,網路上存在很多中介軟體,例如防火牆,NAT,這些裝置往往是特製的硬體裝置,即便使用MPTCP協議,應允許資料順利的通過這些中介軟體裝置而不需要對中介軟體裝置做任何改變。
MPTCP會話建立過程
MPTCP會話通過建立多個子流來實現同時使用多條路徑傳輸資料,MPTCP子流的建立類似於TCP建立連線的過程。這些子流類似於正常的TCP連線,通過三次握手建立連線,四次揮手關閉連線。但這些子流都是繫結到一個已有的MPTCP會話上的。傳送端的資料可以選擇任意的子流進行傳輸。
例如:我們可以同時利用手機的WIFI和4G使用兩個IP來和WEB伺服器建立MPTCP會話。但若WEB伺服器只有1個IP地址,還可以建立MPTCP會話麼?其實是可以的,WEB伺服器可以使用不同的埠分別和手機的WIFI,4G建立連線。
建立MPTCP會話的過程:假設我手機選擇用4G開啟建立連線,過程如圖3所示,
1.手機會發送一個SYN資料包給WEB伺服器,這個資料包和TCP建立連線時傳送的一樣,只不過增加了TCP選項MP_CAPABLE欄位,表明手機端支援MPTCP協議,以及一個key(用於將來繼續新增子流時進行驗證)。
2.伺服器端迴應SYN+ACK資料包同樣包含TCP選項MP_CAPABLE欄位,以及一個key。
3.手機再次迴應ACK,此時建立了連線。
此時4G和WEB伺服器建立了連線,手機和WEB伺服器可以通過這個路徑傳輸資料,那麼如何新增WIFI和WEB伺服器的路徑呢?要想增加WIFI和WEB伺服器的路徑,首先要用WIFI和WEB伺服器實現完整的建立連線過程,才可以使用WIFI與WEB伺服器通訊,如圖4所示。這次連線和第一個4G與WEB伺服器建立的連線是有區別的。
(1)此時的SYN資料包中攜帶的TCP選項是MP_JOIN,並且向WEB伺服器提供足夠的資訊,說明其要加入的MPTCP會話,並確認它是安全的。其中token是前面4G與WEB伺服器建立連線的key的雜湊。rand是一個隨機數,HMAC是rand的雜湊。
(2)與第一次建立連線不同的是,這次要進行4此握手。目的是保證連線安全。
實際上,子流在MPTCP會話期間是可以動態的增加或刪除的,而且不會影響應用資料的傳輸。比如手機沒有了WIFI訊號,那麼資料可以繼續使用4G進行傳輸,而不會造成應用中斷。
MPTCP多個子流亂序問題
當我們使用MPTCP建立多條子流傳輸資料時,每條子流選擇的路由路徑可能不同,那麼路徑延遲也會不同。雖然傳送端按序傳送資料,但接收端接收到的資料可能產生亂序。既然TCP協議可以使用TCP報文頭中的序號,將資料包排序,那麼MPTCP是不是同樣也可以利用資料包中的序號進行排序?這樣是行不通的,因為每條路徑上的中介軟體(防火牆等)可能只有一半的資料經過,它會發現這些包的TCP序號存在間隙,中間盒可能會丟掉這些無序的資料,讓TCP重傳中間這些空缺的資料。
MPTCP通過增加每個子流的包序列號來解決這個問題。這個時候每個資料包有2個序列號,一個是在TCP包頭中的序列號,為子流的序列號;另一個是DSN(data sequence number)為所有傳輸資料的序列號,用於將各個子流的資料重排。那麼使用MPTCP收包,首先使用子流序列號,將各個子流接收到的資料包進行重組,然後使用DSN對各個子流報文重組。
MPTCP擁塞控制
TCP的擁塞控制機制可以根據網路鏈路情況動態的調整發送速率,我們不再贅述TCP擁塞控制的具體過程。那麼MPTCP建立多條TCP子流傳輸資料,和TCP的擁塞機制有了些許差別。
(1)MPTCP的擁塞控制要保證公平性,即使用MPTCP和使用TCP佔用的頻寬應該是相同的。
(2)使用MPTCP的效能至少要和傳統的TCP相持平,或者更好。
(3)使用MPTCP應能提供有效的負載均衡,減少資料在擁塞鏈路上傳輸。
MPTCP的每條子流的擁塞控制機制(慢啟動,擁塞避免,快重傳)與TCP是相同的。收到ACK時,增加擁塞視窗。發生丟包時,減少擁塞視窗的一半。不同的是子流擁塞視窗的調節方式,MPTCP中每個子流都有單獨的擁塞視窗,子流可以根據各自鏈路狀況動態的調節擁塞視窗,但要限制在整個MPTCP會話的視窗總量範圍內。子流擁塞視窗的調節方式如下所示:
子流發生丟包時,減少擁塞視窗的一半。
MPTCP效能
圖5為An overview of Multipath TCP文章中利用亞馬遜EC2資料中心的40臺機器內對使用MPTCP做負載均衡進行的測試,實驗對比了使用傳統TCP,2個子流的MPTCP和4個子流的MPTCP的效能。可以看出使用MPTCP確實在一定程度上提高了吞吐量。
3.總結
在之前的文章中,曾介紹過資料中心內使用ECMP演算法進行負載均衡,通過對資料包五元組雜湊為流選擇路徑,實現負載均衡。但使用ECMP存在諸多缺陷:
(1)過於簡單,沒有擁塞控制機制,因此在網路存在擁塞的情況下,使用ECMP可能會加劇路徑的擁塞。
(2)在非對稱網路架構下,ECMP的負載均衡效果並不好。
(3)ECMP這種基於流的負載均衡,不適合在資料中心這種老鼠流、大象流並存的環境中。
本文介紹了使用MPTCP協議做負載均衡,通過建立多條TCP子流的方式使用多條路徑傳輸資料。MPTCP可以提供有效的擁塞控制機制,而且切割資料流為多個子流解決,避免大象流這種流量大的資料流在一條鏈路上傳輸。其實,我們還可以對每條子流使用ECMP演算法,利用雜湊隨機選擇路徑,提高負載均衡效果。
不過MPTCP也不是一個完美的負載均衡方案,MPTCP存在以下幾個缺點:
(1)無法進行全域性路徑感知
如圖6所示的網路拓撲中,L0到L1的流,若只根據L0下一跳的鏈路狀態進行負載均衡,那麼很可能在S2-L1這段鏈路上發生擁塞。
(2)部署困難
要想使用MPTCP協議,需要在更改通訊雙方的協議棧,增加MPTCP協議,這為擴大MPTCP的使用範圍帶來的困難。
參考文獻:
[1]. Ford A, Raiciu C, Handley M, et al. Tcp extensions for multipath operation with multiple addresses, January 2013[J]. RFC6824.
[2]. Bonaventure O, Handley M, Raiciu C. An overview of Multipath TCP[J]. ; login:, 2012, 37(5): 17.
[3]. Raiciu C, Barre S, Pluntke C, et al. Improving datacenter performance and robustness with multipath TCP[C]//ACM SIGCOMM Computer Communication Review. ACM, 2011, 41(4): 266-277.