1. 程式人生 > >windows環境 Apache負載均衡及session共享環境搭建

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節點。總體架構如下圖所示:

負載均衡及session共享總體架構圖

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時不會丟失。

tomcat1介面tomcat2介面