ASP.NET效能最佳化之負載平衡

來源:互聯網
上載者:User
1:HTTP重新導向

所謂HTTP重新導向,就是通過修改HTTP回應標頭中的Location標識為新的URL,然後返回給用戶端,讓用戶端重新根據這個Location標識的URL去做新的請求。

這是一種最簡單、也是最輕量級的負載平衡實現方案,使用asp.net,我們可以這樣來實現,比如在主站www.yourdomain.com中,我們在預設首頁如下編碼:

?
static string[] servers =         {            "http://192.168.0.77/luminji2/aspx/test3.aspx",            "http://192.168.0.77/luminji2/aspx/test4.aspx"        };protected void Page_Load(object sender, EventArgs e){    Response.Redirect(servers[DateTime.Now.Millisecond % 2]);}

在上面的代碼中,Response.Redirect實際為http頭返回狀態代碼302,這是為了告訴瀏覽器,請到Location中去拿URL,並且去到這個新的URL去做請求。當然,我們也可以採用最原始的方法來代替Redirect方法:

?
Response.Status = "302 Found";Response.StatusCode = 302;Response.AddHeader("Location", servers[DateTime.Now.Millisecond % 2]);

使用HttpWatch監視,我們對www.yourdomain.com請求,得到:

可以清晰的看到第一次請求返回的302,然後轉寄到新的地址,得到狀態代碼200。

以上方法是在用戶端的重新導向,即瀏覽器請求了兩次,一次是到主伺服器,第二次是到Location中指定的伺服器上去請求。

HTTP重新導向的方式非常依賴於主站的處理能力,它的效能瓶頸也是來自於IIS對於接受請求->asp.net處理首頁動態程式->返回帶有特定頭請求,是的,它不能突破自身的效能瓶頸,比如,在我的破測試機上,我得到的吞吐率為:

