Apache 作為反向代理分發請求至多個 JBoss 節點時,Session 會話保持是關鍵挑戰。本文對比 Session Sticky(會話粘滯)與 Session Replication(會話複製)兩大策略,詳細實踐基於 mod_proxy_balancer + mod_headers 的 ROUTEID Cookie 粘滯方案,含完整配置模板與原理解析。
| 維度 | Session Sticky (粘滯會話) | Session Replication (會話複製) |
|---|---|---|
| 核心邏輯 | 同一用戶請求始終路由到同一後端節點 | 所有節點共享 Session 數據,請求可隨機分發 |
| 實現方式 | 負載均衡器標記路由標識 | 分布式緩存/數據庫/組播同步 |
| 優勢 | 本地存儲、無網絡開銷、實現簡單 | 高可用、任意節點故障不影響用戶、支持動態擴縮容 |
| 劣勢 | 節點掛掉導致該 Session 失效、擴容需 Drain | 同步延遲、網絡/存儲開銷大、配置復雜 |
| 適用場景 | 有狀態服務、節點數固定、容忍單點故障 | 高可用要求高、頻繁擴縮容、無狀態化改造前過渡 |
ROUTEIDroute=2),直接轉發至對應 BalancerMemberHeader add Set-Cookie 種植 ROUTEIDjvmRoute 與 route 一致<!-- 1. 載入必要模塊 -->
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule headers_module modules/mod_headers.so
LoadModule status_module modules/mod_status.so
<!-- 2. 種植路由 Cookie(關鍵) -->
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<!-- 3. 定義負載均衡集群 -->
<Proxy balancer://mycluster>
<!-- route 值必須與 JBoss jvmRoute 一致 -->
BalancerMember https://192.168.77.213:9005 route=1
BalancerMember https://192.168.77.213:9004 route=2
BalancerMember https://192.168.77.213:9002 route=3
BalancerMember https://192.168.77.213:9003 route=4
<!-- 指定粘滯會話 Cookie 名 -->
ProxySet stickysession=ROUTEID
<!-- 可選:健康檢查 -->
ProxySet lbmethod=byrequests
</Proxy>
<!-- 4. 代理規則:所有請求轉發至集群 -->
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
<!-- server.xml / standalone.xml -->
<jboss-web>
<!-- 必須與 Apache route 值完全一致 -->
<jvmRoute>1</jvmRoute> <!-- 節點1 -->
</jboss-web>
每個節點修改對應 jvmRoute(1/2/3/4),重啟生效。
| 指令 | 作用 | 關鍵參數 |
|---|---|---|
| BalancerMember | 定義後端節點 | route=1 對應 jvmRoute |
| ProxySet stickysession | 啟用粘滯會話,指定 Cookie 名 | stickysession=ROUTEID |
| Header add Set-Cookie | 首次請求種植路由 Cookie | ROUTEID=.%{BALANCER_WORKER_ROUTE}e |
| BALANCER_WORKER_ROUTE | 環境變量,當前選中 Worker 的 route 值 | 自動注入 |
| BALANCER_ROUTE_CHANGED | 環境變量,路由發生變化時設置 | 確保 Cookie 更新 |
| ProxyPass | 映射 URL 到 balancer | / balancer://mycluster/ |
Set-Cookie: ROUTEID=.2; path=/Cookie: ROUTEID=.2LogLevel debug 觀察路由選擇邏輯https://apache-host/balancer-manager(需配置 <Location /balancer-manager> SetHandler balancer-manager </Location>)Draining,待現有 Session 自然結束再下線BalancerMember ... status=+H 熱備,主節點故障自動切換ProxySet hcmethod=GET hcinterval=30 hcuri=/healthROUTEID Cookie + jvmRoute 對應