Azure負載均衡機制與會話粘滯需求

其實寫這個博客的時候想先小小吐槽一下咱們的博客系統,我覺得第一希望我們的編輯器系統能夠升級一下,現在這個真算不上好用啊,例如貼圖只能上傳;如果用微軟Windows Live Writer連接MetaWebBlog方式格式轉換也不是很準確;另外類型選擇上我覺得應該與時俱進,雲計算,大數據,自動化這些內容都應該逐漸加入進來,這些部分真希望能夠得到改進!

好了,言歸正傳;先說說Azure的負載均衡模式,Azure最初的設計Cloud Service是一種雲計算可擴展結構PAAS服務,前端是Web接入層可以有多個實例,工作實例層次可以實現應用鬆耦合邏輯處理;接入層都是可以通過互聯網接入的每個外網服務部署都是通過外部軟件負載均衡器的外網連接的;因此發展至今提供了虛擬機的IAAS層服務,這個服務實際也是通過Cloud Service雲服務包裹的,在創建虛擬機時都會加入或者創建一個新的Cloud Service,創建的Cloud Service內通可用性集實現多個實例的高可用,那麼外部連接也希望實現網絡層次的高可用,這個當然需要網絡負載均衡器的支持;這也就是Azure的負載均衡器存在的意義。


這個內置的負載均衡器的特性和配置方法,可以參考MSDN Azure Load Balancer文檔,但是從這裏我們也可以看出這個負載均衡器算法策略比較簡單,就是一個五元組哈希負載均衡器(通過源端口+IP地址,協議TCP或UDP,目標端口+IP地址)分佈到後端虛擬機節點;當然也提供了探測策略例如探測指定健康檢查網頁並且根據返回狀態(例如IIS返回狀態不是200)判斷是否轉發。但是這裏可以看出有兩個侷限性,首先如果健康檢查希望實現一些高級功能例如插入腳本實現超時判斷等,另外一個關鍵的問題就是是否可以實現高級例如硬件提供的負載均衡器實現的會話粘滯功能;例如有些服務類似FTP或視頻服務,通常有個TCP控制端口有個傳輸UDP端口,如果不能實現會話粘滯根據五元組策略將會被轉發到不同的節點,這樣就有問題了。現在提供的五元組粘滯方式是基於會話Session的。同一個TCP或者UDP的會話會被轉發到後端的同一個虛擬機,當客戶端從同一個原地址關閉或重新打開連接並建立新的會話,那麼 如果原端口改變也會因爲5元組Hash計算後的不同被轉發到另一個後端虛擬機節點。


所以原來提供的解決方式是通過在WEB Farm負載前面通過Microsoft Application Request Routing (ARR)實現負載均衡,通過與現在開源很流行的Nginx或HAproxy很類似的"Cookie Insertion" 技術實現會話粘滯, 將所有需要作爲負載均衡的負載連接通過Azure負載均衡器全部轉發ARR服務器,因爲ARR部署在客戶端與後端虛擬機之間,可以截獲所有轉發請求,在根據負載均衡策略(ARR提供的負載均衡方式也比較豐富而不僅僅是輪詢方式,可以參考Microsoft Application Request Routing (ARR))選擇後端虛擬機,然後將在後端虛擬機服務器的響應中插入定製 包含虛擬機哈希值的HTTP Cookie,這樣後繼的客戶端連接都會根據這個Cookie返回的值發送到ARR再有ARR轉發到同一個後端虛擬機,這樣就實現了會話粘滯功能。通常部署方式如下圖。

爲了防止單點故障,因爲Azure提供的負載均衡器是高可用的,自己部署ARR也希望通過負載均衡高可用的話也需要通過構建ARR的可用性集,因此構建起來並不輕鬆。而且這種方式如果連接IIS環境的話需要IIS 7以上的版本;因此有沒有折中的方式呢?現在Azure負載均衡器已經開放了一種新的二元組方式了。

二元組方式實現的會話粘滯也稱爲IP親和性策略方式,這種方式下的Azure提供的負載均衡器只提供基於源IP地址和目標IP地址或源IP地址和目標IP地址加協議哈希轉發到後端。通過這種IP親和性策略可以實現同一個客戶端連接請求總是被轉發到指定的後端虛擬機(當然後端虛擬機狀態是OK的前提下)。

之所以要叫做折中方式是因爲目前這種方式也有侷限性,後端虛擬機節點變化都會造成哈希節點重新計算,因此同一個客戶端新的請求仍然會因爲這一改變被轉發到其他節點。另外,由於二元組策略的天然侷限性,如果多個客戶端通過NAT或者Proxy連接都會被視爲同一個源地址而容易造成這些請求總被轉發到指定節點造成不均衡負載的情況。

配置Azure二元組方式負載均衡器有三種途徑:

  • 通過Powershell或者Service Management API配置虛擬機端點負載均衡策略方式

  • 通過Powershell或者Service Management API配置負載均衡端點集合

  • 如果是PAAS Cloud Service實現的Web/Worker角色可以通過service model.進行配置。

通過Powershell的配置方法比較簡單,首先確保已經更新了最新的Powershell Azure Module

對已有虛擬機Azure端點配置負載均衡策略:

Get-AzureVM -ServiceName"TestService1" -Name"TestNode1" | Add-AzureEndpoint -Name"HttpIn" -Protocol"tcp" -PublicPort80 -LocalPort80 LoadBalancerDistribution "sourceIP"| Update-AzureVM

LoadBalancerDistribution有三個參數

  • sourceIP爲二元組

  • sourceIPProtocol爲三元組

  • none爲默認五元組。

也可以通過直接設置以後的已有負載均衡集的方式修改:

Set-AzureLoadBalancedEndpoint -ServiceName"TestService1" -LBSetName"TestSet1" -Protocol tcp -LocalPort80 -ProbeProtocolTCP -ProbePort80 LoadBalancerDistribution"sourceIP"


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章