對應用伺服器做了負載平衡之後如何保持session等記錄使用者登入狀態的會話資訊?用cookie?但是這樣覺得不太安全。
回複內容:
對應用伺服器做了負載平衡之後如何保持session等記錄使用者登入狀態的會話資訊?用cookie?但是這樣覺得不太安全。
幾個思路:
1 、負載演算法採用 IP hash ,把每次相同 IP 的請求轉寄到同一台 Web 服務器上。
缺點是不能有效利用到所有的 Web 服務器來做均衡負載,一般負載演算法都是 Round Robin 。
2 、重寫 session handler , 把 session 用資料庫來儲存。
缺點是訪問量高的情況下,IO 吞吐太高的話會影響網站效能。
3 、把 session 的預設儲存路徑設定為 NFS 上的一Block Storage地區,這樣所有的 Web 服務器就可以共用了。
缺點是一旦 NFS 掛了,session 就再也沒有辦法使用了。
4 、最簡單的,把 php.ini 裡的 session save handler 設定為 memcache 或者 redis。
推薦用 memcache 。如果用 redis 的話,目前沒有好用的 cluster 解決方案,而來 redis 還會把資料回寫到硬碟上,完全沒必要。而 memcache 只需要很少的配置就能做 cluster ,資料操作完全在記憶體裡,速度杠杠滴。
cookie存一個key,具體資訊存在資料庫裡,可以用memcache/redis這些基於記憶體的key-value儲存來加速
@socrates 提供了一個方法,另外也可以通過對IP做hash把相同使用者的請求發送到同一後端,nginx就有這種簡單的會話保持功能。
負載平衡會話保持,同一使用者請求發送到一台伺服器。這個比較靠譜。
很關鍵工號
- 負載平衡的會話黏滯,會增加負載平衡的負擔,因為需要記錄IP和上遊伺服器的對應關係
- session存在key-value資料庫中。將key存cookie,value存資料庫。key一般是很複雜的,很難猜到,所以就算用cookie存也不會有什麼嚴重的問題。推薦這種做法,實現起來也不難,key-value資料庫也可以避免單點故障的
使用統一的 session服務 可以儲存到 mc 或者 redis
可以把它存入結構性儲存(memcached之類的)