第一部分 環境介紹
部署環境:
Host1:Nginx、Memcached、Tomcat1
Host2:Tomcat2
Tomcat_version:8.0.38
第二部分 Nginx+Tomcat實現負載均衡
1、nginx及tomcat的安裝省略
2、nginx負載均衡配置:
http標簽中定義tomcat集群:
upstream tomcat_server { server 101.200.229.38:8080; server 101.200.162.214:8080; }
server中設置代理,將請求轉發給后端tomcat集群處理:
server { listen 80; server_name www.xxx.com; location / { proxy_pass http://tomcat_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
關於nginx負載均衡的策略,有以下幾種方式:
2.1 ip_hash:
根據客戶端地址,同一個ip地址分配給同一台后段服務器處理,這樣可以解決session的問題。但是如果該后端服務器宕掉,則session會失效。
缺點:局域網內的用戶使用的是同一個公網IP,這對於ip_hash來說,會被認為是同一個客戶端,因此總是會將這個公網ip的請求交給同一個后端服務器來處理,因此起不到負載均衡的作用。
2.2 輪詢:
每一個請求,按照時間順序,逐一分配給后端不同的服務器。
缺點:需要對后端服務器做session共享。
2.3 權重:
每個請求,根據后端服務器的權重值來轉發。權重越大,表明該服務器處理能力相對越高。主要用於后端服務器性能不同的情況。
第三部分 利用MSM框架實現session共享
Github項目地址:https://github.com/magro/memcached-session-manager
1、msm框架主要使用緩存(如memcache、redis)來存儲session信息,后端服務器都可以從該緩存中讀寫session。
2、tomcat序列化(Serializable)策略介紹:
序列化是指將對象以字符串形式在網絡上傳輸、存儲、讀取的過程。
java有以下幾種序列化框架:
kryo-serializer
javolution-serializer
xstream-serializer
flexjson-serializer
每種序列化框架需要的依賴jar包不同,本例使用javolution框架
3、准備需要的jar包:
Github上提供了下載鏈接:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
本例需要的jar包及版本如下:
asm-5.1.jar
minlog-1.3.0.jar
javolution-5.5.1.jar
reflectasm-1.11.3.jar
msm-javolution-serializer-1.9.5.jar
memcached-session-manager-1.9.5.jar
memcached-session-manager-tc8-1.9.5.jar
注意:對各jar的版本兼容性要求極高!
將以上jar包放在tomcat/lib/目錄下。
4、安裝memcached,啟動memcached:
/usr/local/memcached/bin/memcached -m 512 -d -u memcache -p 11011 -c 1024
-m表示分配內存大小
-d表示后台運行
-u表示以某一用戶運行
-p表示監聽的端口號
-c表示接受的連接數
tomcat/conf/context.xml配置:
<Context>標簽中添加如下內容:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:127.0.0.1:11011" sticky="false" sessionBackupAsync="false" failoverNodes="" sessionBackupTimeout="100000" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
以上配置后,重啟tomcat即可。
參考:http://blog.csdn.net/remote_roamer/article/details/51133790