什么叫負載均衡中的session保持
當我們需要做負載均衡時,服務端肯定有多台服務器,用戶每次請求進來,會根據負載均衡算法被分配到某一台機器上,假設用戶需要進行一段連續操作時,在第一台機器登陸后,下一個操作被安排到了另一台機器,如果沒有做會話同步,那這台機器肯定沒有他之前的一些操作信息,如登陸狀態等,所以負載均衡下的session保持就變得不簡單了。
解決的方法
ip_hash
將來訪者IP進行HASH后分配到對應的機器上,這樣保證同一個IP會一直在一台機器上,這樣session就不會因為換機器而斷。
缺點:
-
多個客戶端共用一個IP時,那被分配到的服務器就慘了。
-
一個客戶端並發太大時,對接收他請求的服務器也是壓力。
-
如果某台服務器掛了,那一堆分配到這台機器的請求就都跪了。
存session
把session存下來,這樣每台服務器都能從公共存儲中的session來獲取客戶端狀態,保證會話的延續。
存數據庫
占用數據庫資源,高並發時,數據庫瓶頸。
存文件里
高並發時硬盤I/O性能是瓶頸。
存Memcached/Redis
是挺快的,但因為是在內存里,宕機就沒了,session太多時,老的session就會被刪。
利用cookie
第一次請求時,分配完服務器后,負載均衡器給response寫個cookie,把給它的機器記下來,下次來了還是那台服務器接客。
cookie的插入和取出分析,都是在負載均衡器中進行的,客戶端和服務器都不知道。
會話復制
就是把每個服務器節點都復制一份全量的session,沒研究過,不過一聽就感覺不太靠譜。
總結
把一個用戶捆在某一台服務器上的做法可以叫做會話保持;每台機器都存一個相同發復制品,叫做會話復制;把會話放一個共同地方,所有服務器都從這取,叫會話共享。
會話保持方案指定了機器,其實負載也就不均衡了,而且如果某台服務器宕機了,那這台機器的session也就都沒了,新請求被分到別的機器,還得重頭來。
會話共享方案還算靠譜。