好在IIS自身已經支援重新導向(查閱http://technet.microsoft.com/zh-cn/library/cc732969(WS.10).aspx),這更進一步省略了我們自己寫代碼實現重新導向,省略運行ASP.NET代碼帶來的效能損耗。

2:varnish實現的反向 Proxy負載平衡

另外一種思路是使用反向 Proxy伺服器的負載平衡功能,上篇當中介紹的varnish就支援這樣的功能,查看設定檔:

?
backend web1 {     .host = "192.168.0.77";     .port = "8081";     }backend web2 {     .host = "192.168.0.77";     .port = "8082";}director lb round-robin {    {        .backend = web1;    }    {        .backend = web2;    }} sub vcl_recv {     set req.backend = lb;     return (pass); }

在該設定檔中,我們部署了兩台WEB伺服器,當然,為了簡單期間,我這裡是使用了同一台伺服器的兩個連接埠。在vcl_recv函數中,varnish定義了負載平衡。

運行varnish之,我們會發現請求被轉寄到後台伺服器了。

3:其它方案

1:DNS負載平衡,通過增加網域名稱A記錄來讓DNS伺服器實現負載平衡。好處是幾乎不會碰到效能問題。缺點:要求每個WEB伺服器必須有外網地址。一旦某台伺服器崩潰,不能及時讓DNS修改生效。不能定義自己的轉寄策略;

2:IP負載平衡,有LVS-NAT,採用iptables,對LINUX核心操作,效能相對於反向 Proxy伺服器並沒有質的飛躍;IP負載平衡仍舊需要轉寄請求給實際伺服器,同時需要轉寄實際伺服器的響應給使用者,所以,它的效能瓶頸來自於NAT伺服器的效能及網路頻寬;

3:直接路由,有LVS-DR,工作在資料連結層(第二層),要求所有WEB伺服器接入外網;負載平衡器負責轉寄請求給實際伺服器,但是它通過修改資料包中的MAC地址,能夠做到讓實際伺服器的響應直接返回給使用者,而不用通過負載平衡器,這當然進一步提升了負載平衡的效率;

4:IP隧道,有LVS-TUN,用於不同機房(即不同WAN網段)的負載平衡,原理同LVS-DR;

 

  

本文出處:http://www.cnblogs.com/luminji/ 
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連。

所謂HTTP重新導向,就是通過修改HTTP回應標頭中的Location標識為新的URL,然後返回給用戶端,讓用戶端重新根據這個Location標識的URL去做新的請求。

這是一種最簡單、也是最輕量級的負載平衡實現方案,使用asp.net,我們可以這樣來實現,比如在主站www.yourdomain.com中,我們在預設首頁如下編碼:

?
static string[] servers =         {            "http://192.168.0.77/luminji2/aspx/test3.aspx",            "http://192.168.0.77/luminji2/aspx/test4.aspx"        };protected void Page_Load(object sender, EventArgs e){    Response.Redirect(servers[DateTime.Now.Millisecond % 2]);}

在上面的代碼中,Response.Redirect實際為http頭返回狀態代碼302,這是為了告訴瀏覽器,請到Location中去拿URL,並且去到這個新的URL去做請求。當然,我們也可以採用最原始的方法來代替Redirect方法:

?
Response.Status = "302 Found";Response.StatusCode = 302;Response.AddHeader("Location", servers[DateTime.Now.Millisecond % 2]);

使用HttpWatch監視,我們對www.yourdomain.com請求,得到:

可以清晰的看到第一次請求返回的302,然後轉寄到新的地址,得到狀態代碼200。

以上方法是在用戶端的重新導向,即瀏覽器請求了兩次,一次是到主伺服器,第二次是到Location中指定的伺服器上去請求。

HTTP重新導向的方式非常依賴於主站的處理能力,它的效能瓶頸也是來自於IIS對於接受請求->asp.net處理首頁動態程式->返回帶有特定頭請求,是的,它不能突破自身的效能瓶頸,比如,在我的破測試機上,我得到的吞吐率為:

好在IIS自身已經支援重新導向(查閱http://technet.microsoft.com/zh-cn/library/cc732969(WS.10).aspx),這更進一步省略了我們自己寫代碼實現重新導向,省略運行ASP.NET代碼帶來的效能損耗。

2:varnish實現的反向 Proxy負載平衡

另外一種思路是使用反向 Proxy伺服器的負載平衡功能,上篇當中介紹的varnish就支援這樣的功能,查看設定檔:

?
backend web1 {     .host = "192.168.0.77";     .port = "8081";     }backend web2 {     .host = "192.168.0.77";     .port = "8082";}director lb round-robin {    {        .backend = web1;    }    {        .backend = web2;    }} sub vcl_recv {     set req.backend = lb;     return (pass); }

在該設定檔中,我們部署了兩台WEB伺服器,當然,為了簡單期間,我這裡是使用了同一台伺服器的兩個連接埠。在vcl_recv函數中,varnish定義了負載平衡。

運行varnish之,我們會發現請求被轉寄到後台伺服器了。

3:其它方案

1:DNS負載平衡,通過增加網域名稱A記錄來讓DNS伺服器實現負載平衡。好處是幾乎不會碰到效能問題。缺點:要求每個WEB伺服器必須有外網地址。一旦某台伺服器崩潰,不能及時讓DNS修改生效。不能定義自己的轉寄策略;

2:IP負載平衡,有LVS-NAT,採用iptables,對LINUX核心操作,效能相對於反向 Proxy伺服器並沒有質的飛躍;IP負載平衡仍舊需要轉寄請求給實際伺服器,同時需要轉寄實際伺服器的響應給使用者,所以,它的效能瓶頸來自於NAT伺服器的效能及網路頻寬;

3:直接路由,有LVS-DR,工作在資料連結層(第二層),要求所有WEB伺服器接入外網;負載平衡器負責轉寄請求給實際伺服器,但是它通過修改資料包中的MAC地址,能夠做到讓實際伺服器的響應直接返回給使用者,而不用通過負載平衡器,這當然進一步提升了負載平衡的效率;

4:IP隧道,有LVS-TUN,用於不同機房(即不同WAN網段)的負載平衡,原理同LVS-DR;

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.