Tomcat 集群負載均衡三大方案深度對比:DNS 輪詢 vs mod_proxy vs mod_jk
針對 Tomcat 叢集前端負載均衡,業界主流三種方案各有優劣。本文從原理、優缺點、安全性、效能、故障轉移、配置複雜度六大維度深度對比,並給出生產環境選型建議與關鍵配置片段。
方案架構速覽
| 方案 | 架構角色 | 核心組件 |
| DNS 輪詢 | DNS 解析分發 | 多 A 記錄指向多台 Tomcat |
| Apache mod_proxy (Rewrite) | 反向代理 + 重寫規則 | Apache + mod_proxy + mod_rewrite |
| Apache mod_jk (AJP13) | 專用連接器 | Apache + mod_jk + Tomcat AJP 連接器 |
詳細優缺點對比
1. DNS 輪詢
優點:配置最簡單(只改 DNS)、無單點故障(無前置代理)、零額外硬體/軟體成本。
缺點:
- 故障轉移極差:節點掛掉後,DNS 快取導致用戶仍解析到失效 IP,需等 TTL 過期或手動刷新。
- 暴露所有 Tomcat 端口:無前置代理保護,安全面大。
- 佔用大量公網 IP:每節點需獨立公網 IP。
- Tomcat 需處理靜態資源:動靜不分離,效能受損。
- 無法實現細粒度負載權重:僅靠 DNS 輪詢均勻分發。
2. Apache mod_proxy (Rewrite 方式)
優點:
- Apache 獨佔公網 IP,內網 Tomcat 隔離,安全性高。
- 靜態資源由 Apache 直接服務,Tomcat 專注動態請求,效能優化。
- 節省公網 IP、集中管理 SSL/壓縮/快取。
缺點:
- 故障檢測弱:Tomcat 掛掉後,Apache 仍轉發請求導致 502 Bad Gateway,需人工干預或外部監控剔除。
- 單點風險:Apache 掛掉全叢集不可用(需做 Apache 高可用)。
- 配置較繁瑣(RewriteMap/RewriteRule)。
3. Apache mod_jk (AJP13 協議)
優點:
- 內建心跳檢測:自動偵測 Tomcat 存活,自動剔除故障節點,無 502 錯誤。
- 支援 lbfactor 權重分配:依節點效能配置負載比例,實現最佳負載均衡。
- 同 mod_proxy:靜態資源分離、安全隔離、SSL 終結。
缺點:
- 故障恢復檢測延遲:Tomcat 重啟後,mod_jk 不會自動偵測恢復,需重啟 Apache 或等待長周期心跳(可調優化)。
- 配置最複雜(workers.properties、uriworkermap、server.xml AJP 連接器)。
- 同樣存在 Apache 單點風險。
綜合對比表
| 維度 | DNS 輪詢 | mod_proxy | mod_jk |
| 配置複雜度 | ★ | ★★★ | ★★★★ |
| 故障自動切換 | ✗ | ✗ (502) | ✓ |
| 故障自動恢復 | ✓ (TTL) | ✓ (重啟即可) | △ (需重啟 Apache/調優) |
| 靜態資源分離 | ✗ | ✓ | ✓ |
| 安全隔離 | ✗ | ✓ | ✓ |
| 負載權重控制 | ✗ | △ (RewriteRule 權重) | ✓ (lbfactor) |
| 單點風險 | 無 | Apache | Apache |
| 公網 IP 佔用 | 高 (N 個) | 低 (1 個) | 低 (1 個) |
生產環境選型建議
- 極簡場景/測試環境:DNS 輪詢足矣。
- 追求故障自動切換、權重控制、生產標準:mod_jk 為首選,配合 Apache 高可用(Keepalived/Heartbeat)消除單點。
- 已有 Apache 運維經驗、不想折騰 mod_jk 複雜配置:mod_proxy + 外部健康檢查腳本(Nginx/HAProxy 更現代)。
- 現代化替代:Nginx + upstream + health_check 或 HAProxy 同時具備 mod_jk 的優點且配置更簡單、效能更高,強烈建議新專案直接採用。
關鍵配置片段參考 (mod_jk)
# workers.properties
worker.list=ajp13
worker.ajp13.type=ajp13
worker.ajp13.host=192.168.9.226
worker.ajp13.port=8009
worker.ajp13.lbfactor=1
worker.ajp13_2.type=ajp13
worker.ajp13_2.host=192.168.9.235
worker.ajp13_2.port=8009
worker.ajp13_2.lbfactor=1
# httpd.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkMount /clusterapp/* ajp13
JkMount /clusterapp/* ajp13_2
參考資源:Tomcat Connectors 官方文檔、OnJava Tomcat Clustering 專題。