1. 程式人生 > >負載均衡過程中的一臺機器當掉了

負載均衡過程中的一臺機器當掉了

在現在的大型網站中,如何實現多臺伺服器中的session資料共享呢

    當使用多臺伺服器架設成叢集之後,我們通過負載均衡的方式,同一個使用者(或者ip)訪問時被分配到不同的伺服器上,假設在A伺服器登入,如果在B伺服器拿不到使用者的登入資訊session。這時訪問到B伺服器時就出現未登入情況。

    所以如何對於這種情況做到共享session至關重要。

   以下給出一些解決方案:(來源網路以及自己的一些見解)

  1.通過資料庫mysql共享session

     a.採用一臺專門的mysql伺服器來儲存所有的session資訊。

      使用者訪問隨機的web伺服器時,會去這個專門的資料庫伺服器check一下session的情況,以達到session同步的目的。 

      缺點就是:依懶性太強,mysql伺服器無法工作,影響整個系統;

    b.將存放session的資料表與業務的資料表放在同一個庫。如果mysql做了主從,需要每一個庫都需要存在這個表,並且需要資料實時同步。

    缺點:用資料庫來同步session,會加大資料庫的負擔,資料庫本來就是容易產生瓶頸的地方,如果把session還放到資料庫裡面,無疑是雪上加霜。上面的二種方法,第一點方法較好,把放session的表獨立開來,減輕了真正資料庫的負擔 。但是session一般的查詢頻率較高,放在資料庫中查詢效能也不是很好,不推薦使用這種方式。

2.通過cookie共享session

   把使用者訪問頁面產生的session放到cookie裡面,就是以cookie為中轉站。

   當訪問伺服器A時,登入成功之後將產生的session資訊存放在cookie中;當訪問請求分配到伺服器B時,伺服器B先判斷伺服器有沒有這個session,如果沒有,在去看看客戶端的cookie裡面有沒有這個session,如果cookie裡面有,就把cookie裡面的sessoin同步到web伺服器B,這樣就可以實現session的同步了。 

   缺點:cookie的安全性不高,容易偽造、客戶端禁止使用cookie等都可能造成無法共享session。

3.通過伺服器之間的資料同步session

  使用一臺作為使用者的登入伺服器,當用戶登入成功之後,會將session寫到當前伺服器上,我們通過指令碼或者守護程序將session同步到其他伺服器上,這時當用戶跳轉到其他伺服器,session一致,也就不用再次登入。

  缺陷:速度慢,同步session有延遲性,可能導致跳轉伺服器之後,session未同步。而且單向同步時,登入伺服器宕機,整個系統都不能正常執行。

4.通過NFS共享Session

選擇一臺公共的NFS伺服器(Network File Server)做共享伺服器,所有的Web伺服器登陸的時候把session資料寫到這臺伺服器上,那麼所有的session資料其實都是儲存在這臺NFS伺服器上的,不論使用者訪問那太Web伺服器,都要來這臺伺服器獲取session資料,那麼就能夠實現共享session資料了。

  缺點:依賴性太強,如果NFS伺服器down掉了,那麼大家都無法工作了,當然,可以考慮多臺NFS伺服器同步的形式。

5.通過memcache同步session

memcache可以做分散式,如果沒有這功能,他也不能用來做session同步。他可以把web伺服器中的記憶體組合起來,成為一個"記憶體池",不管是哪個伺服器產生的sessoin都可以放到這個"記憶體池"中,其他的都可以使用。 

  優點:以這種方式來同步session,不會加大資料庫的負擔,並且安全性比用cookie大大的提高,把session放到記憶體裡面,比從檔案中讀取要快很多。 

  缺點:memcache把記憶體分成很多種規格的儲存塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用記憶體,會產生記憶體碎片,如果儲存塊不足,還會產生記憶體溢位。 

6.通過redis共享session

redis與memcache一樣,都是將資料放在記憶體中。區別的是redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。

   根據實際開發應用,一般選擇使用memcache或redis方式來共享session.