【Apache+Tomcat+Session+Memcache 高性能群集搭建】

火星人 @ 2014-03-03 , reply:0


【Apache+Tomcat+Session+Memcache 高性能群集搭建】

【Apache+Tomcat+Session+Memcache 高性能群集搭建】

    隨著IT行業的發展,linux伺服器在企業中應用廣泛,人們對linux上的應用服務要求也越來越高,上篇搭建了nginx群集,今天我們來搭建目前用得最多的apache群集,接下來我們親自來搭建一個屬於自己的高性能web伺服器,負載均衡伺服器。

一、Apache+Tomcat+Session+Memcache



共享 高性能群集服務搭建,本文採用目前主流版本搭建,搭建環境及版本如下列表:
系統版本:Centos 5.3 64位系統
Nginx版本為:httpd-2.2.13.tar.bz2  
Jdk版本為:1.6.0_18_64
Tomcat版本為:Apache Tomcat/6.0.30
其他相似版本也可以!安裝服務所需的包如下下載路徑:本網站集成部分下載:

jdk請到以下網站下載:請選擇自己系統版本的jdk。

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter【Apache、Tomcat下載地址,下載到/usr/src下】


cd  /usr/src && wget  http://blog.mgcrazy.com/download/{httpd-2.2.13.tar.bz2,apache-tomcat-6.0.30.tar.gz }

二、安裝Apache

cd /usr/src && tar -jxvf httpd-2.2.13.tar.bz2 && cd httpd-2.2.13/srclib/apr &&./configure --prefix=/usr/local/apr &&make &&make install &&cd ../apr-util/ && ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr &&make&&make install && cd ../../ && ./configure --prefix=/usr/local/apache2 --enable-mods-shared=all --with-mpm=worker --enable-deflate --enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache --enable-proxy --enable-proxy-ajp --enable-proxy-balancer --enable-proxy-http --enable-rewrite --enable-charset-lite --disable-ipv6 --disable-dav --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

可以直接拷貝安裝apache

【注意*這裡安裝mod_proxy處理Tomcat jsp頁面模塊,安裝apr、apr-util增加Tomcat處理性能,當然也可以用mod_jk的方式,如果是mod_jk的方式的話,可以參考這篇文章:

http://bbs.linuxtone.org/thread-1195-1-1.html 】



三、Tomcat安裝配置:



(1)、將所需的包下載至/usr/src 目錄;首先安裝jdk:

chmod o+x jdk* && ./jdk* ;程序包會提示按回車鍵,我們根據提示安裝即可,解壓完畢,會在當前目錄生成 jdk1.6.0_18 這個文件夾,
mkdir -p /usr/java && mv jdk1.6.0_18 /usr/java/下

vi /etc/profile 最後面加入以下語句:
export JAVA_HOME=/usr/java/jdk1.6.0_18
export CLASSPATH=$CLASSPATHJAVA_HOME/libJAVA_HOME/jre/lib
export PATH=$JAVA_HOME/binJAVA_HOME/jre/binPATHHOMR/bin
source /etc/profile //使環境變數馬上生效
java –version //查看java版本,顯示版本是1.6.0_18,並且是64位的證明安裝成功!
【 Java HotSpot(TM) 64-Bit Server VM (build 16.0-b10, mixed mode) 】

cd /usr/src && tar xzf apache-tomcat-6.0.30.tar.gz
解壓完成執行:
mv apache-tomcat-6.0.30 /usr/local/tomcat_1 && cp /usr/local/tomcat_1 /usr/local/tomcat_2 -r
【移動到/usr/local下並重命名為tomcat_1文件夾,並cp一個tomcat_2】
部署兩個Tomcat群集做負載均衡用!

(2)、設置tomcat的java變數
cd /usr/local/tomcat_1/bin/ && vi setenv.sh 創建一個setenv.sh腳本文件,添加如下語句即可
JAVA_HOME=/usr/java/jdk1.6.0_18
JAVA_JRE=/usr/java/jdk1.6.0_18/jre
並且拷貝setenv.sh文件到tomcat_2/bin/下:

cp -p /usr/local/tomcat_1/bin/setenv.sh /usr/local/tomcat_2/bin 下即可!
保存退出
檢查兩個tomcat下bin目錄的*.sh 文件是否有可執行許可權,如果沒有則進入到相應的目錄執行 chmod o+x *.sh 即可!

給兩個tomcat分別創建不同的目錄如下:mkdir -p /usr/webapps/{www_1,www_2}



(3)、設置Tomcat的 server.xml文件:
【以下是我的tomcat配置文件具體內容,本想把有配置都粘貼在這裡,顯示有點題,所有用了兩個web鏈接!這樣一來部分解釋就產生了影響。不明白的歡迎留言】
這個是完整的server.xml文件下載地址:
http://blog.mgcrazy.com/download/server.xml.tgz


tomcat_2的配置文件下載地址:
http://blog.mgcrazy.com/download/server2.xml.tgz



兩個Tomcat配置的cluster裡面的埠分別為4000、4001 ,必須設置成不同的埠;而且得分別設置兩個jvmroute名稱,一會在apache配置文件中會用到!

