目錄
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-8u181-linux-x64.tar.gz
Apache:httpd-2.4.34.tar.gz,apr-1.6.3.tar.gz,apr-util-1.6.1.tar.gz,pcre-8.38.tar.gz
Tomcat:apache-tomcat-8.5.32.tar.gz
Mod_jk:mod_jk-1.2.31-httpd-2.2.x.so
服務器:
服務器系統版本信息:CentOS Linux 7 (Core)
服務器IP:192.168.17.130
2 軟件安裝
2.1 安裝說明
將下載好的軟件保存到服務器上:目錄爲/usr/softwares,也可以建立其他文件夾保存。
JDK:jdk-8u181-linux-x64.tar.gz
Apache:httpd-2.4.34.tar.gz,apr-1.6.3.tar.gz,apr-util-1.6.1.tar.gz,pcre-8.38.tar.gz
Tomcat:apache-tomcat-8.5.32.tar.gz
Mod_jk:tomcat-connectors-1.2.43-src.tar.gz
(Mod_jk下載地址:http://archive.apache.org/dist/tomcat/tomcat-connectors)
2.2 JDK安裝
1) 拷貝軟件包
[root@172-30-4-6 ~] mkdir /usr/java #創建jdk安裝目錄
[root@172-30-4-6 ~] cd /usr/softwares #進入jdk軟件包目錄
[root@172-30-4-6 tomcattest] cp jdk-8u181-linux-x64.tar.gz /usr/java #將jdk安裝文件拷貝到安裝目錄
2) 安裝JDK
[root@172-30-4-6 tomcattest] cd /usr/java #進入jdk安裝目錄
[root@172-30-4-6 java] tar -xzvf jdk-8u181-linux-x64.tar.gz #解壓jdk文件包
3) 配置環境變量
[root@172-30-4-6 java] vim /etc/profile #修改系統環境變量文件
#添加內容如下:
export JAVA_HOME=/usr/java/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
4) 測試
[root@172-30-4-6 profile] java -version #查看java安裝版本
顯示結果:java version "jdk1.8.0_181"
2.3 Apache安裝
2.3.1 apr的安裝
1) 解壓
[root@172-30-4-6 ~] cd /usr/softwares #進入apr軟件包目錄
[root@172-30-4-6 softwares] tar -xzvf apr-1.6.3.tar.gz #解壓apr安裝文件
2) 安裝
[root@172-30-4-6 softwares] cd apr-1.6.3 #進入apr安裝目錄
[root@172-30-4-6 apr-1.6.3] ./configure --prefix=/usr/apr # configure參數可以自己根據需要修改,可以使用—help獲得相關命令參數信息。
注意:
1.configure過程中可能會報no acceptable C compiler found in $PATH錯誤
原因:缺少c語言編譯工具
解決方法:yum install gcc下載此軟件後重新configure即可;
2.configure過程中可能會報cannot remove 'libtoolT': No such file or directory錯誤
此時vim configure編輯文件,找到RM='$RM'改爲RM='$RM -f',保存退出重新configure即可。
[root@172-30-4-6 apr-1.6.3] make #編譯
[root@172-30-4-6 apr-1.6.3] make install #安裝
完成安裝apr
2.3.2 apr-util的安裝
1) 解壓
[root@172-30-4-6 ~] cd /usr/softwares #進入apr-util軟件包目錄
[root@172-30-4-6 softwares] tar -xzvf apr-util-1.6.1.tar.gz #解壓apr-util安裝文件
2) 安裝
[root@172-30-4-6 softwares] cd apr-util-1.6.1 #進入apr-util安裝目錄
[root@172-30-4-6 apr-util-1.6.1] ./configure --prefix=/usr/apr-util --with-apr=/usr/apr # configure參數可以自己根據需要修改,可以使用—help獲得相關命令參數信息。
[root@172-30-4-6 apr-util-1.6.1] make #編譯
注意:
1.make過程中可能會報錯:
xml/apr_xml.c:35:19: 致命錯誤:expat.h:沒有那個文件或目錄
#include <expat.h>
^
編譯中斷。
make[1]: *** [xml/apr_xml.lo] 錯誤 1
make[1]: 離開目錄“/usr/softwares/apr-util-1.6.1”
make: *** [all-recursive] 錯誤 1
原因:缺少expat庫
解決方法:yum install expat-devel
[root@172-30-4-6 apr-util-1.6.1] make install #安裝
完成安裝apr-util
2.3.3 pcre的安裝
1) 解壓
[root@172-30-4-6 ~] cd /usr/softwares #進入apr-util軟件包目錄
[root@172-30-4-6 softwares] tar -xzvf pcre-8.38.tar.gz #解壓pcre安裝文件
2) 安裝
[root@172-30-4-6 softwares] cd pcre-8.38 #進入pcre安裝目錄
[root@172-30-4-6 pcre-8.38] ./configure --prefix=/usr/pcre
注意:
1.configure過程中可能會報錯:
configure: error: You need a C++ compiler for C++ support.
原因:缺少c++的編譯器
解決方法:yum install -y gcc gcc-c++
[root@172-30-4-6 pcre-8.38] make #編譯
[root@172-30-4-6 pcre-8.38] make install #安裝
完成安裝pcre
2.3.4 apache的安裝
1) 解壓
[root@172-30-4-6 ~] cd /usr/softwares #進入apache軟件包目錄
[root@172-30-4-6 softwares] tar -xzvf httpd-2.4.34.tar.gz #解壓apache安裝文件
2) 安裝
[root@172-30-4-6 softwares] cd httpd-2.4.34 #進入apache安裝目錄
[root@172-30-4-6 httpd-2.4.34] ./configure --prefix=/usr/apache --with-apr=/usr/apr --with-apr-util=/usr/apr-util --with-pcre=/usr/pcre
[root@172-30-4-6 httpd-2.4.34] make #編譯
注意:
1.若報錯
collect2: error: ld returned 1 exit status
make[2]: *** [htpasswd] 錯誤 1
make[2]: 離開目錄“/usr/softwares/httpd-2.4.34/support”
make[1]: *** [all-recursive] 錯誤 1
make[1]: 離開目錄“/usr/softwares/httpd-2.4.34/support”
make: *** [all-recursive] 錯誤 1
原因:缺少libtool-ltdl-devel
解決方法:yum install libtool-ltdl-devel 並重新編譯安裝apr-util
[root@172-30-4-6 httpd-2.4.34] make install #安裝
3) 啓動
[root@172-30-4-6 httpd-2.4.34] cd /usr/apache/ #進入apache安裝目錄
[root@172-30-4-6 apache] ./bin/apachectl start #啓動apache服務器
注意:
1.若報錯
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
原因:沒有設置ServerName
解決方法:在配置文件conf/httpd.conf中加入一行“ServerName localhost:80”即可
重啓apache服務器:./bin/apachectl restart
4) 測試
訪問apache服務器:http://192.168.17.130/
若非本機訪問時,訪問不了則需要打開防火牆80端口。
響應結果:It works! #apache服務器安裝成功
apache相關命令:
前提,需要在apache的安裝編譯後的目錄下
./bin/apachectl start #開啓apache服務
./bin/apachectl stop #停止apache服務
./bin/apachectl restart #重啓apache服務
2.4 Tomcat安裝
1. 解壓
[root@172-30-4-6 ~] mkdir /usr/tomcat #創建tomcat文件夾
[root@172-30-4-6 ~] cd /usr/softwares #進入tomcat軟件包目錄
[root@172-30-4-6 ~] mv apache-tomcat-8.5.32.tar.gz /usr/tomcat/apache-tomcat-8.5.32.tar.gz #將tomcat軟件包移至tomcat文件夾下
[root@172-30-4-6 tomcat] tar –xzvf apache-tomcat-8.5.32.tar.gz #解壓tomcat安裝包
2. 安裝
[root@172-30-4-6 tomcat] cp -a apache-tomcat-8.5.32 apache-tomcat-8.5.32_1 #tomcat1
[root@172-30-4-6 tomcat] mv apache-tomcat-8.5.32 apache-tomcat-8.5.32_2 #tomcat2
3. 配置
因爲該例子是在同一臺服務器上安裝兩個tomcat服務器,避免服務器端口使用衝突,tomcat1端口採用默認配置,tomcat2端口需要重新配置。
[root@172-30-4-6 tomcat] cd /usr/tomcat/apache-tomcat-8.5.32_2/conf #進入tomcat2配置目錄,可修改server.xml配置文件
[root@172-30-4-6 tomcat] cd /usr/tomcat/apache-tomcat-8.5.32_1/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 端口號
注意:此端口號是爲了與前端服務器apache對接,若apache與tomcat不在同一臺機器,則需要讓防火牆開放該端口號8009/9009
#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://192.168.17.130:8080
#tomcat2 測試
http://192.168.17.130:9080
若非本機訪問時,訪問不了則需要打開防火牆80端口。
結果:顯示tomcat首頁
2.5 Mod_jk安裝
1) 解壓
[root@172-30-4-6 ~] cd /usr/softwares #進入mod_jk軟件包目錄
[root@172-30-4-6 softwares] tar -xzvf tomcat-connectors-1.2.43-src.tar.gz #解壓mod_jk安裝文件
2) 安裝
[root@172-30-4-6 softwares] cd tomcat-connectors-1.2.43-src/native #進入pcre安裝目錄
[root@172-30-4-6 native] ./configure --with-apxs=/usr/apache/bin/apxs
[root@172-30-4-6 native] make #編譯
[root@172-30-4-6 native] make install #安裝
[root@172-30-4-6 native] make clean #清除上次的make命令所產生的object文件(後綴爲“.o”的文件)及可執行文件。
此時,mod_jk.so會安裝在/usr/apache/modules/mod_jk.so
完成安裝mod_jk
3 集羣配置
3.1 apache+mod_jk+tomcat配置
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配置
Include conf/mod_jk.conf
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.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 配置負載均衡模式,此處過濾.jsp結尾的文件負載均衡到各個服務器上
JkMount /*.jsp balancer
[root@172-30-4-6 conf] cp /usr/softwares/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
#worker的變量
worker.list=balancer,jk_watcher,tomcat1,tomcat2
#tempalte 負載模板配置
worker.template.type=ajp13
#worker全局的重試次數,在apache服務器啓動後,會最多嘗試若干次連接這些負載均衡服務器,若連接不上則任務down掉
worker.retries=3
#balancer 負載配置
worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1,tomcat2
worker.balancer.sticky_session=true
#tomcat1的配置
worker.tomcat1.port=8009
worker.tomcat1.host=192.168.17.130
worker.tomcat1.reference=worker.template
worker.tomcat1.activation=A
#worker.tomcat1.lbfactor=1 #lbfactor值越大,表示被分配的負載越大
#tomcat2 的配置
worker.tomcat2.port=9009
worker.tomcat2.host=192.168.17.130
worker.tomcat2.reference=worker.template
worker.tomcat2.activation=A
#worker.tomcat2.lbfactor=1 #lbfactor值越大,表示被分配的負載越大
#負載均衡監視器
worker.jk_watcher.type=status
worker.jk_watcher.read_only=false
worker.jk_watcher.mount=/jkStatus
在workers.properties文件中的jk_warcher爲負載均衡監視器,這裏配置後可以直接通過鏈接http://192.168.17.130/jkStatus訪問。
worker.jk_watcher.mount=/jkStatus,即是設置訪問鏈接名
3.2 測試
3.2.1 創建測試項目
新建一個項目:項目名稱都爲TestTomcat
新建一個jsp頁面:名稱爲testjsp.jsp
<%@ 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>
3.2.2 發佈項目
(1)將測試項目發佈到tomcat1服務器上 。
(2)修改項目testjsp.jsp文件
<%@ 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)將修改後的項目發佈到tomcat2服務器上
3.2.3 測試集羣
分別在不同的客戶端上訪問apache代理服務器。
http://192.168.17.130/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複製配置
修改部署的所有tomcat的相應配置文件,這裏只顯示其中一個tomcat下的配置文件修改,其他類似。
4.1.1 Tomcat中server.xml的配置
[root@172-30-4-6 ~] cd /usr/tomcat/apache-tomcat-8.5.32_1/conf #進入tomcat配置目錄
[root@172-30-4-6 conf] vim server.xml #修改server.xml配置
# 在<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">後面加上以下配置:
<!--
Cluster(集羣,族) 節點,如果你要配置tomcat集羣,則需要使用此節點.
className 表示tomcat集羣時,之間相互傳遞信息使用那個類來實現信息之間的傳遞.
channelSendOptions可以設置爲2、4、8、10,每個數字代表一種方式
2 = Channel.SEND_OPTIONS_USE_ACK(確認發送)
4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步發送)
8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(異步發送)
在異步模式下,可以通過加上確認發送(Acknowledge)來提高可靠性,此時channelSendOptions設爲10
-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<!--
Manager決定如何管理集羣的Session信息。Tomcat提供了兩種Manager:BackupManager和DeltaManager
BackupManager-集羣下的所有Session,將放到一個備份節點。集羣下的所有節點都可以訪問此備份節點
DeltaManager-集羣下某一節點生成、改動的Session,將複製到其他節點。
DeltaManager是Tomcat默認的集羣Manager,能滿足一般的開發需求
使用DeltaManager,每個節點部署的應用要一樣;使用BackupManager,每個節點部署的應用可以不一樣.
className-指定實現org.apache.catalina.ha.ClusterManager接口的類,信息之間的管理.
expireSessionsOnShutdown-設置爲true時,一個節點關閉,將導致集羣下的所有Session失效
notifyListenersOnReplication-集羣下節點間的Session複製、刪除操作,是否通知session listeners
maxInactiveInterval-集羣下Session的有效時間(單位:s)。
maxInactiveInterval內未活動的Session,將被Tomcat回收。默認值爲1800(30min)
-->
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
<!--
Channel是Tomcat節點之間進行通訊的工具。
Channel包括5個組件:Membership、Receiver、Sender、Transport、Interceptor
-->
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<!--
Membership維護集羣的可用節點列表。它可以檢查到新增的節點,也可以檢查到沒有心跳的節點
className-指定Membership使用的類
address-組播地址
port-組播端口,此端口必須讓防火牆開放
frequency-發送心跳(向組播地址發送UDP數據包)的時間間隔(單位:ms)。默認值爲500
dropTime-Membership在dropTime(單位:ms)內未收到某一節點的心跳,則將該節點從可用節點列表刪除。默認值爲3000
注: 組播(Multicast):一個發送者和多個接收者之間實現一對多的網絡連接。
一個發送者同時給多個接收者傳輸相同的數據,只需複製一份相同的數據包。
它提高了數據傳送效率,減少了骨幹網絡出現擁塞的可能性
相同組播地址、端口的Tomcat節點,可以組成集羣下的子集羣
-->
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
<!--
Receiver : 接收器,負責接收消息
接收器分爲兩種:BioReceiver(阻塞式)、NioReceiver(非阻塞式)
className-指定Receiver使用的類
address-接收消息的地址
port-接收消息的端口,若tomcat集羣不在同一臺機器,則需要讓防火牆開放該端口
autoBind-端口的變化區間
如果port爲4000,autoBind爲100,接收器將在4000-4099間取一個端口,進行監聽
selectorTimeout-NioReceiver內輪詢的超時時間
maxThreads-線程池的最大線程數
-->
<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 : 發送器,負責發送消息
Sender內嵌了Transport組件,Transport真正負責發送消息
-->
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<!--
Transport分爲兩種:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)
-->
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<!--
Interceptor : Cluster的攔截器
TcpFailureDetector-網絡、系統比較繁忙時,Membership可能無法及時更新可用節點列表,
此時TcpFailureDetector可以攔截到某個節點關閉的信息,
並嘗試通過TCP連接到此節點,以確保此節點真正關閉,從而更新集羣可以用節點列表
-->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<!--
MessageDispatch15Interceptor-查看Cluster組件發送消息的方式是否設置爲
Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster標籤下的channelSendOptions爲8時)。
設置爲Channel.SEND_OPTIONS_ASYNCHRONOUS時,
MessageDispatch15Interceptor先將等待發送的消息進行排隊,然後將排好隊的消息轉給Sender
-->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<!--
Valve : 可以理解爲Tomcat的攔截器
ReplicationValve-在處理請求前後打日誌;過濾不涉及Session變化的請求,如客戶端對圖片,css,js的請求就不會涉及Session,因此不需檢測,filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"
JvmRouteBinderValve-Apache的mod_jk發生錯誤時,保證同一客戶端的請求發送到集羣的同一個節點
-->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<!--
Deployer : 同步集羣下所有節點的一致性
-->
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<!--
ClusterListener : 監聽器,監聽Cluster組件接收的消息
使用DeltaManager時,Cluster接收的信息通過ClusterSessionListener傳遞給DeltaManager
-->
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
#分別給集羣中每個tomcat在Engine後添加cluster配置,需要修改有#註釋的配置:
address=”172.30.4.6” #本機IP地址
port=”4001” #同一機器需要修改端口號,tomcat1爲4001,tomcat2爲4002
4.1.2 Tomcat應用項目中web.xml的配置
[root@172-30-4-6 ~] cd /usr/tomcat/apache-tomcat-8.5.32_1/webapps #進入到web應用項目中
[root@172-30-4-6 webapps] vim TestTomcat/WEB-INF/web.xml #修改web.xml
#在web.xml文件中的</web-app>前面加入
<!--此應用將與羣集服務器複製Session-->
<distributable/>
4.2 測試
4.2.1 修改項目文件
[root@172-30-4-6 ~] cd /usr/tomcat/apache-tomcat-8.5.32_1/webapps/TestTomcat #進入到web應用項目中
[root@172-30-4-6 webapps] vim /TestTomcat/testjsp.jsp #修改testjsp.jsp
<%@ 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("tomcat1", "I am tomcat1");
%>
tomcat1=======<%=new Date()%>===<%=session.getId()%>==<%=session.getAttribute("tomcat1")%>==<%=session.getAttribute("tomcat2")%>
</body>
</html>
[root@172-30-4-6 ~] cd /usr/tomcat/apache-tomcat-8.5.32_2/webapps/TestTomcat #進入到tomcat2的web應用項目中
[root@172-30-4-6 webapps] vim /TestTomcat/testjsp.jsp #修改testjsp.jsp
<%@ 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=================");
session.setAttribute("tomcat2", "I am tomcat2");
%>
tomcat2=======<%=new Date()%>===<%=session.getId()%>==<%=session.getAttribute("tomcat1")%>==<%=session.getAttribute("tomcat2")%>
</body>
</html>
4.2.2 測試
測試結果發現,session不共享
訪問http://192.168.17.130:8080/TestTomcat/testjsp.jsp結果顯示
tomcat1=======Wed Aug 08 17:50:57 CST 2018===D60E9F76D432FEDB069442B284702913.tomcat1==I am tomcat1==null
訪問http://192.168.17.130:9080/TestTomcat/testjsp.jsp結果顯示
tomcat2=======Wed Aug 08 17:42:08 CST 2018===2CB5D868D39A4E8F47F2548DB16690D5.tomcat2==null==I am tomcat2
在這一步費了我一個下午加晚上的時間,終於找到原來是防火牆的鍋,就是在4.1.1的server.xml文件配置的時候,有一個menbership標籤的組播形式,需要開一個45564的端口(默認端口也是45564),否則session無法共享。
解決方法有兩種:
第一種簡單粗暴,直接關閉防火牆,再重啓apache服務即可。
#關閉防火牆
systemctl stop firewalld
#重啓apache服務
cd /usr/apache
./bin/apachectl restart
第二種方法,防火牆開啓45564端口
#開啓45564端口
firewall-cmd --zone=public --add-port=45564/udp --permanent
firewall-cmd --reload
#查看所有打開的端口
firewall-cmd --zone=public --list-ports
#重啓apache服務
cd /usr/apache
./bin/apachectl restart
測試結果如下,成功解決了session不共享的問題
訪問http://192.168.17.130:8080/TestTomcat/testjsp.jsp結果顯示
tomcat1=======Wed Aug 08 20:12:43 CST 2018===12B141B8BEDD905A893937119506D70B.tomcat1==I am tomcat1==I am tomcat2
訪問http://192.168.17.130:9080/TestTomcat/testjsp.jsp結果顯示
tomcat2=======Wed Aug 08 20:12:48 CST 2018===12B141B8BEDD905A893937119506D70B.tomcat2==I am tomcat1==I am tomcat2
至此,在centos7系統上的一個簡單apache2+tomcat8+mod_jk的tomcat集羣就搭建完成了。
5 總結
總結,tomcat集羣就是,一個前端服務器apache2,加上若干個後端服務器tomcat8,通過mod_jk來配置形成傳說中的tomcat集羣服務器。這裏需要注意的是,防火牆端口號的開放。若apache2和若干個tomcat8均在不同的機器上,則需要以下幾個端口號的開放,第一,tomcat與前端服務器對接的tcp端口號(默認8009),第二,tomcat間session共享時的組播地址的udp端口號(默認45564),第三,tomcat間session共享時的接收信息的tcp端口號(默認4000),同時該接收信息的ip地址也要注意須改爲本機的IP地址(默認auto)。