2016年8月4日,第一次開筆寫博客園,今天在公司解決了一個問題。
apache+jboss做負載均衡的問題一直困擾了很久。問題描述如下,使用apche做反向代理轉發給3台jboss 的app,app有session會話。為了跳轉不丟失session會話,需要配置。經過幾天的尋找,大概有兩種方法:
1、jboss上配置session共享
2、apache上將請求轉發至已訪問過的鏈路
Session處理
另一方面就是多個業務邏輯單元之間的Session處理,處理方式有兩種,一種是Session sticky模式,另外一種是Session共享模式。
Session處理方式
Session Sticky
Session共享
處理邏輯
把同一個用戶的Session一直發送到同一個邏輯單元處理
所有的後端處理邏輯單元共享Session或者Session更新時通知其它邏輯單元
主要實現方式
指定負載的分發組件(如Apache),把請求中包含特定屬性的請求發到同一個連接,如指定jsessionid一致的請求到同一個請求,或者在負載組件中給每個響應增加一個頭部屬性,指定下次的分發目的地
優勢
本地維護Session,不需要訪問網絡存取或者通知其它處理單元變更
完全的隨機分發,可以根據服務忙閒調整分發策略,高可用性
劣勢
一台服務器宕機後,當前Session斷掉
網絡存取操作等耗時,影響處理效率(根據選用的策略不同造成影響不同)
官方文檔描述:
Before we dive into the technical details, here's an example of how you might use mod_proxy_balancer
to provide load balancing between two back-end servers:
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.50:80
BalancerMember http://192.168.1.51:80
</Proxy>
ProxyPass /test balancer://mycluster
Another example of how to provide load balancing with stickyness using mod_headers
, even if the back-end server does not set a suitable session cookie:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.50:80 route=1
BalancerMember http://192.168.1.51:80 route=2
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /test balancer://mycluster
ProxyRequests Off 這條可以看出,實際上負載均衡器就是一個反向代理,只不過它的代理轉發地址不是某台具體的服務器,而是一個 balancer:// 協議: ProxyPass / balancer://mycluster協議地址可以隨便定義。然後,在<Proxy>段中設置該balancer協議的內容即可。 BalancerMember指令可以添加負載均衡組中的真實服務器地址。
摘抄網上信息:
配置負載分發
以下配置修改都是在Apache的conf/httpd.conf配置文件中完成
1. 修改加載mod proxy需要的模塊
找到配置中被注釋掉的幾行,刪除注釋,使Apache在啟動的時候加載如下模塊
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.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. 給HTTP請求頭部添加路由標識
直接在loadModule模塊下面增加即可
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
3. 配置負載均衡後端的業務邏輯單元處理地址
注意本步驟標紅的需要與上面步驟中的ROUTEID一致。
<Proxy balancer://mycluster>
BalancerMember http://192.168.77.213:9005 route=1
BalancerMember http://192.168.77.213:9004 route=2
BalancerMember http://192.168.77.213:9002 route=3
BalancerMember http://192.168.77.213:9003 route=4
ProxySet stickysession=ROUTEID
</Proxy>
4. 配置mod proxy路由規則
ProxyPass / balancer://mycluster/
注意“/”不要少加,mycluster與上面的後端處理集群的名字一致。這裡的意思是把所有的請求都轉發給上面的集群進行處理
5. 2,3,4步驟的最終配置如下:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://mycluster>
BalancerMember http://192.168.77.213:9005 route=1
BalancerMember http://192.168.77.213:9004 route=2
BalancerMember http://192.168.77.213:9002 route=3
BalancerMember http://192.168.77.213:9003 route=4
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass / balancer://mycluster/