1. 程式人生 > >Nginx負載均衡,同時實現session共享

Nginx負載均衡,同時實現session共享

前言:

在專案實踐中,有時我們需要多臺伺服器進行負載,以擴充套件伺服器的寬頻、增加吞吐量和提高網路資料的處理能力,從而提高使用者的體驗感,保證專案的質量。當一個專案部署在多臺伺服器上,我們習慣於使用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 {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
ip_hash;
}

優點:ip_hash演算法可以把一個ip對映到一臺伺服器上,這樣可以解決session同步的問題。這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題;

缺點:使用ip_hash進行session共享,它的原理是為每個訪問者提供一個固定的訪問ip,讓使用者只能在當前訪問的伺服器上進行操作,保持了session同步的,但是也造成了負載不均衡的問題,如果當前使用者訪問的伺服器掛了的話,那就會出現問題了;

參考部落格:https://blog.csdn.net/zdyueguanyun/article/details/57948393