Table of Contents
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
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,來使同一個客戶端的請求落在同一臺服務器上
- 客戶端首次發起訪問請求,nginx接收後,發現請求頭沒有cookie,則以輪詢方式將請求分發給後端服務器
- 後端服務器處理完請求,將響應數據返回給nginx
- 此時nginx生成帶route的cookie,返回給客戶端。route的值與後端服務器對應,可能是明文,也可能是md5、sha1等Hash值
- 客戶端接收請求,並保存帶route的cookie
- 當客戶端下一次發送請求時,會帶上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/
- 將下載的jar包導入Tomcat的lib目錄下(node1和node2均要導入)
- 修改Tomcat配置文件
vim /usr/local/tomcat/conf/context.xml
node1:
node2:
- 重啓Tomcat並開啓memcached
關閉server1,再寫入
打開server1,關閉server2,再寫入