1、準備 css
下載Jboss 5.1.0, 配置JBOSS_HOME, JAVA_HOME環境變量,並把$JBOSS_HOME/bin添加到PATH環境變量中。本文要在兩臺服務器——IP分別爲10.123.76.103和10.123.76.104——上部署兩臺Jboss應用服務器。 此外在第三臺服務器上安裝Apache 2.2服務器,並配置環境變量APACHE_HOME html
2、配置 前端
1) 複製依賴包和創建相關目錄 node
cp jboss-5.1.0.GA/server/all/lib/hibernate-jbosscache2.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/jbosscache-core.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/jbosscache-pojo.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/jgroups.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/avalon-framework.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/jacorb.jar $JBOSS_HOME/server/default/lib/ cp -rf jboss-5.1.0.GA/server/all/deploy/cluster $JBOSS_HOME/server/default/deploy/ mkdir $JBOSS_HOME/server/default/deploy-hasingleton cp jboss-5.1.0.GA/server/all/deploy/quartz-ra.rar $JBOSS_HOME/server/default/deploy/ cp jboss-5.1.0.GA/server/all/deploy/mail-ra.rar $JBOSS_HOME/server/default/deploy/
2) 打開$JBOSS_HOME/server/default/deploy/messaging/messaging-service.xml文件,將 web
<attribute name="ServerPeerID">${jboss.messaging.ServerPeerID:0}</attribute>
改成 shell
<attribute name="ServerPeerID">${jboss.messaging.ServerPeerID:1}</attribute>
另外一臺服務器配置改成: apache
<attribute name="ServerPeerID">${jboss.messaging.ServerPeerID:2}</attribute>
更多服務器也如此設置。須要注意的就是不一樣服務器節點的這個ServerPeerID數值不能重複. 瀏覽器
注:若是messaging文件夾不存在,則先從$JBOSS_HOME/all中拷貝相關的文件 安全
cp -rf jboss-5.1.0.GA/server/all/deploy/messaging $JBOSS_HOME/server/default/deploy/ cp jboss-5.1.0.GA/server/all/deploy/jms-ra.rar $JBOSS_HOME/server/default/deploy/
3) 打開 ${JBOSS_HOME}/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml文件,去掉<property name="useJk">false<property>附近的註釋,並改成 服務器
<!-- 是否使用mod_jk 鏈接器 --> <property name="useJK">true</property> <!-- 是否使用粘性session, true表示粘性--> <property name="useSessionPassivation">true</property> <property name="passivationMaxIdleTime">-1</property> <property name="passivationMinIdleTime">-1</property>
注:在這個配置文件中能夠修改session的複製模式.詳細請參考jboss官方文檔
4) 打開須要作集羣的Java Web應用的web.xml 文件,在</web-app>以前添加 <distributable/>標記
若是須要對全部的Java Web應用作集羣,那麼能夠在$JBOSS_HOME/server/default/deployers/jbossweb.deployer/web.xml裏添加<distributable/>標記
5) 打開$JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml , 將
<Engine name="jboss.web" defaultHost="localhost">
改成
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">
另外一臺機器配置改成
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node2">
此外, 給<Connector protocol ="AJP/1.3">..</Connector>添加屬性connectionTimeout="60000"
更多服務器也一樣配置。 須要注意,jvmRoute的值不能重複
ps: 若是你在本地部署兩臺Jboss服務器,你須要修改配置文件 $JBOSS_HOME/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml , 讓監聽的端口錯開。
若是但願集羣經過指定的IP進行通信,打開$JBOSS_HOME\server\all\deploy\cluster\jgroups-channelfactory.sar\META-INF\jgroups-channelfactory-stacks.xml, 修改成
<TCPPING timeout="3000" initial_hosts="${192.168.1.104[7810],192.168.1.106[7810]}" port_range="1" num_initial_members="3"/>
其中104是本機Node的ip地址,106是另外一個機器Node的ip地址
另外一臺機器改爲:
<TCPPING timeout="3000" initial_hosts="${192.168.1.106[7810],192.168.1.104[7810]}" port_range="1" num_initial_members="3"/>更多的服務器也如是配置
6) 爲Apache配置mod_jk鏈接器
打開$APACHE_HOME/conf/httpd.conf, 添加以下配置:
# mod_jk LoadModule jk_module modules/mod_jk.so # # Configure mod_jk # # JkWorkersFile conf/workers.properties JkMountFile conf/uriworkermap.properties JkLogFile logs/mod_jk.log JkLogLevel warn # JkMount /* loadbalancer
在$APACHE_HOME/conf目錄下創建workers.properties文件,內容爲:
# Define list of workers that will be used # for mapping requests worker.list=loadbalancer,status # Define Node1 # modify the host as your host IP or DNS name and your AJP 1.3 port worker.node1.port=6009 worker.node1.host=10.123.76.103 worker.node1.type=ajp13 worker.node1.lbfactor=1 worker.node1.socket_timeout=60 worker.node1.connection_pool_timeout=60 worker.node1.ping_mode=A worker.node1.ping_timeout=20000 worker.node1.connect_timeout=20000 # Define Node2 # modify the host as your host IP or DNS name and your AJP 1.3 port worker.node2.port=7009 worker.node2.host=10.123.76.104 worker.node2.type=ajp13 worker.node2.lbfactor=1 worker.node2.socket_timeout=60 worker.node2.connection_pool_timeout=60 worker.node2.ping_mode=A worker.node2.ping_timeout=20000 worker.node2.connect_timeout=20000 # Load-balancing behaviour worker.loadbalancer.type=lb worker.loadbalancer.balance_workers=node1,node2 worker.loadbalancer.sticky_session=true worker.loadbalancer.sticky_session_force=false # Status worker for managing load balancer worker.status.type=status
注意: jboss服務器的IP和鏈接端口必須與jbo中的聲明一致.
在$APACHE_HOME/conf 目錄下建立uriworkermap.properties,內容爲:
# 能夠將一些靜態資源(好比gif,jpg,css文件等) 放在apache的發佈目錄下,這樣當客戶端須要獲取這些資源時,無需到jboss服務器拿,從而提升響應速度,減輕jboss應用服務器的壓力 !/*.gif=loadbalancer !/*.jpg=loadbalancer !/*.png=loadbalancer !/*.css=loadbalancer !/*.js=loadbalancer !/*.htm=loadbalancer !/*.html=loadbalancer !/*.ico=loadbalancer /*=loadbalancer
3、測試
編寫一個jsp頁面,該jsp頁面會在session中記錄每一個瀏覽器訪問該頁面的次數。經過訪問兩臺jboss應用服務器來檢查session有沒有被複制, 並嘗試經過apache前端服務器進行訪問
後記
若是sticky_session的值爲true,就表示會話具備「粘性」。「粘性」意味着當用戶經過瀏覽器A與jboss 1開始了一個會話後,之後用戶從瀏覽器A中發出的請求只要處於同一個會話中,負載平衡器就會始終讓 Tomcat 1 來處理請求。直觀地理解,能夠認爲一個會話始終與集羣系統中的一個Jboss服務器"粘"在一塊兒。當sticky_session的值爲 true 時,集羣系統不會進行會話複製。若是但願集羣系統能進行會話複製,從而使得一個瀏覽器能與多個 Tomcat 服務器展開同一個會話,則應該把 sticky_session設爲false(同時把 ${JBOSS_HOME}\server\default\deployers\jbossweb.deployer\META-INF\war-deployers-jboss-beans.xml中的useSessionPassivation屬性設置爲false )。sticky_session的默認值爲true。
當sticky_session設爲false時,sticky_session_force對集羣系統沒有什麼影響,一般能夠把它設爲默認值 false。當 sticky_session 設爲 true 時,則建議把sticky_session_force也設爲true。
另外,粘性session的配置實際上比較消耗資源,不過某些要求穩定性十分高的系統,就必須這麼作,並且遠遠要比以上的糾錯措施嚴格得多,銀行系統尤其明顯!一般客戶使用銀行客戶端的時候老是抱怨處理太慢了,確實是犧牲了速度、資源,維持了穩定、可靠、安全。
假定sticky_session設爲true,當瀏覽器已經與集羣系統中的Jboss 1服務器「粘」在一塊兒,展開了會話後,若是這個Jboss 1服務器因爲異常而終止,此時會出現什麼狀況呢?若是sticky_session_force爲true,那麼服務器端會向客戶端返回狀態代碼爲500的錯誤。若是 sticky_session_force 爲 false,那麼負載平衡器會把請求轉發給集羣系統中的其餘Jboss 2服務器,假如在Jboss 2服務器中不存在同一個會話的信息,則當Web組件試圖訪問會話中的有關數據時可能會致使異常。
參考資料:http://suhuanzheng7784877.iteye.com/blog/968913