Terracotta + Apache + Tomcat 負載均衡實踐篇

前言

這兩天在學習ehcache分佈式緩存方案時接觸到了Terracotta。幾年前剛做開發工作時想用Terracotta集羣SpringBeans,當時網上資料少,嘗試很久沒成功就沒繼續下去了。

於是我又在網上搜羅一些資料,發現這玩意已經很成熟了,有很多深度應用的產品,分佈式緩存、調度等。引用網上的描述:

Terracotta是一款由美國Terracotta公司開發的著名開源Java集羣平臺。它在JVM與Java應用之間實現了一個專門處理集羣功能的抽象層,以其特有的增量檢測、智能定向傳送、
分佈式協作、服務器鏡像、分片等技術,允許用戶在不改變現有系統代碼的情況下實現單機Java應用向集羣話應用的無縫遷移。使得用戶可以專注於商業邏輯的開發,
由Terracotta負責實現高性能、高可用性、高穩定性的企業級Java集羣

運行環境

  1. JDK1.6.22 + Tomcat6 + Apache2.2.19 + Terracotta Open Source 3.5.2 + zlib1.2.3(安裝apache需要)
  2. 模擬雙機環境:本機Window 7操作系統(佈署Tomcat,Terracotta,IP:192.168.1.51 ) + VMware 虛擬機 Linux系統(佈署Apache,Tomcat,IP:192.168.1.207)。
  3. 在Terracotta + Apache + Tomcat 負載均衡構架中,Terracotta 起到session服務器作用,實時多機間的session緩存與複製(JVM Field級別,比Tomcat自帶的效率高)。

實施布驟

win7系統

1.安裝Terracotta(下載地址:http://www.terracotta.org/dl/oss-download-catalog)

下載後直接點擊安裝,完成後關注安裝目錄下的sessions目錄,裏面有其於jetty服務器的example和依賴的jar。其中的cart.war被我用做集羣的測試工程。


2.安裝Tomcat JDK等省略(網上查資料)。

linux系統

1.安裝 Tomcat JDK等省略(網上查資料)

2.安裝  zlib-1.2.3.tar.gz(下載地址:http://ishare.iask.sina.com.cn/f/14331439.html?from=like), apache服務器安裝時沒有這個庫會報錯。

將zlib-1.2.3.tar.gz拷貝至/usr/目錄

# tar -zxvf zlib-1.2.3.tar.gz

# cd zlib-1.2.3

# ./configure

# make

# make install

3. 安裝 Apache 服務器(下載地址:http://httpd.apache.org/download.cgi)

httpd-2.2.19.tar.gz 拷貝到/usr/目錄

# tar -zxvf httpd-2.2.19.tar.gz

# cd /usr/httpd-2.2.19/

#./configure --prefix=/usr/local/apache --enable-modules=so --enable-mods-shared=all --enable-proxy --enable-proxy-connect --enable-proxy-ftp --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer --enable-rewrite

# make
# make install
4.apache已被安裝至/usr/local/apache
第二步、配置集羣
配置Tomcat(兩臺機器的Tomcat相同)
 1.拷貝${Terracotta_Home}/sessions/terracotta-session-1.1.2.jar和${Terracotta_Home}/common/terracotta-toolkit-1.3-runtime-3.2.0.jar至tomcat安裝目錄的lib目錄。
2.修改conf/context.xml文件
<Context>
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <!--加上這一句,Terracotta 代理HttpServletSession-->
    <Valve className="org.terracotta.session.TerracottaTomcat60xSessionValve" tcConfigUrl="192.168.1.51:9510"/>
</Context>
3.修改conf/server.xml文件
a.保證 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />沒有被註釋,AJP協議是Apache負載均衡時與後端主機的二進制 通訊協議。
b.如果配置粘性Session,需要配置服務器路徑名jvmRoute。
<!--粘性Session配置
<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">  
-->
<Engine name="Standalone" defaultHost="localhost"> 

配置Apache服務器
1.Proxy配置,創建文件並編輯以下內容,並保存爲/usr/local/apache/conf/extra/httpd-modproxy.conf
<Location /server-status>
    SetHandler server-status
    Order Deny,Allow
    Deny from all
    Allow from all
</Location>
# 監控負載主機活動狀態,響應連接與流量等,生產環境建議拿掉。
<Location /balancer-manager>
    SetHandler balancer-manager
    Order Deny,Allow
    Deny from all
    Allow from all
</Location>
ProxyRequests Off
ProxyPass /cart balancer://tomcatcluster nofailover=On
# 粘性Session使用以下配置
# ProxyPass /cart balancer://tomcatcluster stickysession=JSESSIONID|jsessionid nofailover=On

# 反向代理,響應頭信息的 Content-Location
ProxyPassReverse /cart balancer://tomcatcluster
<Proxy balancer://tomcatcluster>
# 粘性Session配置
# BalancerMember ajp://192.168.1.51:8009/cart loadfactor=1 route=jvm1
# BalancerMember ajp://192.168.1.207:8009/cart loadfactor=1 route=jvm2

  BalancerMember ajp://192.168.1.51:8009/cart
BalancerMember ajp://192.168.1.207:8009/cart
# status=+H 爲配置熱備,當所有機器都over時,纔會請求該機器。
# BalancerMember http://192.168.1.51:8009 status=+H
# 按照權重
# ProxySet lbmethod=bytraffic
# 按負載量,也就是負載少的派發請求
# ProxySet lbmethod=bybusyness
# 按請求次數

ProxySet lbmethod=byrequests
</Proxy>注意:
1.ProxyPass 配置的是映射策略,當使用粘性Session策略時stickysession=JSESSIONID|jsessionid是必須的。
2.BalancerMember 配置的是子機的地址。
3.ProxySet配置的是負載均衡策略bytraffic、bybusyness、byrequests,我這裏配置的是按請求次數。
4.當使用權重負載策略時BalancerMember可加上loadfactor權重屬性。
5.當需要粘性Session時BalancerMember屬要加上route路線屬性,對應於Tomcat的context.xml中的配置。 
2.修改conf/httpd.conf文件
a.確保以下幾點未被註釋
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule status_module modules/mod_status.so
b.增加以下內容用於導入Proxy配置文件:
# Proxypass Config
Include conf/extra/httpd-modproxy.conf

目前爲止配置已大功告成微笑

第三步、啓動服務
1.先啓動Terracotta服務器,否則Tomcat會因爲找不到Terracotta而Warn。
${Terracotta_home}/bin/start-tc-server.bat
2.啓動兩臺機器的Tomcat,
${tomcat_home}/bin/startup.bat或startup.sh(linux系統),如果與Terracotta連接成功,可以看到如下畫面。

3.啓動Apache服務器
# /usr/local/apache/bin/apachectl start(停止服務是apachectl  stop)。
第四步、測試結果
前面提供cart.war示例,我已預先放到tomcat的webapp下。
打開瀏覽器輸入:http://192.168.1.207/cart,顯示映射成功:
多刷新幾次頁面後查看http://192.168.1.207/balancer-managerElected均勻分佈,負載均衡起作用了。


把基中一臺Tomcat關閉,再次刷新頁面,沒有任何問題。用戶完全感覺不出來主機故障。這就是傳說中的故障轉移吧。。呵呵,在公司沒機會實踐只能自己弄來玩玩而已了。奮鬥

再打開Terracotta 控制檯看看,Session被緩存在主機上了。有兩個Session是因爲我開了兩個瀏覽器,實際上負載均衡的兩臺Tomcat是共享Session的,當然也可以把Web應用設計成無用戶狀態的,那就不需要Terracotta 。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章