2009-09-16 80 views
2

現在,我的站點由一臺服務器提供服務,但我預計很快需要增加服務器容量。我不想在多個服務器之間分割我的網站,而是需要跨服務器管理會話,我希望擁有多個具有相同代碼庫的Web服務器,並使用基於路由器的循環負載共享將用戶分配到每個服務器。而且一旦用戶點擊一個Web服務器,讓他在整個會話期間與該Web服務器保持聯繫。據我所知,我不需要任何特殊的asp.net代碼來實現這一點。ASP.NET站點的負載共享

沒有人有這種做法的任何警告或意見?

回答

1

你在說些什麼叫做粘性會話或會話親和力。如果你的路由器支持這一點,那麼你是黃金。

唯一caviat是負載平衡不會是完美的。如果你有幾個高負載用戶在同一臺​​服務器上隨機結束,他們將在那裏靜靜地等待會話結束。

我已經實現了這種負載均衡的,我的工作,而且不需要特殊的asp.net代碼來實現。

1

大多數(perhap全部)負載平衡器確實有強制執行,其中在同一個IP用戶定向到在每次請求相同的Web服務器「粘性」會話的能力。無需更改代碼即可完成此操作。有兩個注意事項可以想到:

  1. 使用粘性會話將意味着流量負載將不會像在不使用粘性會話時那樣平均分配。但是,分配應該是「足夠」IMO。
  2. 使用代理服務器的用戶中,只有很小比例的用戶可能會在不同的請求上使用不同的IP。這些用戶在傳遞到不同的服務器時可能會遇到「奇怪」的行爲。
1

此配置的另一個特點是,如果您的服務器出現故障,該服務器上的用戶會話也將丟失其會話。我認爲這是最常用的設置之一,因爲如果路由器支持粘性會話或會話親和性,它不需要任何開發工作。

1

正如其他人所說,你應該能夠打開粘性會話的負載平衡器,應該照顧大多數的「留一臺服務器上」的問題給你。

但是,您將希望確保您已設置適當的位置來處理用戶在錯誤的服務器中間會話中登陸 - 粘滯會話通常基於IP地址,並且如果您運氣不好,用戶IP可以更改中間會話,或者服務器可能會脫機,並且用戶將被引導至其他服務器。

你應該確保你的MachineKeys是所有服務器相​​同的 - 這將確保你能正確解密的視圖狀態的所有服務器上。

如果您有自己的服務器,你可以在machine.config做到這一點,否則你可以在web.config中的應用程序級別設置它,更多的細節可以在此找到如何:

Configure MachineKey in ASP.NET 2.0

如果您在IIS 7上運行,則會有一些細微的差異。5 - Tess Ferrandez在最近的帖子「Forms authentication fails after installing IIS 7.5」中有更多細節。

您可能要做的另一件事是將您的sessionState從InProc移到Sql或StateServer。

+0

@Zhaph - Ben Duguid:我是這方面的新手。你的評論增加了一些混淆。您的注意事項是針對Web場景,其中所有Web服務器都可以根據先前請求中的哪一個請求進行請求。雖然@langekg詢問有關基於IP地址提供所有請求的單個Web服務器。但是,如果他根據您的解決方案配置Web場,他應該能夠配置所有服務器可以根據負載來請求任何請求的內容。請你可以更新我的想法。 – Nirlep 2009-09-20 18:19:02

+0

Hi Neil,最初的問題是:「我希望有多個Web服務器都具有相同的代碼庫,並使用基於路由器的循環負載共享來將用戶分配給每個服務器。」 - 這對我來說聽起來像一個農場。將流量引導到基於IP的服務器是路由器的一項功能。我的答案是指出,在不改變他的代碼基礎的情況下,只需對配置進行一些調整即可,他將能夠在他的設置中添加彈性,以便如果服務器因任何原因而脫機,那麼用戶不會失去他們的會話,因爲它們被移動到其他服務器。 – 2009-09-21 07:49:26