天天看點

nginx+tomcat叢集redis共享session方案實戰案例一、常見的session一緻性方案二、應用環境介紹三、nginx+tomcat+redis部署過程四、測試nginx+tomcat+redis的session共享功能

Nginx+tomcat叢集redis共享session實戰(支援tomcat6/7/8/9)https://edu.51cto.com/course/18398.html

在web叢集系統中,為了使web能适應大規模的通路,需要實作應用的叢集部署. 而實作叢集部署首先要解決session的統一,即需要實作session的一緻性,目前,實作session一緻性主要有兩個方案,分别是session複制和session共享。

session複制,是指session資訊會在叢集節點之間複制,每個節點伺服器上都會有相同的session資訊。 這種方案的優點是即使一個節點伺服器當機了,隻要還有伺服器存活,session資訊就不會丢失,也就不影響使用者使用。而缺點是叢集節點之間通信頻繁,對應用的響應速度有影響,在高并發、高頻操作的情況下性能下降會更厲害。

第二種方案是session共享,也就是将session資訊儲存在記憶體資料庫中,然後多個節點都可以來通路記憶體中的session資訊,最常見的就是基于Memcache/Redis等資料庫的session共享。

tomcat自帶叢集中,提供了session複制功能,session資訊會在各個tomcat中同步,session複制對網絡要求較高,session記憶體的消耗對tomcat影響非常大,對于小叢集來說,這種session複制基本夠用了,而對于大型叢集,還是建議使用redis或者memcache進行session共享。

是以,在建構tomcat叢集時,推薦使用tomcat基于redis的session共享機制。

在通過nginx建構叢集時,也會涉及session的問題,根據設定的nginx負載均衡算法的不同,session的實作機制也不相同,例如輪詢(預設),指定權重,fair(第三方),url_hash(第三方)負載算法時,叢集各個節點之間必須通過session共享來實作。而使用IP綁定的 ip_hash算法時,使用者的請求都會綁定在同一個節點伺服器上,可不考慮session問題。但是,節點伺服器當機後,使用者需要關掉浏覽器重新打開登入才能恢複正常,這樣體驗會變得很差。是以,session共享在叢集架構中有很大的用途。

1、session應用工具

Tomcat叢集在企業應用中使用比較多,是以,必須要解決session共享的問題。這裡主要介紹一個簡單的session共享方案:redisson工具。

redisson是redis官網推薦的java語言實作分布式鎖的項目。當然,redisson遠不止分布式鎖,還包括其他一些分布式結構。例如,分布式應用,分布式緩存,分布式回話管理,分布式服務(任務,延遲任務,執行器),分布式redis用戶端等。而我們這裡要使用的是redisson提供的Tomcat Session Manager功能。它支援最新的JDK和各個版本的tomcat(6/7/8/9),redisson官網位址為https://redisson.org/ 。

而Tomcat session共享的github位址為:

https://github.com/redisson/redisson/tree/master/redisson-tomcat

讀者可根據自己不同的tomcat版本,選擇下載下傳不同的redisson即可。

2、環境準備

首先說明下此案例的應用環境,如下表所示:

這是一個nginx與tomcat組合的web架構,兩台tomcat組成叢集,通過nginx實作負載均衡,而在這個叢集中的session機制我們通過redis來實作session共享,下面就來看看這個叢集架構中如何實作tomcat叢集中的session共享。

這個web架構的部署過程很簡單,主要分為三個步驟,下面依次介紹。

1、redis安裝部署

redis安裝部署比較簡單,首先從https://redis.io 下載下傳最新版本的redis,這裡下載下傳的是redis5.x版本,然後編譯即可,過程如下:

2、配置redis并啟動

對redis不需要過多配置,打開redis配置檔案/etc/redis.conf,修改兩個配置項的值為如下内容:

最後,啟動redis服務即可:

3、tomcat安裝部署

這裡先在172.16.213.120這台機器上部署tomcat,部署tomcat之前,需要先安裝JDK,這裡選擇JDK1.8版本,從oracle官網下載下傳linux-64版本的JDK,下載下傳時,選擇适合自己機器運作環境的版本,oracle官網提供的JDK都是二進制版本的,是以,JDK的安裝非常簡單,隻需将下載下傳下來的程式包解壓到相應的目錄即可。安裝過程如下:

這裡我們将JDK安裝到了/usr/java/目錄下。接着,要讓程式能夠識别JDK路徑,還需要設定JDK的環境變量,這裡我們将JDK環境變量設定到/etc/profile檔案中。添加如下内容到/etc/profile檔案最後:

然後執行如下指令讓設定生效:

最後,在Shell提示符中執行“java -version”指令,如果顯示如下結果,說明安裝成功:

