Tomcat集群搭建超詳細
2017年10月26日 22:48:47 點化人生 閱讀數 13888更多
目錄
TOMCAT集群 1
1 集群 1
1.1 什么是集群 1
1.2 集群的特性 1
1.3 集群的分類 1
1.4 TOMCAT集群配置的優缺點 2
1.5 APACHE+TOMCAT 2
1.6 環境說明 2
2 軟件安裝 3
2.1 安裝說明 3
2.2 JDK安裝 3
2.3 APACHE安裝 4
2.4 TOMCAT安裝 4
3 集群配置 6
3.1 APACHE+MOD_JK+TOMCAT配置 6
3.2 測試 7
4 SESSION復制 8
4.1 SESSION復制配置 8
4.2 測試 10
1 集群
1.1 什么是集群
集群是一組協同工作的服務實體,用以提供比單一服務實體更具擴展性與可用性的服務平台。在客戶端看來,一個集群就象是一個服務實體,但 事實上集群由一組服務實體組成。
1.2 集群的特性
與單一服務實體相比較,集群提供了以下兩個關鍵特性:
1,可擴展性--集群的性能不限於單一的服務實體,新的服 務實體可以動態地加入到集群,從而增強集群的性能。
2, 高可用性--集群通過服務實體冗余使客戶端免於輕易遇到out of service的警告。在集群中,同樣的服務可以由多個服務實體提供。如果一個服務實體失敗了,另一個服務實體會接管失敗的服務實體。集群提供的從一個出 錯的服務實體恢復到另一個服務實體的功能增強了應用的可用性。
為了具有可擴展性和高可用性特點,集群的必須具備以下兩大能力:
(1) 負 載均衡--負載均衡能把任務比較均衡地分布到集群環境下的計算和網絡資源。
(2) 錯誤恢復--由於某種原因,執行某個任務的資源出現故障,另一服 務實體中執行同一任務的資源接着完成任務。這種由於一個實體中的資源不能工作,另一個實體中的資源透明的繼續完成任務的過程叫錯誤恢復。
負載均衡 和錯誤恢復都要求各服務實體中有執行同一任務的資源存在,而且對於同一任務的各個資源來說,執行任務所需的信息視圖(信息上下文)必須是一樣的。
1.3 集群的分類
集群主要分成三大類:高可用集群(High Availability Cluster/HA), 負載均衡集群(Load Balance Cluster),高性能計算集群(High Performance Computing Cluster/HPC)
(1) 高可用集群(High Availability Cluster/HA):一般是指當集群中有某個節點失效的情況下,其上的任務會自動轉移到其他正常的節點上。還指可以將集群中的某節點進行離線維護再上線,該過程並不影響整個集群的運行。常見的就是2個節點做 成的HA集群,有很多通俗的不科學的名稱,比如"雙機熱備", "雙機互備", "雙機",高可用集群解決的是保障用戶的應用程序持續對外提供服 務的能力。
(2) 負載均衡集群(Load Balance Cluster):負載均衡集群運行時一般通過一個或者多個前端負載均衡器將工作負載分發到后端的一組服務器上,從而達到將工作負載分發。這樣的計算機集群有時也被稱為服務器群(Server Farm)。一般web服務器集群、數據庫集群 和應用服務器集群都屬於這種類型。這種集群可以在接到請求時,檢查接受請求較少,不繁忙的服務器,並把請求轉到這些服務器 上。從檢查其他服務器狀態這一點上 看,負載均衡和容錯集群很接近,不同之處是數量上更多。
(3) 高性能計算集群(High Performance Computing Cluster/HPC):高性能計算集群采用將計算任務分配到集群的不同計算節點而提高計算能力,因而主要應用在科學計算領域。這類集群致力於提供單個計算機所不能提供的強大的計算能力
1.4 Tomcat集群配置的優缺點
通常配置tomcat集群有三種方式:使用DNS輪詢,使用apache r-proxy代理方式,使用apache mod_jk方式。
(1)DNS輪詢的缺點:當集群中某台服務器停止之后,用戶由於dns緩存的緣故,便無法訪問服務,必 須等到dns解析更新,或者這台服務器重新啟動。還有就是必須把集群中的所有服務端口暴露給外界,沒有用apache做前置代理的方式安全,並 且占用大量公網IP地址,而且tomcat還要負責處理靜態網頁資源,影響效率。優點是集群配置最簡單,dns設置也非常簡單。
(2)R- proxy的缺點:當其中一台tomcat停止運行的時候,apache仍然會轉發請求過去,導致502網關錯誤。但是只要服務器再啟動就不存 在這個問題。
(3)mod_jk方式的優點是,Apache 會自動檢測到停止掉的tomcat,然后不再發請求過去。缺點就是,當停 止掉的tomcat服務器再次啟動的時候,Apache檢測不到,仍然不會轉發請求過去。
R-proxy和mod_jk的共同優點是.可 以只將Apache置於公網,節省公網IP地址資源。可以通過設置來實現Apache專門負責處理靜態網頁,讓Tomcat專門負責處理jsp和 servlet等動態請求。共同缺點是:如果前置Apache代理服務器停止運行,所有集群服務將無法對外提供。R-proxy和 mod_jk對靜態頁面請求的處理,都可以通設置來選取一個盡可能優化的效果。這三種方式對實現最佳負載均衡都有一定不足,mod_jk相對好些,可以通過設置lbfactor參數來分配請求任務。
1.5 Apache+Tomcat
Apache+ Tomcat整合的目標:
(1) 可以提高整體web服務器性能,將動態頁面交給tomcat處理,將靜態文件交給apache處理,可以大大提高服務器的靜態文件處理性能。
(2) 可以實現web服務器的負載均衡,服務器可采用集群的方式來響應客戶端請求。Apache的作用是做代理,將請求分發給各個tomcat處理,tomcat作為集群服務器處理請求。這樣可以提高整體web服務器性能和訪問量。
(3) 可以實現無縫升級應用程序和容錯處理,在tomcat集群中如果有一個tomcat掛掉了,用戶還可以通過其他tomcat來進行訪問,同時如果我們想升級應用程序,我們可以通過升級每個tomcat的應用程序來實現升級,在升級的過程中不會影響web服務器的訪問。
下面就是以1個apache+2個tomcat通過mod_jk配置集群。
1.6 環境說明
所需軟件包:
JDK:jdk-6u7-linux-i586.bin
Apache:httpd-2.2.19.tar.gz
Tomcat:apache-tomcat-7.0.16.tar.gz
Mod_jk:mod_jk-1.2.31-httpd-2.2.x.so
服務器:
服務器系統版本信息:CentOS release 5.3
服務器IP:172.30.4.6
2 軟件安裝
2.1 安裝說明
將下載好的軟件保存到服務器上:目錄為/usr/tomcattest,也可以建立其他文件夾保存。
JDK:jdk-6u7-linux-i586.bin
Apache:httpd-2.2.19.tar.gz
Tomcat:apache-tomcat-7.0.16.tar.gz
Mod_jk:mod_jk-1.2.31-httpd-2.2.x.so
2.2 JDK安裝
Java代碼
- 1) 拷貝軟件包
- [root@172-30-4-6 ~]# mkdir /usr/java #創建jdk安裝目錄
- [root@172-30-4-6 ~]# cd /usr/tomcattest #進入jdk軟件包目錄
- [root@172-30-4-6 tomcattest]# cp jdk-6u7-linux-i586.bin /usr/java #將jdk安裝文件拷貝到安裝目錄
- 2) 安裝JDK
- [root@172-30-4-6 tomcattest]# cd /usr/java #進入jdk安裝目錄
- [root@172-30-4-6 java]# ./ jdk-6u7-linux-i586.bin #執行安裝jdk文件
- 3) 配置環境變量
- [root@172-30-4-6 java] vim /etc/profile #修改系統環境變量文件
- #添加內容如下:
- export JAVA_HOME=/usr/java/jdk1.6.0_02
- export JAVA_BIN=/usr/java/jdk1.6.0_02/bin
- export PATH=$PATH:$JAVA_HOME/bin
- export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- export JAVA_HOME JAVA_BIN PATH CLASSPATH
- [root@172-30-4-6 profile]# cd /usr/bin
- [root@172-30-4-6 profile]# ln -s -f /usr/java/jdk1.6.0_02/jre/bin/java
- [root@172-30-4-6 profile]# ln -s -f /usr/java/jdk1.6.0_02/bin/javac
- 4) 測試
- [root@172-30-4-6 profile]# java -version #查看java安裝版本
- 顯示結果:java version "jdk1.6.0_02"
2.3 Apache安裝
Java代碼
- 1) 解壓
- [root@172-30-4-6 ~]# cd /usr/tomcattest #進入apache軟件包目錄
- [root@172-30-4-6 tomcattest]# tar -zxvf httpd-2.2.19.tar.gz #解壓apache安裝文件
- 2) 安裝
- [root@172-30-4-6 tomcattest]# cd httpd-2.2.19 #進入apache安裝目錄
- [root@172-30-4-6 httpd-2.2.19]# ./configure --prefix=/usr/apache # configure參數可以自己根據需要修改,可以使用—help獲得相關命令參數信息。
- [root@172-30-4-6 httpd-2.2.19]# make #編譯
- [root@172-30-4-6 httpd-2.2.19]# make install #安裝
- 3) 啟動
- [root@172-30-4-6 httpd-2.2.19]# cd /usr/apache/ #進入apache安裝目錄
- [root@172-30-4-6 apache]# ./bin/apachectl start #啟動apache服務器
- 4) 測試
- 訪問apache服務器:http://172.30.4.6
- 響應結果:It works! #apache服務器安裝成功
2.4 Tomcat安裝
Java代碼
- 1. 解壓
- [root@172-30-4-6 ~]# cd /usr/tomcattest #進入tomcat軟件包目錄
- [root@172-30-4-6 tomcattest]# tar –zxvf apache-tomcat-7.0.16.tar.gz #解壓tomcat安裝包
- 2. 安裝
- [root@172-30-4-6 tomcattest]# cp -P apache-tomcat-7.0.16 /usr/tomcat1 #拷貝tomcat1
- [root@172-30-4-6 tomcattest]# cp -P apache-tomcat-7.0.16 /usr/tomcat2 #拷貝tomcat2
- 3. 配置
- 因為該例子是在同一台服務器上安裝兩個tomcat服務器,避免服務器端口使用沖突,tomcat1端口采用默認配置,tomcat2端口需要重新配置。
- [root@172-30-4-6 tomcattest]# cd /usr/tomcat2/conf #進入tomcat2配置目錄,可修改server.xml配置文件
- [root@172-30-4-6 tomcattest]# cd /usr/tomcat1/conf #進入tomcat1配置目錄,可修改server.xml配置文件
- [root@172-30-4-6 conf]# vim server.xml #修改tomcat2配置文件
- (1) 修改server端口號
- #tomcat1 默認配置
- <Server port="8005" shutdown="SHUTDOWN">
- #tomcat2 修改端口號為9005
- <Server port="9005" shutdown="SHUTDOWN">
- (2) 修改HTTP connector端口號
- #tomcat1默認配置
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
- #tomcat2 修改端口號為9080
- <Connector port="9080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
- (3) 修改 AJP connector 端口號
- #tomcat1 默認配置
- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
- #tomcat2 修改端口號9009
- <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
- (4) 修改 engine 名稱
- #tocmat1 修改jvmRoute=”tomcat1”
- <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
- #tocmat2 修改jvmRoute=”tomcat2”
- <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
- 4. 啟動
- [root@172-30-4-6 tomcattest]# /usr/tomcat1/bin/startup.sh #啟動tomcat1
- [root@172-30-4-6 tomcattest]# /usr/tomcat1/bin/startup.sh #啟動tomcat2
- 5. 測試
- #tomcat1測試
- http://172.30.4.6:8080
- #tomcat2 測試
- http://172.30.4.6:9080
- 結果:顯示tomcat首頁
3 集群配置
3.1 apache+mod_jk+tomcat配置
Java代碼
- 1, httpd.conf的配置
- [root@172-30-4-6 ~]# cd /usr/apache/conf #進入apache配置目錄
- [root@172-30-4-6 conf]# vim httpd.conf #修改httpd.conf配置文件
- Include conf/mod_jk.conf #增加include配置
- 2, mod_jk.conf的配置
- [root@172-30-4-6 conf]# touch mod_jk.conf #創建mod_jk.conf文件
- [root@172-30-4-6 conf]# vim mod_jk.conf #修改mod_jk配置
- #mod_jk 配置mod_jk包
- LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.x.so
- #workers 配置工作負責文件
- JkWorkersFile conf/workers.properties
- #jk log 配置jk日志文件
- JkLogFile logs/mod_jk.log
- #jk log leve 配置日志級別
- JkLogLevel info
- # 配置jk日志內存共享
- JkShmFile logs/mod_jk.shm
- #balancer 配置負載均衡模式
- JkMount /*.jsp balancer
- [root@172-30-4-6 conf]# cp /usr/tomcattest/mod_jk-1.2.31-httpd-2.2.x.so /usr/apache/modules #將mod_jkb包拷貝到apache的modules目錄下
- 3, workers.properties的配置
- [root@172-30-4-6 conf]# touch workers.properties #創建worker.properties文件
- [root@172-30-4-6 conf]# vim workers.properties
- #tomcat1的配置
- worker.tomcat1.port=8009
- worker.tomcat1.host=172.30.4.6
- worker.tomcat1.reference=worker.template
- worker.tomcat1.activation=A
- #worker.tomcat1.lbfactor=1
- #tomcat2 的配置
- worker.tomcat2.port=9009
- worker.tomcat2.host=172.30.4.6
- worker.tomcat2.reference=worker.template
- worker.tomcat2.activation=A
- #worker.tomcat2.lbfactor=1
- worker.list=balancer
- #balancer 負載配置
- worker.balancer.type=lb
- worker.balancer.balance_workers=tomcat1,tomcat2
- worker.balancer.sticky_session=1
- #tempalte 負載模板配置
- worker.template.type=ajp13
3.2 測試
1, 創建測試項目
新建一個項目:項目名稱都為TestTomcat
新建一個jsp頁面:名稱為testjsp.jsp
Java代碼
- <%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>歡迎訪問</title>
- </head>
- <body>
- <%
- System.out.println(new Date()+"=============tomcat1=================");
- %>
- tomcat1=======<%=new Date()%>
- </body>
- </html>
2, 發布項目
(1)將測試項目打包,包名為TestTomcat.war,將測試項目發布到tomcat1服務器上 。
(2)修改項目testjsp.jsp文件
Java代碼
- <%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>歡迎訪問</title>
- </head>
- <body>
- <%
- System.out.println(new Date()+"=============tomcat2=================");
- %>
- tomcat2=======<%=new Date()%>
- </body>
- </html>
(3)將修改后的項目TestTomcat.war發布到tomcat2服務器上
3, 測試集群
分別在不同的客戶端上訪問apache代理服務器。
http://172.30.4.6/TestTomcat/testjsp.jsp
訪問結果:
tomcat2=======Wed Jun 29 13:25:03 CST 2011
或者
tomcat1======Wed Jun 29 13:26:03 CST 2011
4 Session復制
在Tomcat集群中實現session同步,可以通過session共享和復制來實現,下面以session復制來實現session同步。
4.1 Session復制配置
1, Tomcat中server.xml的配置
[root@172-30-4-6 ~]# cd /usr/tomcat1/conf #進入tomcat配置目錄
[root@172-30-4-6 conf]# vim server.xml #修改server.xml配置
# 在<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">后面加上以下配置:
Java代碼
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
- channelSendOptions="8">
- <Manager className="org.apache.catalina.ha.session.DeltaManager"
- expireSessionsOnShutdown="false"
- notifyListenersOnReplication="true"/>
- <Channel className="org.apache.catalina.tribes.group.GroupChannel">
- <Membership className="org.apache.catalina.tribes.membership.McastService"
- address="228.0.0.4"
- port="45564"
- frequency="500"
- dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="auto" #默認為auto,改為自己的IP
- port="4000" #同一台服務器上的tomcat必須修改為不同的端口,tomcat1修改為4001,tomcat2修改為4002。
- autoBind="100"
- selectorTimeout="5000"
- maxThreads="6"/>
- <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
- <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
- </Sender>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
- </Channel>
- <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
- filter=""/>
- <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
- <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
- tempDir="/tmp/war-temp/"
- deployDir="/tmp/war-deploy/"
- watchDir="/tmp/war-listen/"
- watchEnabled="false"/>
- <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
#分別給集群中每個tomcat在Engine后添加cluster配置,需要修改紅色部分的配置:
address=”172.30.4.6” #本機IP地址
port=”4001” #同一機器需要修改端口號,tomcat1為4001,tomcat2為4002
2, Tomcat應用項目中web.xml的配置
[root@172-30-4-6 ~]# cd /usr/tomcat1/webapps #進入到web應用項目中
[root@172-30-4-6 webapps]# vim /TestTomcat/WEB-INF/web.xml #修改web.xml
#在web.xml文件中加入
Java代碼
- <!--此應用將與群集服務器復制Session-->
- <distributable/>
4.2 測試
1, 修改項目文件
[root@172-30-4-6 ~]# cd /usr/tomcat1/webapps #進入到web應用項目中
[root@172-30-4-6 webapps]# vim /TestTomcat/ testjsp.jsp #修改testjsp.jsp
Java代碼
- <%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>歡迎訪問</title>
- </head>
- <body>
- <%
- System.out.println(new Date()+"=============tomcat1=================");
- session.setAttribute("name", "tomcat1");
- %>
- tomcat1=======<%=new Date()%>===<%=session.getId() %>===<%=session.getAttribute("name") %>
- </body>
- </html>
[root@172-30-4-6 ~]# cd /usr/tomcat2/webapps #進入到web應用項目中
[root@172-30-4-6 webapps]# vim /TestTomcat/ testjsp.jsp #修改testjsp.jsp
Java代碼
- <%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>歡迎訪問</title>
- </head>
- <body>
- <%
- System.out.println(new Date()+"=============tomcat2=================");
- %>
- tomcat2=======<%=new Date()%>===<%=session.getId() %>===<%=session.getAttribute("name") %>
- </body>
- </html>
2, 測試
(1) 訪問http://172.30.4.6/TestTomcat/testjsp.jsp
頁面顯示結果為:
tomcat1===Thu Jun 30 11:24:10 CST 2011==27E35C1389F5595A17F8B5FD00561EDA.tomcat1===tomcat1
(2) 關閉tomcat1
[root@172-30-4-6 ~]# /usr/tomcat1/bin/shutdown.sh
(3) 訪問http://172.30.4.6/TestTomcat/testjsp.jsp
頁面顯示結果為:
tomcat2==Thu Jun 30 11:37:42 CST 2011===605087B0015E978752640DB389B874A2.tomcat2===tomcat1
#證明session復制成功