叢集原理
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是不會變化的。