JDK部署成功後,就可以部署tomcat了,tomcat的安裝很簡單,從http://tomcat.apache.org/ 下載下傳最新的tomcat,然後解壓即可,這裡下載下傳tomcat9版本,安裝到/usr/loca/目錄下,執行如下操作:

這樣,tomcat也安裝完成了。由于還需要配置tomcat和redis的整合,是以tomcat服務暫時先不啟動。

4、tomcat與redis整合實作session共享

tomcat安裝完成後,接下來就是配置tomcat了,要配置tomcat和redis整合,實作session管理,需要如下幾個步驟。

(1)、部署jar包

首先從https://github.com/redisson/redisson/tree/master/redisson-tomcat 下載下傳兩個jar包,根據tomcat版本的不同,下載下傳對應的redisson-tomcat的jar包即可,這裡我們使用的是tomcat9版本,是以下載下傳的redisson-tomcat為redisson-tomcat-9-3.11.5.jar,還需要下載下傳一個jar包是redisson-all-3.11.5.jar,這兩個jar包的版本會不斷更新更新,具體版本号可能跟本文不完全相同,但不影響我們使用,将下載下傳下來的jar包放到$TOMCAT_BASE/lib目錄下,我們這裡的路徑是/usr/local/tomcat9/lib。

(2)、增加RedissonSessionManager配置

這個步驟是在tomcat的配置檔案$TOMCAT_BASE/conf/context.xml中,添加如下配置:

這個json檔案主要是配置tomcat和redis連接配接的屬性資訊,需要注意json檔案裡面的"address"一項的值,如果tomcat和redis安裝在一起,可以寫成127.0.0.1:6379,如果redis在獨立的一台機器上,就寫redis所在機器的IP位址。這裡redis所在的IP為172.16.213.120,是以上面就寫這個位址即可。

到此為止,tomcat與redis的互聯配置完成。

5、添加擷取session的jsp檔案

在tomcat伺服器172.16.213.120上對應的目錄$TOMCAT_BASE/webapps/ROOT下建立一個testsession.jsp檔案,内容如下:

接着,啟動tomcat服務,執行如下指令:

啟動tomcat後,在浏覽器通路:http://172.16.213.120:8080/testsession.jsp, 如下圖所示:

nginx+tomcat叢集redis共享session方案實戰案例一、常見的session一緻性方案二、應用環境介紹三、nginx+tomcat+redis部署過程四、測試nginx+tomcat+redis的session共享功能

然後,登入redis用戶端,檢視key資訊,操作如下:

可以看到,redis裡面已經生成了session資訊。redis裡面的session資訊跟testsession.jsp擷取到的完全一緻。

6、部署第二個tomcat執行個體

上面已經部署好了第一台tomcat執行個體tomcat1,接着在172.16.213.106上部署另一個tomcat執行個體tomcat2,最簡單的部署方法是直接拷貝第一個tomcat1執行個體到172.16.213.106上對應的位置即可。

為了兩個tomcat執行個體進行區分,這裡需要修改testsession.jsp檔案中的一些辨別資訊,修改後的内容如下:

這裡主要是将testsession.jsp檔案中的tomcat1修改為了tomcat2,最後,還需要在172.16.213.106上安裝和配置JDK,這個上面已經做了介紹,這裡不再說明。

nginx+tomcat叢集redis共享session方案實戰案例一、常見的session一緻性方案二、應用環境介紹三、nginx+tomcat+redis部署過程四、測試nginx+tomcat+redis的session共享功能

可以看到,通過172.16.213.120和172.16.213.106通路testsession.jsp頁面得到的session資訊是不一樣的。這是正常的。因為這是不同的伺服器,得到的session當然不同。

7、部署nginx負載均衡

根據上面的定義,nginx是安裝在172.16.213.37伺服器上,從nginx官網http://nginx.org/ 下載下傳最新的nginx版本,這裡是nginx-1.14版本,然後進行編譯安裝,過程如下:

這樣,nginx就安裝完成了。接下來,就是配置nginx了,打開nginx配置檔案nginx.conf,重點修改如下部分内容:

這個nginx配置中,啟用了nginx的負載均衡功能,叢集的後端節點就是兩台tomcat伺服器,配置完成,啟動nginx服務,操作如下:

nginx配置完成後,就可以通過http://172.16.213.37/testsession.jsp 通路兩個tomcat執行個體了,如下圖所示:

nginx+tomcat叢集redis共享session方案實戰案例一、常見的session一緻性方案二、應用環境介紹三、nginx+tomcat+redis部署過程四、測試nginx+tomcat+redis的session共享功能

可以嘗試不停重新整理這個頁面的話,頁面會在兩個tomcat執行個體之間來回輪詢切換,但session值并不發生變化,這說明兩個tomcat執行個體都共享了redis裡面存儲的session資訊,也就是實作了nginx+tomcat+redis的session共享功能。

繼續閱讀