| 術語 | 定義 |
|---|---|
| 負載均衡 | 按策略將請求分發到集群多台服務器,提升吞吐量與可用性 |
| 集群 | N 台服務器通過網絡協作,對外表現為單一服務入口 |
| 高可用 (HA) | 主節點故障時備份自動接管,實現服務不中斷 |
| Session 複製/共享 | 解決集群環境下用戶登錄態在節點間同步問題 |
jdk1.7.0_80 x64(Tomcat 8 需 JDK 7+)2.4.12 x64apache-tomcat-8.0.32 x64 × 2 實例tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x → 重命名為 mod_jk.so 放入 Apache2.4/modules/網絡環境:Win7 x64,8GB RAM,單機模擬 Apache + 雙 Tomcat
JAVA_HOME、PATHD:\tomcat81、D:\tomcat82,分別修改 server.xml 端口(8081/8082、8006/8007、8010/8011),**單獨啟動驗證無誤**D:\Apache24,啟動驗證默認 80 端口可訪問編輯 conf/httpd.conf,末尾添加:
# 載入 mod_jk 模塊 LoadModule jk_module modules/mod_jk.so # 指定 worker 配置文件 JkWorkersFile conf/workers.properties # 日誌配置 JkLogFile logs/mod_jk.log JkLogLevel info JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" # 掛載路徑:所有 /examples/* 請求轉發到負載均衡器 JkMount /examples/* loadbalancer JkMount /examples loadbalancer
# 定義兩個 Tomcat 實例 worker worker.list=loadbalancer,tomcat81,tomcat82 worker.tomcat81.type=ajp13 worker.tomcat81.host=localhost worker.tomcat81.port=8010 worker.tomcat81.lbfactor=1 worker.tomcat81.cachesize=10 worker.tomcat82.type=ajp13 worker.tomcat82.host=localhost worker.tomcat82.port=8011 worker.tomcat82.lbfactor=1 worker.tomcat82.cachesize=10 # 負載均衡器 worker worker.loadbalancer.type=lb worker.loadbalancer.balance_workers=tomcat81,tomcat82 worker.loadbalancer.sticky_session=1 # 開啟黏性會話,配合 Session 複製使用
編輯兩個 Tomcat 的 conf/server.xml:
<!-- 確保 AJP 連接器啟用,端口對應 workers.properties -->
<Connector protocol="AJP/1.3" port="8010" redirectPort="8443" /> <!-- tomcat81 -->
<Connector protocol="AJP/1.3" port="8011" redirectPort="8443" /> <!-- tomcat82 -->
<!-- Engine 級別配置集群,關鍵屬性 jvmRoute 必須與 worker 名一致 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat81"> <!-- tomcat82 改為 tomcat82 -->
<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" port="4000" 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"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
</Engine>
在需 Session 複製的 Web 應用 web.xml 添加:
<distributable/>
error.log 確認。JkWorkersFile、JkLogFile 路徑相對 ServerRoot 或使用絕對路徑。jvmRoute 與 worker 名一致、<distributable/>、防火牆允許組播/單播端口(45564、4000 等)。StaticMembershipService)配置具體 IP 列表。https://localhost/examples/,刷新觀察請求輪詢分發到兩個 Tomcat(可在各 Tomcat 日誌或頁面顯示當前端口驗證)。