在專案實踐中,有時我們需要多台伺服器進行負載,以擴充套件伺服器的寬頻、增加吞吐量和提高網路資料的處理能力,從而提高使用者的體驗感,保證專案的質量。當乙個專案部署在多台伺服器上,我們習慣於使用nginx做負載均衡,這樣同乙個ip訪問專案的時候會被自動分配到不同的伺服器上;
但是,如果多台伺服器的session不同步的話,則會導致很多問題,比如我們的登入狀態、使用者資訊、數字字典等都會歸零,都需要重新登入之後才能獲取到,這樣給使用者的體驗感就會很差,所以在多台伺服器進行負載均衡的時候我們就得要考慮到多台伺服器之間的session同步了,下面提供幾種解決方案:
1、使用客戶端的cookie作為存放登入資訊的媒介
cookie是將使用者登入資訊儲存在使用者終端的資料載體,與session的最大區別就是,session是儲存在伺服器端的;所以這就很容易解決這種session的多台伺服器共享問題。當我們客戶端進行登入的時候,訪問的是伺服器a,登入成功之後我們將session抽取出來存放在客戶端的cookie裡面;然後當我們客戶端第二次進行訪問的時候,訪問的是伺服器b,這次我們先在伺服器b去查詢是否有登入成功的session,如果為空,我們再對客戶端的cookie進行查詢,如果cookie裡面已經儲存有session,那麼再將cookie裡面的session同步到伺服器b,那麼整個流程就能走通了,使用者也不用再次登入;
優點:這種方法實現起來簡單,方便,很容易上手操作,不會加大資料庫的負擔;
缺點:如果客戶端把cookie禁掉了的話,那麼session就無法同步了,而且cookie的安全性不高,很容易外部被偽造使用;
2、使用mysql資料庫儲存session
既然每個伺服器都需要使用同乙個session,那麼我們可以將session存放在同乙個資料庫裡面,每次訪問的時候,我們去資料庫check一下是否有這個session或者這個session是否過期,然後就可以進行多台伺服器的session同步了;
優點:使用這種方法簡單、方便,很容易上手操作;
缺點:使用資料庫來同步session,會加大資料庫的io,增加資料庫的負擔;同時,每次訪問都需要攔截請求、查詢資料庫,導致多一層訪問的業務層以及浪費讀取資料庫session時間;
3、使用memcache或者redis等快取機制存放session
使用memcache或者redis等分布式快取機制存放session資料,是現在很多大型專案負載均衡同步session的熱門方案;它的原理是專案都使用的是同乙個地方的memcache或者redis的快取,當使用者登入的時候,會把session存放在快取裡面,之後不管訪問的是專案的那一台伺服器,都會從同乙個地方去獲取session快取,這樣就很輕鬆實現了session同步;
優點:用快取來同步session,不會加大資料庫的負擔,也不用手動去判斷session是否存在或過期,省去部分業務邏輯,同時,由於redis等快取是存放於伺服器端,安全性也大大提高;
缺點:memcache或redis把記憶體分成很多種規格的儲存塊,有塊就有大小,這種方式也就決定了,memcache或redis不能完全利用記憶體,會產生記憶體碎片,如果儲存塊不足,還會產生記憶體溢位。
4、ip_hash
nginx中的ip_hash技術能夠將某個ip的請求固定到同一台後端應用伺服器,這樣一來這個ip下的某個客戶端和某個後端就能建立起穩固的session,ip_hash是在upstream配置中定義的:
upstream backend
優點:ip_hash演算法可以把乙個ip對映到一台伺服器上,這樣可以解決session同步的問題。這樣每個訪客固定訪問乙個後端伺服器,可以解決session的問題;
缺點:使用ip_hash進行session共享,它的原理是為每個訪問者提供乙個固定的訪問ip,讓使用者只能在當前訪問的伺服器上進行操作,保持了session同步的,但是也造成了負載不均衡的問題,如果當前使用者訪問的伺服器掛了的話,那就會出現問題了;
參考部落格:
Nginx實現負載均衡
負載均衡 建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬 增加吞吐量 加強網路資料處理能力 提高網路的靈活性和可用性。負載均衡,英文名稱為load balance,其意思就是分攤到多個操作單元上進行執行,例如web伺服器 ftp伺服器 企業關鍵應用伺服器和其它關...
nginx實現負載均衡
目錄結構 conf 配置目錄 html 靜態頁面目錄 logs 日誌目錄 sbin 主程式 nginx支援的負載均衡方式 輪詢 預設 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。weight 指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的...
nginx實現負載均衡
初步設想 1個前端伺服器 n個應用伺服器,實現不宕機發布。前提 後端應用共享session,可以考慮redis實現。初步實驗 nginx 2個tomcat執行測試 先準備乙個nginx,nginx.conf檔案內容如下 然後準備2個tomcat 設定埠分別為8084 8086。在root資料夾下面各...