1. 程式人生 > >解決北京pk10平臺搭建負載均衡的session共享問題

解決北京pk10平臺搭建負載均衡的session共享問題

mys 響應時間 最好的 因此 存在 設備 技術 pass sso

之前有寫過ubuntu環境下搭建北京pk10平臺搭建環境,今天來談一下nginx session共享問題,查了一些資料,看了一些別人寫的文檔,總結如下,實現nginx session的共享服務器有多臺,用nginx做負載均衡,這樣同一個IP訪問同一個頁面會被分配到不同的服務器上,如果session不同步的話,就會出現很多問題,比如說最常見的登錄狀態,下面提供了幾種方式來解決session共享的問題:

1、不使用session,換用cookie

session是存放在服務器端的,cookie是存放在客戶端的,我們可以把用戶訪問頁面產生的session放到cookie裏面,就是以cookie為中轉站。你訪問web服務器A,產生了session然後把它放到cookie裏面,當你的請求被分配到B服務器時,服務器B先判斷服務器有沒有這個session,如果沒有,再去看看客戶端的cookie裏面有沒有這個session,如果也沒有,說明session真的不存,如果cookie裏面有,就把cookie裏面的sessoin同步到服務器B,這樣就可以實現session的同步了。

說明:這種方法實現起來簡單,方便,也不會加大數據庫的負擔,但是如果客戶端把cookie禁掉了的話,那麽session就無從同步了,這樣會給網站帶來損失;cookie的安全性不高,雖然它已經加了密,但是還是可以偽造的。

2、session存在數據庫(MySQL等)中

可以配置將session保存在數據庫中,這種方法是把存放session的表和其他數據庫表放在一起,如果mysql也做了集群了話,每個mysql節點都要有這張表,並且這張session表的數據表要實時同步。

說明:用數據庫來同步session,會加大數據庫的IO,增加數據庫的負擔。而且數據庫讀寫速度較慢,不利於session的適時同步。

3、session存在memcache或者redis中

memcache可以做分布式,程序配置文件中設置存儲方式為memcache,這樣程序自己會建立一個session集群,將session數據存儲在memcache中。

說明:以這種方式來同步session,不會加大數據庫的負擔,並且安全性比用cookie大大的提高,把session放到內存裏面,比從文件中讀取要快很多。但是memcache把內存分成很多種規格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出。

4、nginx中的ip_hash技術能夠將某個ip的請求定向到同一臺後端,這樣一來這個ip下的某個客戶端和某個後端就能建立起穩固的session,ip_hash是在upstream配置中定義的:

upstream nginx.example.com
{
server 127.0.0.1:8080;
server 127.0.0.1:808;
ip_hash;
}
server
{
listen 80;
location /
{
proxy_pass
http://nginx.example.com;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ip_hash是容易理解的,但是因為僅僅能用ip這個因子來分配後端,因此ip_hash是有缺陷的,不能在一些情況下使用:

<1>nginx不是最前端的服務器。

ip_hash要求nginx一定是最前端的服務器,否則nginx得不到正確ip,就不能根據ip作hash。譬如使用的是squid為最前端,那麽nginx取ip時只能得到squid的服務器ip地址,用這個地址來作分流是肯定錯亂的。

<2>nginx的後端還有其它方式的負載均衡。

假如nginx後端又有其它負載均衡,將請求又通過另外的方式分流了,那麽某個客戶端的請求肯定不能定位到同一臺session應用服務器上。這麽算起來,nginx後端只能直接指向應用服務器,或者再搭一個squid,然後指向應用服務器。最好的辦法是用 location作一次分流,將需要session的部分請求通過ip_hash分流,剩下的走其它後端去。

5、upstream_hash

為了解決ip_hash的一些問題,可以使用upstream_hash這個第三方模塊,這個模塊多數情況下是用作url_hash的,但是並不妨礙將它用來做session共享。
<1>fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。

upstream resinserver{
server server1;
server server2;
fair;
}

1
2
3
4
5

<2>url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器為緩存時比較有效。
例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法

upstream resinserver{
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
tips:

upstream resinserver{#定義負載均衡設備的Ip及設備狀態
ip_hash;
server 127.0.0.1:8000 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6801;
server 127.0.0.1:6802 backup;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

在需要使用負載均衡的server中增加

解決北京pk10平臺搭建負載均衡的session共享問題