四、Tomcat session會話複製:
分別在兩個tomcat的conf下web.xml文件裡面加入如下一行即可:

修改web應用裡面WEB-INF目錄下的web.xml文件,加入標籤,也可以加在應用的web.xml裡面如下:

<distributable/>

直接加在</web-app>之前就可以了

這個是加入tomcat的session複製的,做tomcat集群必須需要這一步,否則用戶的session就無法正常使用

配置完畢后,我們測試一下廣播
java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal1
java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal2

如果不報錯則能正常廣播
tomcat-replication.jar 下載:http://cvs.apache.org/~fhanik/tomcat-replication.jar
如果是兩台機器的話,可以用tcpdump 抓包看看!

Tomcat配置完畢,啟動兩個tomcat,先啟動tomcat1,tomcat_1啟動日誌如下:
信息: Initializing Coyote HTTP/1.1 on http-8080
2011-3-18 19:56:21 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 1088 ms
2011-3-18 19:56:21 org.apache.catalina.core.StandardService start
信息: Starting service Catalina
2011-3-18 19:56:21 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/6.0.18
2011-3-18 19:56:21 org.apache.catalina.ha.tcp.SimpleTcpCluster start
信息: Cluster is about to start
2011-3-18 19:56:21 org.apache.catalina.tribes.transport.ReceiverBase bind
信息: Receiver Server Socket bound to:/192.168.2.79:4000
2011-3-18 19:56:21 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
信息: Setting cluster mcast soTimeout to 500
2011-3-18 19:56:21 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:4
2011-3-18 19:56:22 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
信息: Done sleeping, membership established, start level:4
2011-3-18 19:56:22 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:8
2011-3-18 19:56:23 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
信息: Done sleeping, membership established, start level:8
2011-3-18 19:56:23 org.apache.catalina.ha.deploy.FarmWarDeployer start
嚴重: FarmWarDeployer can only work as host cluster subelement!
2011-3-18 19:56:23 org.apache.catalina.ha.session.DeltaManager start
信息: Register manager to cluster element Engine with name Catalina
2011-3-18 19:56:23 org.apache.catalina.ha.session.DeltaManager start
信息: Starting clustering manager at
2011-3-18 19:56:23 org.apache.catalina.ha.session.DeltaManager getAllClusterSessions
信息: Manager : skipping state transfer. No members active in cluster group.
2011-3-18 19:56:23 org.apache.catalina.ha.session.JvmRouteBinderValve start
信息: JvmRouteBinderValve started
2011-3-18 19:56:23 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2011-3-18 19:56:24 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8411
2011-3-18 19:56:24 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/42 config=null
2011-3-18 19:56:24 org.apache.catalina.startup.Catalina start
信息: Server startup in 2676 ms

Tomcat_2的日誌如下:

000,{-64, -88, 2, 79},4000, alive=86901,id={78 42 25 -19 -102 3 64 10 -76 93 69 -43 45 76 95 -112 }, payload={}, command={}, domain={}, ]. This operation will timeout if no session state has been received within 60 seconds.
2011-3-18 19:57:48 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report
信息: ThroughputInterceptor Report[
Tx Msg:1 messages
Sent:0.00 MB (total)
Sent:0.00 MB (application)
Time:0.01 seconds
Tx Speed:0.04 MB/sec (total)
TxSpeed:0.04 MB/sec (application)
Error Msg:0
Rx Msg:1 messages
Rx Speed:0.00 MB/sec (since 1st msg)
Received:0.00 MB]

2011-3-18 19:57:48 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions
信息: Manager ; session state send at 11-3-18 下午7:57 received in 125 ms.
2011-3-18 19:57:48 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report
信息: ThroughputInterceptor Report[
Tx Msg:2 messages
Sent:0.00 MB (total)
Sent:0.00 MB (application)
Time:0.05 seconds
Tx Speed:0.02 MB/sec (total)
TxSpeed:0.02 MB/sec (application)
Error Msg:0
Rx Msg:2 messages
Rx Speed:0.00 MB/sec (since 1st msg)
Received:0.00 MB]

2011-3-18 19:57:49 org.apache.catalina.ha.session.JvmRouteBinderValve start
信息: JvmRouteBinderValve started
2011-3-18 19:57:49 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8081
2011-3-18 19:57:49 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8412
2011-3-18 19:57:49 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/34 config=null
2011-3-18 19:57:49 org.apache.catalina.startup.Catalina start
信息: Server startup in 2962 ms
如果有報錯或者請查看原因!
skipping state transfer. No members active in cluster group.」
mcastBindAddress 沒有添加或添加得不對

【如上報錯,如果啟動其中一個報的錯,而且已經修改了mcastBindAddress,此時還是有報錯,我們可以不用管,在啟動另一個 tomcat看看,第二個tomcat沒有No members active in cluster group,則表示兩個tomcat通信正常。】



五、配置Apache+Session



【新建vhosts.conf proxy.conf 文件,並在httpd.conf文件末行添加:

Include conf/vhosts.conf

Include conf/proxy.conf

如上兩行即可!

