Session共享 —— memcached + Tomcat

Table of Contents

1. Nginx + Tomcat

1.1 實驗環境

1.2 實驗流程

1.3 Tomcat定義

1.4 安裝Tomcat

1.4.1 安裝JDK

1.4.2 安裝Tomcat

1.4.3 配置JDK

1.4.4 配置Tomcat

1.4.5 負載均衡 

2. sticky模塊

2.1 sticky工作原理

3. MemCache在tomcat中實現交叉存儲

3.1 下載memcached-session共享的jar包,實現session共享


1. Nginx + Tomcat

1.1 實驗環境

node1:192.168.1.11

node2:192.168.1.12

1.2 實驗流程

使用node1上nginx作爲代理,負載均衡到node1和node2的tomcat上,

1.3 Tomcat定義

Tomcat服務器是一個免費的開發源代碼的WEB應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP程序的首選。其主要的應用場景是解析動態程序代碼(Java ) 。JSP程序可以處理Tomcat界面。

1.4 安裝Tomcat

node1安裝Tomcat和JDK,並配置JDK環境變量

1.4.1 安裝JDK

下載地址:https://www.oracle.com/java/technologies/javase-downloads.html

1.4.2 安裝Tomcat

下載地址:https://tomcat.apache.org/download-90.cgi 

1.4.3 配置JDK

  • 解壓JDK
tar zxf jdk-14.0.1_linux-x64_bin.tar.gz -C /usr/local/
  • 做軟鏈接
ln -s jdk-14.0.1 java
  • 添加JDK環境變量
vim /etc/profile
source /etc/profile           # 重載系統環境變量

  • 查看JAVA版本

  • 測試
vim test.java
###
public class test{
	public static void main(String[] args){
		System.out.println("Hello World~~");
	}
}
###
javac test.java        # 編譯
java test.java         # 執行

運行正常,說明我們JDK已經配置成功~

1.4.4 配置Tomcat

  • 解壓Tomcat
tar zxf apache-tomcat-9.0.35.tar.gz -C /usr/local/
  • 做軟鏈接
ln -s apache-tomcat-9.0.35 tomcat
  • 啓動tomcat
/usr/local/tomcat/bin/startup.sh           # 啓動tomcat

  • 查看日誌
vim /usr/local/tomcat/logs/catalina.out          # 編輯輸出日誌

  • 查看端口
netstat -tnlp

  • 瀏覽器訪問

但是用戶訪問的是nginx,而非8080端口,因此我們需要去配置一下nginx

1.4.5 負載均衡 

  • 配置node2主機Tomcat和JDK,與node1相同

  • nginx配置jsp請求負載均衡到node1和node2的Tomcat 
vim /usr/local/lnmp/nginx/conf/nginx.conf

http中定義一個上游服務器組

server中添加

  • 測試訪問

負載均衡已經生效

  • 測試訪問nginx請求jsp資源

node1:

node2: 

雖然可以訪問,但是這明顯不是我們想要的結果,圖片並沒有顯示出來。這是因爲當前請求是由nginx自行處理,現在我們應該將其交由Tomcat處理

jsp頁面中對於靜態資源的加載,我們使用的是相對路徑,我們請求的url是nginx代理服務器,所以對於相對路徑的資源,默認在nginx的發佈目錄尋找 可以將tomcat的ROOT中的靜態資源部署在nginx中,這樣就可以加載。

  • 複製靜態資源並增加權限 

權限不夠,修改權限

成功訪問~~

2. sticky模塊

在使用負載均衡的時候會遇到會話保持的問題,常用的方法有:

  • ip hash,根據客戶端的IP,將請求分配到不同的服務器上
  • cookie,服務器給客戶端下發一個cookie,具有特定cookie的請求會分配給它的發佈者

2.1 sticky工作原理

Sticky是nginx的一個模塊,它是基於cookie的一種nginx的負載均衡解決方案,通過分發和識別cookie,來使同一個客戶端的請求落在同一臺服務器上

  1. 客戶端首次發起訪問請求,nginx接收後,發現請求頭沒有cookie,則以輪詢方式將請求分發給後端服務器
  2. 後端服務器處理完請求,將響應數據返回給nginx
  3. 此時nginx生成帶route的cookie,返回給客戶端。route的值與後端服務器對應,可能是明文,也可能是md5、sha1等Hash值
  4. 客戶端接收請求,並保存帶route的cookie
  5. 當客戶端下一次發送請求時,會帶上route,nginx根據接收到的cookie中的route值,轉發給對應的後端服務器 
  • 編輯測試頁面,部署到node1和node2上

  • 測試訪問

