Tomcat Cluser 集羣服務

Tomcat Cluser css

===============================================================================html

概述:前端


===============================================================================java

Tomcat Cluster

 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 實現會話共享;

附圖:

wKioL1jSNOLTE75NAAME81J7eOU680.jpg

 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 以下:

wKioL1jSNMWhDv72AABQ5EfqYTM987.png

 啓動tomcat服務,在瀏覽器中訪問以下:

wKioL1jSNsiDuPd9AAA4JsEED-k282.png

建立向後端反代的虛擬主機

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>

在瀏覽器中訪問以下:

wKioL1jSQvyB7hwRAAGSSWciJVM543.png


實驗:第二種方法 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>

管理接口以下:

wKiom1jSRlihbGrDAAFjtROmm6k018.png實驗:第三種方法 mod_jk 模塊的實現:



步驟以下:

wKiom1jSR6PzhslrAAB4FQH7U9I745.png

wKioL1jSR6WA_OJGAACoWFQ2YDI595.png

Tomcat Session Replication Cluster:

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
相關文章
相關標籤/搜索