把以下內容寫入到vhosts.conf裡面:<VirtualHost *:80>

    ServerAdmin wgkgood@163.com

    DocumentRoot "/usr/webapps/www」

    ServerName  192.168.2.79

       <Directory "/usr/webapps/www ">

       AllowOverride None

       Options None

       Order allow,deny

       Allow from all

    </Directory>

    RewriteEngine On

    ProxyPreserveHost On

    RewriteRule ^$ balancer://wwwCluster/

RewriteRule ^/(.*)$ balancer://wwwCluster/$1

ProxyPass / balancer://wwwCluster/ stickysession=JSESSIONID|jsessionid nofailover=On   

ProxyPassReverse / balancer://wwwCluster/



<roxy balancer://wwwCluster>

BalancerMember ajp://localhost:8411 loadfactor=1 route=tomcat1 smax=5 max=20 ttl=120 retry=300 timeout=15   

BalancerMember ajp://localhost:8412 loadfactor=1 route=tomcat2 smax=5 max=20 ttl=120 retry=300 timeout=15

</Proxy>  


</VirtualHost>【注意:* /usr/webapps/www 內容其實跟/usr/webapps/www_1是一樣的;最後紅色部分是session複製部分。綠色字體部分是處理tomcat請求。這段代碼必須放在虛擬主機裡面,放在proxy.conf裡面的話,session綁定不會生效。所以要註釋掉httpd.conf裡面Include conf/proxy.conf這個配置。】


六、配置Session共享Memcache

下載如下memcache套件包:本站點集成下載:
http://blog.mgcrazy.com/download/session-memcache/javolution-5.4.3.1.jar
http://blog.mgcrazy.com/download/session-memcache/memcached-2.5.jar
http://blog.mgcrazy.com/download/session-memcache/memcached-session-manager-1.3.0.jar
http://blog.mgcrazy.com/download/session-memcache/msm-javolution-serializer-1.3.0.jar
http://blog.mgcrazy.com/download/session-memcache/msm-javolution-serializer-cglib-1.3.0.jar
http://blog.mgcrazy.com/download/session-memcache/msm-javolution-serializer-jodatime-1.3.0.jar
下載后,分別放在兩個tomcat的lib下:【/usr/local/tomcat_1/lib下即可】
然後分別兩個tomcat配置文件:server.xml最後</host>前一行裡面添加如下代碼:<Manager className=」de.javakaffee.web.msm.MemcachedBackupSessionManager」   
        memcachedNodes=」n1:192.168.0.84:11211″   
        requestUriIgnorePattern=」.*\.(png|gif|jpg|css|js)$」   
        sessionBackupAsync=」false」   
        sessionBackupTimeout=」100″   
        transcoderFactoryClass=」de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory」   
        copyCollectionsForSerialization=」false」  />如果有多個memcache緩存伺服器,可以在上面192.168.0.84:11211后已空格分開!例如:
n1:192.168.0.84:11211  n2:192.168.0.84:11213  即可!


tomcat_1的發布目錄index.jsp內容為:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
%>
http://blog.mgcrazy.com

<%out.print(request.getSession()) ;%>

<%out.println(request.getHeader("Cookie")); %>

tomcat_2的發布目錄index.jsp內容為:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
%>
http://wgkgood.gicp.net

<%out.print(request.getSession()) ;%>

<%out.println(request.getHeader("Cookie")); %>


所以配置完畢,重啟tomcat和apache即可!

最後測試!在同一個ie瀏覽器窗口下 ctrl+f5刷新,都是同一個tomcat內容,它不會跳轉到另一tomcat

http://192.168.2.79 結果如下:

http://wgkgood.gicp.net

org.apache.catalina.session.StandardSessionFacade@2d7aece8
JSESSIONID=FEB19E24719ED666D1C9C50A7A09A2BA.tomcat2

另一個firefox瀏覽器窗口為:

http://blog.mgcrazy.com

org.apache.catalina.session.StandardSessionFacade@259e215b
rtime=0; ltime=1298014951125; cnzz_eid=85744900-1298010049-; Hm_lvt_0e74098a87be059a433e5a74f1b5fecf=1298014951312; Hm_lvt_b7c035fd79b2c378053e06c86493de76=1300439158373; JSESSIONID=B2574ABB491F50F37162479BD3FE761C.tomcat1

無論你怎麼刷新同一個窗口下都不會變!



最後,本環境是在一台機器,也可以是多台機器,只需要修改負載的ip即可。
apache+tomcat+session不能實現故障轉移,可以採用nginx+tomcat+session實現故障轉移,或者LVS+後端apache均衡;另外去掉session綁定的話,apache+tomcat負載均衡、並且可以帶故障轉移。


本文參考: http://blog.mgcrazy.com/thread-976-1.html

http://bbs.linuxtone.org/thread-1195-1-1.html

http://wenku.baidu.com/view/9be81bd376a20029bd642d6f.html

本文出自 「【煙雨樓台】」 博客,請務必保留此出處http://wgkgood.blog.51cto.com/1192594/546223



[火星人 via ] 【Apache+Tomcat+Session+Memcache 高性能群集搭建】已經有177次圍觀

http://www.coctec.com/docs/service/show-post-2375.html