兩台 Linux AS 4 伺服器構建 Tomcat 叢集,Apache 作為前端負載均衡器(Balancer),Mod_JK 轉發請求,Tomcat 節點間透過 DeltaManager 進行 Session 複製。本文記錄完整配置步驟與關鍵坑點。
| 角色 | IP | Port | 備註 |
|---|---|---|---|
| Managed Server 1 (PC1) | 10.3.15.85 | 9080 | Tomcat 節點 1 |
| Managed Server 2 (PC2) | 10.3.15.84 | 9080 | Tomcat 節點 2 |
| Balancer Server (PC1) | 10.3.15.85 | 80 | Apache + Mod_JK |
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkMount /* loadbalancer
worker.list=loadbalancer,status
worker.tomcat1.port=8009
worker.tomcat1.host=10.3.15.85
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
worker.tomcat2.port=8009
worker.tomcat2.host=10.3.15.84
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1,tomcat2
worker.loadbalancer.sticky_session=1
worker.status.type=status
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="10.3.15.85"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="15000"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
</Cluster>
關鍵點: tcpListenAddress 必須設為真實 IP(非 auto),否則 Session 無法跨節點複製,啟動日誌會出現 skipping state transfer. No members active in cluster group。
# 啟動 Apache
/usr/local/apache/bin/apachectl start
# 啟動 Tomcat(兩節點均執行)
/usr/local/tomcat/bin/catalina.sh start
# 加入開機自啟
echo "/usr/local/tomcat/bin/catalina.sh start" >> /etc/rc.d/rc.local
echo "/usr/local/apache/bin/apachectl start" >> /etc/rc.d/rc.local
部署測試 Web 應用(含 <distributable/> 的 web.xml、實作 Serializable 的 JavaBean、寫入/讀取 Session 的 JSP)。
https://10.3.15.85/,記錄 Session ID 與屬性值。| 現象 | 原因 | 解決 |
|---|---|---|
| Session 不複製 | tcpListenAddress=auto | 改為真實 IP |
啟動報 No members active | 多播地址/端口衝突或防火牆阻擋 | 檢查 228.0.0.4:45564 UDP 通訊 |
| Mod_JK 500 錯誤 | AJP 連接埠未開啟或 workers.properties IP 錯誤 | 確認 Tomcat server.xml <Connector port="8009" protocol="AJP/1.3"/> |