1. 程式人生 > >session共享問題(二)----叢集中的session共享問題

session共享問題(二)----叢集中的session共享問題

問題描述:

現在一般的公司在解決高併發,高訪問量,一般都會採用叢集/分散式環境。但這有會出現一個問題,如何分享session。在nginx的負載均衡下,使用者user訪問同一個頁面2次,會分配到不同的伺服器上A,B,如果沒有解決session共享問題,那麼就會出現在A伺服器上登入過,第二次訪問B伺服器上的那個頁面時又要登入的情況。

解決的方法:

1、粘性session

上面我們講到在叢集情況下,我們在通過nginx訪問同一個頁面多次,可能會訪問不同伺服器上的同一個頁面,session不同步的問題會導致使用者必須在同一個頁面登入兩次。

粘性session就是改變nginx負載均衡的策略。下面我們將簡略的講述nginx的幾種策略。

  一、nginx的upstream目前支援負載均衡方式的分配
1、RR(預設)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
例如:
upstream tomcats {
server 10.1.1.107:88  max_fails=3 fail_timeout=3s weight=9;
server 10.1.1.132:80  max_fails=3 fail_timeout=3s weight=9;
}

2、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
例如:
upstream tomcats {
ip_hash;
server 10.1.1.107:88;
server 10.1.1.132:80;
}

3、fair(第三方)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

4、url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。

所以我們可以採用ip_hash的策略使得一個使用者ip只能一直訪問特定的某一臺伺服器,所以之前的那種情況也就不會發生。

優點:不需要再session分享上做處理,因為本身就是隻訪問一臺伺服器

缺點:就是容錯性很差!!如果當前訪問的伺服器發生故障,使用者被轉移到第二個伺服器上時,他的session資訊都將失效。

使用場景:發生故障對客戶產生的影響較小;伺服器發生故障是低概率事件。

2、session複製

原理:任何一個伺服器上的session發生改變(增刪改),該節點會把這個 session的所有內容序列化,然後廣播給所有其它節點,不管其他伺服器需不需要session,以此來保證Session同步。

優點:可容錯,各個伺服器間session能夠實時響應。

缺點:會對網路負荷造成一定壓力,如果session量大的話可能會造成網路堵塞,拖慢伺服器效能。

實現方式:在tomcat,server.xml開啟叢集session複製功能