Tomcat Cluser css
===============================================================================html
概述:前端
===============================================================================java
1.會話保持node
★方法:nginx
☉session sticky(粘性)web
source ip //原地址哈希redis
cookie數據庫
hash HEADERapache
注意:
後面兩種方式要確保前端調度器爲7層負載均衡,如nginx,haproxy
☉session cluser(集羣)
◆缺陷:
每個節點都將會持有整個集羣中的全部會話信息,由於會話會保存在內存中,因此將會很是佔用內存資源;
此種方式不適合集羣規模節點較大的場景使用;
☉session server(粘性)
會話保存在一個第三方的獨立外部存儲設備上,使得會話在集羣中的各節點獲得共享;
◆缺陷:
每一次session信息的獲取都要經過第三方服務器來加載,會產生網絡IO;
同時還要保證 session server 服務器足夠強大,即事務能力要無與倫比,通常不使用關係型數據庫,而是採用 kv 存儲並基於內存來提供服務。
◆經常使用於session server的服務器:
memcached,redis(推薦使用)
2.Tomcat Cluser
★三種方式
(1) session stickey 會話粘性的方式:
前端調度器能夠爲
nginx
haproxy
lvs
httpd
(2) session cluster 會話集羣的方式:
tomcat delta manager
tomcat session cluster
注意:
此種方式前端仍然須要一個調度器,可是不須要作會話綁定,會話由 tomcat 本身實現;
(3) session server 會話服務器的方式
memcached;
redis;
注意:
生產環境中,通常採用的架構模型爲第三種,經過session server 來維持會話;具體實現以下:
前端調度器能夠爲nginx,haproxy等實現負載均衡,中間web server爲 amt 即經過httpd和tomcat結合的方式實現(多個),後端爲 session server;前端調度器實現動靜分離,將動態內容(.jsp|do)調度到中間的 httpd,而後再經過httpd 反代至 tomcat 實例,多個httpd+tomcat 經過後端的 session server 實現會話共享;
附圖:
3.apache + tomcatS:
★結合方式:
☉ http協議
◆apache:
mod_proxy
mod_proxy_http
mod_proxy_balancer
◆tomcat
http connector
☉ajp協議
◆apache:
mod_proxy
mod_proxy_ajp
mod_proxy_balancer
◆tomcat
ajp connector
☉mod_jk
◆apache:
mod_jk
◆tomcat
ajp connector
實驗:第一種方法 http 的實現:
環境描述:
準備3臺虛擬主機(我這裏爲 centos7),一臺做爲httpd調度器,兩臺做爲後端的tomcat服務器;實現httpd反代用戶請求至後端的兩臺tomcat服務器;
兩臺tomcat主機的ip爲 node1:192.168.1.112;node2:192.168.1.113;httpd 調度器的ip:192.168.1.114
實驗環境準備:
1.首先準備兩臺後端的 tomcat 主機(部署好JDK環境,過程詳見前面內容),並提供測試頁面,這裏以node2(openjdk)爲例:
[root@node2 webapps]# pwd /var/lib/tomcat/webapps [root@centos7 webapps]# mkdir -pv ./testapp/{classes,lib,WEB-INF,META-INF} mkdir: created directory ‘./testapp’ mkdir: created directory ‘./testapp/classes’ mkdir: created directory ‘./testapp/lib’ mkdir: created directory ‘./testapp/WEB-INF’ mkdir: created directory ‘./testapp/META-INF’ [root@centos7 webapps]# ls docs examples host-manager manager ROOT sample testapp [root@centos7 webapps]# ls testapp/ classes lib META-INF WEB-INF # 提供測試頁面 [root@node2 testapp]# cat index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>Test Page</title> </head> <body> <% out.println("Tomcat B"); %> </body> </html>
爲了可以保證可以訪問到testapp,在/etc/tomcat/server.xml中的 Host 中定義Context 以下:
啓動tomcat服務,在瀏覽器中訪問以下:
建立向後端反代的虛擬主機
1.在http調度器上建立一個向後端反代虛擬主機,以下:
[root@centos7 conf.d]# pwd /etc/httpd/conf.d [root@centos7 conf.d]# cat mod_proxy_http.conf <proxy balancer://tcsrvs> BalancerMember loadfactor=1 # 設定權重 BalancerMember loadfactor=2 ProxySet lbmethod=byrequests </proxy> <VirtualHost *:80> ServerName lb.taotao.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPa***everse / balancer://tcsrvs/ <Location /> Require all granted </Location> </VirtualHost> # 檢查語法,啓動httpd服務 [root@centos7 conf.d]# httpd -t Syntax OK [root@centos7 conf.d]# systemctl start httpd
測試以下:
[root@centos7 conf.d]# curl http://192.168.1.114/test/ <html> <head> <title>Test Page</title> </head> <body> Tomcat A </body> </html> [root@centos7 conf.d]# curl http://192.168.1.114/test/ <html> <head> <title>Test Page</title> </head> <body> Tomcat B </body> </html> [root@centos7 conf.d]# curl http://192.168.1.114/test/ <html> <head> <title>Test Page</title> </head> <body> Tomcat B </body> </html> [root@centos7 conf.d]# curl http://192.168.1.114/test/ <html> <head> <title>Test Page</title> </head> <body> Tomcat A </body> </html>
2.會話粘性的實現方法:(不經常使用)
[root@centos7 conf.d]# cat mod_proxy_http.conf Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <proxy balancer://tcsrvs> BalancerMember http://192.168.1.112:8080 route=TomcatA loadfactor=1 BalancerMember http://192.168.1.113:8080 route=TomcatB loadfactor=2 ProxySet lbmethod=byrequests ProxySet stickysession=ROUTEID </proxy> <VirtualHost *:80> ServerName lb.taotao.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPa***everse / balancer://tcsrvs/ <Location /> Require all granted </Location> </VirtualHost>
3.啓用管理接口
[root@centos7 conf.d]# cat mod_proxy_http.conf Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <proxy balancer://tcsrvs> BalancerMember http://192.168.1.112:8080 route=TomcatA loadfactor=1 BalancerMember http://192.168.1.113:8080 route=TomcatB loadfactor=2 ProxySet lbmethod=byrequests ProxySet stickysession=ROUTEID </proxy> <VirtualHost *:80> ServerName lb.taotao.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPa***everse / balancer://tcsrvs/ <Location /> Require all granted </Location> <Location /balancer-manager> # 啓用管理接口 SetHandler balancer-manager ProxyPass ! Require all granted </Location> </VirtualHost>
在瀏覽器中訪問以下:
實驗:第二種方法 ajp 協議的實現:
ajp協議的實現和http協議在實現方式上基本相同,不一樣的就是所用的協議不一樣,監聽的端口不一樣,配置方式以下:
[root@centos7 conf.d]# cat mod_proxy_http.conf <proxy balancer://tcsrvs> BalancerMember ajp://192.168.1.112:8009 loadfactor=1 BalancerMember ajp://192.168.1.113:8009 loadfactor=2 ProxySet lbmethod=byrequests </proxy> <VirtualHost *:80> ServerName lb.taotao.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPa***everse / balancer://tcsrvs/ <Location /> Require all granted </Location> <Location /balancer-manager> SetHandler balancer-manager ProxyPass ! Require all granted </Location> </VirtualHost>
管理接口以下:
步驟以下:
session會話保持之session服務器
1.環境:
兩個tomcat節點:172.16.100.7(tomcatA.magedu.com) 172.16.100.8(tomcatB.magedu.com)
兩個memcached節點:172.16.100.9, 172.16.100.10
一個負載均衡節點:172.16.100.6
2.memcached-session-manager項目地址:
http://code.google.com/p/memcached-session-manager/
下載以下jar文件至各tomcat節點的tomcat安裝目錄下的lib目錄中,其中的${version}要換成你所須要的版本號,tc${6,7,8}要換成與tomcat版本相同的版本號。
memcached-session-manager-${version}.jar
memcached-session-manager-tc${6,7,8}-${version}.jar
spymemcached-${version}.jar
msm-javolution-serializer-${version}.jar
javolution-${version}.jar
3.步驟以下:
1)分別在兩個tomcat上的某host上定義一個用於測試的context容器,並在其中建立一個會話管理器,以下所示:
<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.16.100.9:11211,n2:172.16.100.10:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context>
2)分別爲兩個context提供測試頁面:
tomcatA
# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib} # vim /usr/local/tomcat/webapps/test/index.jsp 添加以下內容: <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.magedu.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
tomcat B
# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib} # vim /usr/local/tomcat/webapps/test/index.jsp 添加以下內容: <%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.magedu.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
3)在172.16.100.6上配置反向代理的負載均衡內容,相似以下所示:
<Proxy balancer://tomcat> BalancerMember http://172.16.100.7:8080 loadfactor=1 BalancerMember http://172.16.100.8:8080 loadfactor=1 ProxySet lbmethod=byrequests </Proxy> ProxyVia Off ProxyRequests Off ProxyPass / balancer://tomcat/ ProxyPa***everse / balancer://tomcat/ <Proxy *> Order Allow,Deny Allow From all </Proxy> <Location /> Order Allow,Deny Allow From all </Location>
4)測試結果,在瀏覽器中訪問http://172.16.100.6/test,結果以下所示,其session ID在負載均衡環境中保持不變。
TomcatA.magedu.com Session ID 4DD0340CE6294FF2BBE802CD4CD039EC-n2 Created on 1399890838103 TomcatB.magedu.com Session ID 4DD0340CE6294FF2BBE802CD4CD039EC-n2 Created on 1399890838103