負載均衡淺析 |
- 主要淺析負載均衡解決了併發問題,但是導致的session問題。
爲什麼會有session問題? |
(1)負載均衡解決的問題和引入的問題
- 負載均衡可以解決併發問題
- 負載均衡帶來的問題:session問題。
- 爲什麼會存在session問題:
a.http協議的特性(①無狀態 ②有連接 ③短連接)
b.由於http協議本身的設計問題加上現在WEB網頁的發展(網頁後端程序動態生成) ==> 需要保持一個會話狀態。
帶來session問題的原因? |
一個連接將佔據WEB server一個socket和一個文件描述符fd,在高併發的場景下,服務器端承受不了與客戶端一直保持連接,因此在http短連接的基礎上實現連接複用(keepalived)。
目前的動態網頁技術時,需要知道上一次請求和這一次請求之間是否屬於同一用戶?是否有關聯性?因此需要知道是否有關聯性?就必須保持狀態。eg:登錄
session與cookie 見下面(3)
session與cookie? |
cookie:客戶端數據的持久化技術,保存在瀏覽器。server端將cookie發給瀏覽器,瀏覽器收到cookie一般會按域保存cookie,然後再發起對某域請求時,將在request請求的header中攜帶沒有過期的cookie發送至WEB server。(注:無論是不是動態WEB server均可以設置cookie,cookie是http數據報文header的一部分)。
session依賴於cookie,在cookie中設置一個特殊的cookie的值(key-value),eg:sessionID=“hash string(哈希字串)”,但是將sessionID="hash string(哈希字串)"這變成會話級存儲,讓WEB server將sessionID=xxx保存,當瀏覽器關閉,sessionID=xxx才立即銷燬(用於保存當前會話狀態)
- 瀏覽器支持cookie,瀏覽器中的代碼會對過期的代碼進行清理(sessionID過期)或者會話級的sessionID,關閉瀏覽器,瀏覽器就清理會話級sessionID。因爲sessionID不會存至磁盤,在內存中保存着。當然這是’ 正經的瀏覽器 ',如果假設自己編寫一個瀏覽器,將sessionID保存於磁盤,也是可以的,這說明WEB框架中或者作爲server端,client的一切東西都是不可信的。
對於動態服務器,一般都會對初次訪問的client發送sessionID,用於保存當前client的會話狀態,目前是動態服務器的標準配置,動態服務器會在內存中開闢出一段空間生成session並保存session。注意:動態服務器端開闢的空間可不僅僅保存sessionID,但是發送給client的僅僅是sessionID。
瀏覽器訪問web server圖示過程:
session的解決方案? |
-
①源地址hash或者基於cookie hash,然後將其請求一直綁定至後端某一動態服務器。<存在問題:指標不治本,萬一後端動態服務器故障><不推薦使用這種解決方案>
-
②session複製:讓後端所有的動態服務器實現session同步。<存在問題:對內網絡和後端服務器內存消耗均是極大> <使用場景:後端服務器較少,數據較少>
-
③session共享:②也要經過網絡,反正都要經過網絡傳輸數據,那麼直接使用緩存服務保存session信息,實現後端動態服務器的session同步。<目前一般使用的解決方案>
session共享? |
-
目前session共享服務使用最多的:redis 和 memcache.
-
實現session共享涉及到跨主機跨進程通信(是否跨主機,要看緩存服務部署在哪個位置了)。
<進程間通信:https://blog.csdn.net/wdirdo/article/details/103135648>