輸入user爲user1,password爲111

輸入user爲user2,password爲222

可以看到,因爲負載均衡原因,請求在node1和node2來回跳轉,導致session信息丟失 

  • 下載sticky
wget http://nginx-sticky-module.googlecode.com/files/nginx-sticky-module-1.1.tar.gz
  • 解壓sticky
unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

  • 重新編譯nginx 
./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --user=nginx --group=nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42   
# 增加一個額外增加模塊所使用的參數

  • make && make install

模塊添加成功~

  • 編輯nginx配置文件,添加sticky

語法無誤,驗證了模塊添加成功~,重啓nginx

  • 瀏覽器訪問

可以看到,訪問的都是node1,session保存成功~

此時,看似已經完成了結果,但是還有一個隱患,就是我們當前正在node1輸入,但是node1服務器突然崩潰了怎麼辦,這個時候,session會跳轉到node2,但是session不會被保存下來

  • 關閉node1的Tomcat,繼續輸入

可以看到之前session中的信息沒有了,這當然是不允許的,那麼這裏我們就需要使用memcached來保存session,實現session共享

3. MemCache在tomcat中實現交叉存儲

爲甚麼要使用交叉存儲呢?

防止某個服務器的Tomcat忽然宕機,這個時候由於我們使用交叉存儲,用戶的數據在另一個服務器的memcache中存儲了一份,可以保證用戶數據不丟失。

具體過程:

< t1 > < t2 >

。\         /。

    。X 。

。/         \。

< m1 > < m2 >

爲了對數據的保存更加牢靠,我們選擇交叉存放session的方法,即將訪問tomcat1上的數據存放在memcache2中,將訪問tomcat2上的數據存放在memcache1中,這樣存放,當其中某個tomcat服務斷了之後,訪問它的客戶session並不會消失,而是存放在了另一個服務器的memcache,如果存放session的memcache壞了,那麼它的數據會立即切換到另一個memcached中

3.1 下載memcached-session共享的jar包,實現session共享

官方文檔:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration 

下載地址:

asm.jar包下載:http://www.java2s.com/Code/Jar/a/Downloadasmjar.htm

kroy-4.0.2.jar包下載: https://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.2/

izerkryo-serializers-0.9.jar包下載:https://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.9/

memcached-session-manager.jar包下載:https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.2/

memcached-session-manager-tc9.jar下載地址:https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc9/

minlog-1.3.1.jar包下載:https://www.mvnjar.com/com.esotericsoftware/minlog/1.3/detail.html

msm-kryo-serializer-2.3.2.jar包下載:https://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.2/

objenesis-3.1.jar包下載:https://www.mvnjar.com/org.objenesis/objenesis/3.1/detail.html

reflectasm-1.11.9.jar包下載:https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.9/

spymemcached-2.8.4.jar包下載:https://mvnrepository.com/artifact/spy/spymemcached/2.8.4?__cf_chl_jschl_tk__=39e7795fd0bd965da0929df8232d8edd0c8f9118-1589433883-0-AX8rpo0_ePObJALVlQyXZFt9EO1qAizqWJ4XzAd6-StnDzjxmTXGF-GngtQtndI60Vd4AYtAmm0g39Ut4ImKCL80Oo8N7D9CU3mDOMiIS23TJwD6NzbtPtT3D51Xp0DNBRtIStgW76-0Qu5rKm-QWbMGHvQ--HnNm-V15yX5MBsAjkYp7P_iWL8LWu0qrWrZBj0yXumi3c8tUg7BTx28xAFxUhev0IDmwvQHxhAZjNa3pvX6mrXQ_DopW4KkeixVIPtOewnmgZiIn6MTaXmuvD3r1SGU0P3itjXVuv7X2hoWu4zB-Qq-wQGI2eaukHTITKclWl3Mbf3EP-2eSpIU68P4tVL9caFs9KCflbaBgwWLyKaiDQXv9wiwzfP84QCkfg

  • 將下載的jar包導入Tomcat的lib目錄下(node1和node2均要導入)

  • 修改Tomcat配置文件
vim /usr/local/tomcat/conf/context.xml

node1:

node2: 

  • 重啓Tomcat並開啓memcached

關閉server1,再寫入

打開server1,關閉server2,再寫入

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章