天天看點

使用Apache搭建Sticky模式的Tomcat叢集

叢集原理

Web叢集分成兩個方面:

負載分發

一方面是水準擴充,通過接入代理進行負載分發,分發到背景多個實際的業務處理邏輯單元上。這種接入代理可以是nginx,Apache等軟體負載,也可以是類似F5等硬體負載。具體方式參見nginx負載或Apache負載等。

Session處理

另一方面就是多個業務邏輯單元之間的Session處理,處理方式有兩種,一種是Session sticky模式,另外一種是Session共享模式。

Session處理方式 Session Sticky Session共享
處理邏輯 把同一個使用者的Session一直發送到同一個邏輯單元處理 所有的後端處理邏輯單元共享Session或者Session更新時通知其它邏輯單元
主要實作方式 指定負載的分發元件(如Apache),把請求中包含特定屬性的請求發到同一個連接配接,如指定jsessionid一緻的請求到同一個請求,或者在負載元件中給每個響應增加一個頭部屬性,指定下次的分發目的地

1.       各自維護Session,當請求處理結束後,通知其它元件單元更新Session,包括異步和同步模式

2.       統一維護Session,如把Session放在memcached或者共享檔案系統中,可以在容器級别或者應用級别做這個事情

3.       利用cache server

優勢 本地維護Session,不需要通路網絡存取或者通知其它處理單元變更 完全的随機分發,可以根據服務忙閑調整分發政策,高可用性
劣勢 一台伺服器當機後,目前Session斷掉 網絡存取操作等耗時,影響處理效率(根據選用的政策不同造成影響不同)

搭建步驟

本文檔所闡述場景:使用Apache modproxy模式進行負載分發,Session使用Session Sticky模式。

安裝部署Tomcat

略。

注意:多台Tomcat之間毫無關聯,不需要做任何配置。

安裝Apache HttpServer

略。

注意:Apache需要使用2.2以上的版本,支援mod proxy模式。

配置負載分發

以下配置修改都是在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/

驗證

打開位址http://192.168.13.242:7080/smsshall/welcome.do進行驗證(注意Apache是監聽192.168.13.242:7080位址的)。

使用firebug檢視cookies資訊,多次重新整理,cookies中的ROUTEID是一緻的。

重新打開多個浏覽器,重新整理,嘗試,看ROUTEID,同一個浏覽器的ROUTEID是不會變化的。