2009-10-13 65 views
2

我可以將多個Web服務器連接到SQL Server羣集並仍然維護用戶會話嗎?如何維護多個Web服務器的狀態?

我想過各種方法。微軟網站建議使用response.redirect到「正確」的服務器。雖然我能理解這一點的推理,但它似乎有些短視。

如果負載均衡器正在將您發送到當前處於最低壓力下的服務器,那麼作爲開發人員,您應該尊重這一點嗎?

在這種情況下是否有最佳做法?如果是這樣,我將不勝感激,瞭解它們的含義以及對使用它們的利弊的任何見解。

回答

2

某些選項:

負載均衡器可以配置爲有粘性會話。確保您的應用會話超時時間少於負載均衡器,否則您會因不可預知的結果而被反彈。

您可以使用指定的狀態服務器來處理會話。那麼它們在哪裏被LB反彈並不重要。

您可以使用SQL Server來管理會話。

在serverfault上檢查此項。 https://serverfault.com/questions/19717/load-balanced-iis-servers-with-asp-net-inproc-session

+0

*負載均衡器?你如何擺脫這種單點故障?如果負載平衡器死了,那麼是什麼? *是否有避免這種或不是的現實方法? – BobTheBuilder 2009-10-13 18:44:43

+0

至於使用SQL服務器來管理會話,這不會帶來它自己的可伸縮性問題嗎?即必須在每次頁面刷新時從數據庫獲取用戶數據? – BobTheBuilder 2009-10-13 18:47:05

+0

我實際上並沒有使用SQL服務器來管理,所以我不能說擴展性。我不會只有一個LB - 我會有2分鐘,可能多達5(2個產品,2個測試,1個開發) – Chuck 2009-10-13 19:13:49

0

雖然您可以在負載均衡器中使用「粘性」會話,但更優化的途徑是讓您的會話使用狀態服務器而不是InProc。此時,您的所有Web服務器都可以指向相同的狀態服務器和共享會話。

http://msdn.microsoft.com/en-us/library/ms972429.aspx MSDN有很多關於這個問題說:d

UPDATE:

狀態服務器是在Windows服務器箱服務,但是,是它產生單一故障點。

此外,您可以指定將會話序列化到SQL Server,如果您擁有它,它不會是單點故障。

我不確定狀態服務器的負載是多麼「沉重」,其他人是否有任何指標?

+0

只有一臺「狀態」服務器不僅不會引入單點故障,還意味着它也適用於所有服務器上的每個頁面請求?你如何解決這個問題? – BobTheBuilder 2009-10-13 18:43:44

0

這可能不是您正在尋找的答案,但是您能否消除會話狀態的NEED?我們已經竭盡全力在網頁本身的請求之間編碼任何我們可能需要的內容。這樣我就不用擔心農場內的狀態或者不得不掛上某個可能永遠不會回來的人擁有的東西的可擴展性問題。

+0

我們也考慮過這個問題,並且可能真的走上了這條路,所以並不是我不想聽到這些。只是我還沒有準備好做出這個決定。我想要桌上的所有選項,以便我可以做出明智的決定。我認爲這對其他開發者也有用。 – BobTheBuilder 2009-10-13 18:46:02

2

我在這裏從我的Java應用服務器的經驗,有些非常複雜的平衡算法。

一個合理的一般假設是「會話相關性」優於平衡每個請求。如果我們爲每個用戶分配一定程度的工作量知識(或者甚至是隨機的)並且人口來來去去,那麼我們最終會得到合理的行爲。請記住,目標是給每個用戶一個不錯的體驗,不要結束使用均勻使用的服務器!

如果發生服務器故障,我們可以看到我們的請求移動eleswhere,我們希望看到我們的會話轉移。很多方法可以實現這一點(DB中的會話,通過高速消息傳播的會話狀態......)。

+0

好的,如果原始服務器失敗或停止服務,會導致有關傳播會話狀態的問題。有沒有實現這一目標的最佳實踐? – BobTheBuilder 2009-10-13 18:54:24

+0

+1,優秀(IMO)的答案,我自己有幾乎相同的實質。 – AnthonyWJones 2009-10-13 18:54:27

+1

@BobTheBuilder:一種選擇是不要,把它放在下巴上繼續前進。嚴重的是,如果用戶一定不會失去我們認爲會在服務器崩潰的情況下會彈出什麼內容的關鍵,那麼Session對象不適合用於該數據。 – AnthonyWJones 2009-10-13 18:57:15