redis - Nginx負載平衡策略和SESSION共享
習慣沉默
習慣沉默 2017-04-25 09:04:41
0
1
636

叢集WEB應用或多或少都會遇到session問題,在多台伺服器的情況下,session的要地儲存會造成一些問題,影響使用者體驗。

下面列出這裡我能想到的幾種處理方法,各有優缺點

  • 配置Nginx負載策略,例如ip_hash,使客戶端綁定在固定伺服器上,這樣最終用戶存取到的機器是固定的,所以session儲存在本地,不影響用戶使用。但缺點主要有兩項:

  1. ip_hash分配並不均勻,尤其是用於ip_hash的Nginx不是最前端時,可能無法使用此策略

  2. 假如不考慮負載均勻問題,仍然存在的問題是,當後端某台機器宕掉時,這台機器上所有的session都會失去,假如session中記錄的用戶的認證狀態,那麼使用者將變成未認證狀態

  • 伺服器(Nginx代理的伺服器)間進行session廣播,這種方式存在的問題是,隨著叢集規模的擴張,廣播的效能會變得很差,一般不建議使用

  • 使用session共享方案,具體使用redis還是使用memcached這裡不討論,這裡假設使用redis,方法也很簡單,將session的存儲實現red可以使用HttpServletRequestWrapper方式來動態修改sessionmemcached-session-manager或者spring-session等實現,除了集中存儲對性能(相對於本地存儲)

    spring-session
  • 等實現,除了集中存儲對性能(相對於本地存儲)。實現程式碼夠強壯
  • 個人也想了一個有缺陷的辦法,反正也只是設想,從來沒用過。 session廣播的方式隨著叢集規模擴大,效能會下降,那麼就不所有機器間廣播,可以兩台、三台之間廣播,假設以兩台為一組,所有叢集中的伺服器,以兩台為單位分組,相互廣播

    session
  • ,這時只需要保證相互廣播的兩台機器不同時掛掉即可(^_^ 貌似無法保證的吧!)

除了上面一的些方法,肯定還有其它辦法,有興趣的進來討論一下

補充紀錄
[2016/9/1]個人認為完全可以避免使用sessionservlet系的應用做分佈式本就有很多限制,如果要實現分佈式,最好的辦法是利用http的無狀態特性來實現,當然,用戶登入、購物車等資訊確實需要進行狀態存儲,這些完全可以直接存儲到第三方存儲中,例如:redismysql等,其本質上類似於

session 🎜共享方案,但相對更加激進。 🎜
習慣沉默
習慣沉默

全部回覆(1)
过去多啦不再A梦

你這裡所說的session絕對部分說的是存登入資訊吧?

如果是,那麼統一登入服務應該也是一種方案

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!