windows環境 Apache負載均衡及session共享環境搭建
第1章 概述
1.1 背景介紹
為了提高系統的高可用性及系統性能,我們常常會用到負載平衡,通過某種負載分擔技術,將外部發送來的請求均勻分配到某一臺伺服器上,而接收到請求的伺服器獨立地迴應客戶的請求。均衡負載能夠平均分配客戶請求到伺服器列陣,籍此提供快速獲取重要資料,解決大量併發訪問服務問題。
在負載均衡叢集下,除了要把請求按指定要求分發到不同的伺服器上,還有一個關鍵問題就是session的共享。當叢集中的一個Tomcat掛掉,下一次請求會被路由到其他Tomcat上,而之前的session資訊必須被重新獲取以保證使用者訪問狀態不會發生變化。
1.2 相關術語
簡寫 |
名稱 |
描述 |
Apache |
Apache HTTP Server |
Apache軟體基金會的一個開放原始碼的網頁伺服器 |
Tomcat |
Tomcat 伺服器 |
一個免費的開放原始碼的Web 應用伺服器,屬於輕量級應用伺服器,在中小型系統和併發訪問使用者不是很多的場合下被普遍使用。 |
Session |
會話 |
儲存整個使用者會話過程中保持其狀態的資訊,例如登入資訊或使用者瀏覽 Web應用程式時需要的其它資訊。 |
mod_proxy |
Apache模組:proxy_module |
提供HTTP/1.1代理/閘道器功能支援 |
mod_proxy_balancer |
Apache模組:proxy_balancer_module |
mod_proxy的擴充套件,提供負載平衡支援 |
Memcached |
分散式快取伺服器 |
是一個高效能的分散式記憶體物件快取系統, |
MSM |
memcached-session-manager |
一個高可用的Tomcat session共享解決方案 |
第2章 架構
2.1 總體架構
在負載均衡叢集中,同一個web應用部署在多個tomcat伺服器下,使用者傳送請求時,Apache對請求統一管理,分發到不同的tomcat下,每個使用者對應的session資訊儲存到指定的memcached節點。總體架構如下圖所示:
2.2 主要模組
2.2.1 負載均衡模組
負載均衡模組可以採用mod_proxy_blancer或mod_jk方式。
Ø mod_proxy_balancer:mod_proxy是一種分工合作的形式,通過主伺服器跳轉到各臺主機負責不同的任務而實現任務分工,這種形式不能實現負載均衡,只能提供主伺服器的訪問跳轉。mod_proxy_balancer是mod_proxy的擴充套件,提供負載平衡支援,通過mod_proxy_balancer.so包實現負載均衡。
Ø mod_jk:mod_jk是比較專門針對Tomcat的方法,通過AJP協議連線Tomcat。一個HTTP請求過來,mod_jk模組根據其URI選擇合適的worker來進行處理。如果是lb_worker(負載均衡的worker),就再根據各種條件選擇後臺合適的ajp_worker(處理AJP協議的worker)。ajp_worker將HTTP協議的包,組裝成AJP協議格式的包,然後選取一條空閒的連結,傳送給後臺的tomcat伺服器。等到後臺將資料傳送過來時,接收並解析AJP協議,重新組裝成HTTP協議,然後把結果傳送給客戶端。
2.2.2 session共享模組
在生產環境中可能會有多臺tomcat伺服器以及多臺可用的memcached節點,並安裝在不同的機器上,我們可以使用黏性session(sticky sessions)或者非黏性session(non-sticky sessions),memcached-session-manager(msm) 對這兩種操作模式都支援。
Sticky 模式: tomcatsession 為 主session, memcached 為備 session。Request請求到來時, 從memcached載入備 session到 tomcat (僅當tomcat jvmroute發生變化時,否則直接取tomcat session);Request請求結束時,將tomcat session更新至memcached,以達到主備同步之目的。
Non-Sticky模式:tomcatsession 為 中轉session, memcached1為主 sessionmemcached 2 為備session。Request請求到來時,從memcached 2載入備 session 到 tomcat,(當 容器 中還是沒有session 則從memcached1載入主 session 到 tomcat, 這種情況是隻有一個memcached節點,或者有memcached出錯時),Request請求結束時,將tomcat session更新至主memcached1和備memcached2,並且清除tomcat session,以達到主備同步之目的。
第3章 搭建步驟
3.1 軟體環境
Apache負載均衡及session共享環境部署軟體配置:
名稱 |
版本 |
用途 |
Apache |
2.2.19 |
主伺服器 |
JDK |
SUN 1.7.u.75 |
JDK環境 |
Tomcat |
7.0.59 |
Web應用容器 |
mod_jk-1.2.6-httpd-2.2.4.so |
1.2.6 |
用於mod_jk方式的支援模組 |
Memcached |
1.4.4 |
實現不同伺服器間session的共享 |
3.2 安裝配置
3.2.1 負載均衡配置
Ø mod_proxy_balancer方式的配置:
1) 安裝JDK1.7:(略);
2) 安裝tomcat7:(略);
3) 安裝Apache2.2.19:
① 將zip字尾的程式包解壓到某目錄下;
② 編輯根程式目錄下conf/httpd.conf檔案裡面的內容,將“ServerRoot”後面的路徑改為解壓後的實際路徑;
③ 以管理員身份執行cmd命令視窗,切換到Apache的程式目錄/bin,執行命令“httpd –k install”,然後可以在windows服務列表看到Apache2.2,可以通過服務列表直接啟動該服務;
④ 開啟瀏覽器,輸入localhost,如果出現“It works!”則表明已安裝成功。
4) 配置Apache:
① 開啟Apache根程式目錄下conf/httpd.conf,取消下面四行的註釋,用以開啟代理所需的.so支援模組。
#LoadModule proxy_http_module modules/mod_proxy_http.so #LoadModule proxy_connect_module modules/mod_proxy_connect.so #LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_module modules/mod_proxy_blancer.so |
② 在httpd.conf末尾新增如下內容:
ProxyPass / balancer://tomcatcluster/ ProxyPassReverse / balancer://tomcatcluster/ <Proxy balancer://tomcatcluster> BalancerMember ajp://localhost:8009 route=tomcat1 BalancerMember ajp://202.120.87.134:8009 route=tomcat2 </Proxy> |
5) 配置tomcat:
① 修改tomcat安裝目錄下conf/server.xml,在<Engine>標籤內新增jvmRoute屬性,屬性值和Apache配置檔案中的route一致。<Enginename=”Catalina” defaultHost=”localhost” jvmRoute=”tomcat1”>;
② 將<Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster”></Cluster>的註釋符去掉;
③ 將同樣的tomcat複製到其他伺服器目錄下,將第①步中的jvmRoute的值改為和Apache配置檔案中的route相對應。如果是在同一臺機器安裝多個tomcat,還需要更改對應的埠號以防止埠衝突。
至此,已完成mod_proxy_balancer方式的配置。
Ø mod_jk方式的配置:
1) 安裝JDK1.7,tomcat7,Apache2.2.19(方法同上);
2) 在apache根程式目錄下conf/httpd.conf檔案最後新增一句“include conf/mod_jk.conf”;
3) 將mod_jk-1.2.6-httpd-2.2.4.so拷貝到modules資料夾下,httpd.conf 同目錄下新建mod_jk.conf檔案,內容如下:
LoadModule jk_module modules/mod_jk.so JkWorkersFile conf/workers.properties JkMount /* controller |
4) 在httpd.conf同目錄下新建workers.properties檔案,內容如下:
worker.list = controller,tomcat1,tomcat2 #========tomcat1======== worker.tomcat1.port=8009 worker.tomcat1.host=localhost worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor=1 #========tomcat2======== worker.tomcat2.port=8009 worker.tomcat2.host=202.120.87.134 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor=2 #========controller======== worker.controller.type=lb worker.controller.balanced_workers=tomcat1,tomcat2 worker.controller.sticky_session=false |
5) 配置tomcat(方法同mod_proxy_balancer方式第六步)。
3.2.2 session共享配置
1) 安裝Memcached1.4:
① 將zip字尾的程式包解壓到某目錄下;
② 以管理員身份執行cmd命令視窗,切換到memcached的程式目錄/bin,執行命令“memcached.exe –d install”,然後可以在windows服務列表看到memcached,可以通過服務列表直接啟動該服務。
2) 將以下jar包拷貝到tomcat的lib目錄下:
spymemcached-2.11.1.jar,couchbase-client-1.2.2.jar, minlog-1.2.jar, kryo-serializers-0.11.jar,msm-kryo-serializer-1.8.3.jar, kryo-1.04.jar, reflectasm-1.09-shaded.jar,couchbase-client-1.4.0.jar, asm-3.2.jar,msm-serializer-benchmark-1.8.3.jar, memcached-session-manager-1.8.3.jar,msm-javolution-serializer-1.8.3.jar,memcached-session-manager-tc7-1.8.3.jar
3) 修改tomcat安裝目錄下conf/context.xml,在<context>標籤內新增如下內容:
<Manager className=”de.javakaffee.web.msm.MemcachedBackupSessionManager” memcachedNodes=”n1:202.120.87.217:11211,n2:202.120.87.134:11211” sticky=”false” sessionBackupAsync=”false” lockingMode=”auto” requestUriIgnorePattern=”.*\.(ico|png|gif|jpg|css|js)$” transcoderFactoryClass=”de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory” /> |
3.3 應用驗證
在tomcat的webapps目錄下新建資料夾test,建立檔案test.jsp,內容如下:
<%@ page contentType=”text/html; charset=utf-8” %> <%@ page import=”java.util.*” %> <html><head><title>Cluster App Test</title></head> <body> <% System.out.println(“SessionID:” + session.getId()); %> Server Info: <% out.println(request.getServerName() + “ : “ + request.getServerPort()+”<br>”); %> <% out.println(“<br>ID“+session.getId()+”<br>”); //如果有新的Session屬性設定 String dataName = request.getParameter(“dataName”); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter(“dataValue”); session.setAttribute(dataName, dataValue); } out.print(“<b>Session 列表</b><br>”); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + “ = “ + value+”<br>”); System.out.println( name + “ = “ + value); } %> <form action=”test.jsp” method=”post”> 名稱:<input type=text size=20 name=”dataName”> <br> 數值:<input type=text size=20 name=”dataValue”> <br> <input type=submit> </form> </body> </html> |
在瀏覽器中輸入localhost/test/test.jsp,看到如下介面:
在文字框中隨便輸入一些字母數字,可以看到各個tomcat視窗會輪流顯示當前的session資訊,而且前一個tomcat的session資訊跳轉到下一個tomcat時不會丟失。