?????? 如果要實現JBoss各節點的負載均衡就需要在集群前置負載均衡器,均衡器是所有請求的入口,將請求按照定義的負載規則分配到各節點。負載均衡器可以實現故障轉移和狀態同步。我選擇目前比較流行的Apache Http Server作為集群中的負載均衡器,通過mod_jk插件與Jboss節點通訊。
?
1.安裝Apache Http Server
?
?
解壓文件:
[root@webserver local]# tar -zxvf httpd-2.2.4.tar.gz
?
切換到解壓目錄執行編譯
[root@webserver httpd-2.2.4]#./configure -prefix=/usr/local/apache2 -enable-so -enable-setenvif=shared -enable-rewrite=shared -enable-proxy=shared -enable-auth-anon -enable-file-cache=shared -enable-cache=shared -enable-disk-cache=shared -enable-mem-cache=shared -with-mpm=prefork?
[root@webserver httpd-2.2.4]#make
[root@webserver httpd-2.2.4]#make install
?
增加apache用戶組
[root@webserver httpd-2.2.4]#groupadd apache
[root@webserver httpd-2.2.4]#useradd apache –g apache
?
修改apache2目錄用戶與組
[root@webserver local]# chown -R apache:apache apache2
?
修改httpd.conf文件
[root@webserver apache2]# vim conf/httpd.conf
將User daemon和Group daemon改為User apache和Group apache
?
啟動apache
[root@webserver apache2]#bin/apachectl start
訪問:http://webserver.localdomain/
?
?
?看到上圖表示安裝成功!
?
2.下載并配置mod_jk模塊
下載mod_jk
?
將文件重命名為mod_jk.so 拷貝至/usr/local/apache2/modules/
添加執行權限
[root@webserver apache2]#chmod a+x modules/mod_jk.so
?
創建mod_jk.conf文件
[root@webserver apache2]#vim conf/mod_jk.conf
文件內容如下:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMountFile conf/uriworkermap.properties
JkShmFile logs/jk.shm
?
大家重點注意表紅部分:
LoadModule jk_module modules/mod_jk.so
表示apache加載jk_module模塊的路徑
JkWorkersFile conf/workers.properties
表示jk模塊的配置文件路徑
JkMountFile conf/uriworkermap.properties
表示jk模塊映射文件路徑,可以通過
uriworkermap.properties
文件配置要映射的應用
?
創建uriworkermap.properties文件
[root@webserver apache2]#vim conf/uriworkermap.properties
內容如下:
/*=loadbalancer
?
如果你希望apache作為單獨的負載均衡器的話,可以采用/*=loadbalancer的配置,表示所有請求都會轉發給集群中的jboss節點
?
創建workers.properties文件
[root@webserver apache2]#vim conf/workers.properties
文件內容如下:
worker.list=loadbalancer,status
#node1
worker.node1.port=8009
worker.node1.host=node1.localdomain
worker.node1.type=ajp13
worker.node1.lbfactor=1
#node2
worker.node2.port=8009
worker.node2.host=node2.localdomain
worker.node2.type=ajp13
worker.node2.lbfactor=1
?
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1
worker.status.type=status
?
以上內容中聲明了2個worker分別名為node1、node2之后要分別在Jboss節點中jvmRoute屬性中指定要使用的worker
?
3.修改httpd.conf文件
在文件末尾增加下面一行
Include conf/mod_jk.conf
?
4.配置Jboss
為各節點指定jvmRoute
編輯server.xml文件
[root@node1 local]# vim /usr/local/jboss-4.0.5.GA/server/all/deploy/jbossweb-tomcat55.sar/server.xml
?
jvmRoute設置成之前在workers.properties文件里聲明的worker
<
Engine
?
name
="
jboss.web"
?
defaultHost
=
"localhost"
?
jvmRoute
=
"
node1
"
>
??
?
編輯 jboss-service.xml文件激活jk
[root@node1 local]# vim /usr/local/jboss-4.0.5.GA/server/all/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml
找到 <attribute name="UseJK">false</attribute>將其改變為true
?
5.測試負載均衡器
安裝上面的要求配置兩個jboss節點
node1.localdomain
node2.localdomain
?
worker.loadbalancer.sticky_session=1
此屬性指定集群針對HTTP會話的處理方式,值為1時表示啟用session黏貼,也就是說當應用程序使用session保存請求狀態時,負載均衡器會將這個會話和集群中的一個節點進行關聯,之后這個會話發起的請求都會指向這個節點。
?
在集群中部署測試程序:
請求:http://webserver.localdomain/SessionTest/index.jsp
如圖所示處理我們本次請求的應用服務器為node1.localdomain
?SET完畢后,在輸入我們剛才存儲的變量名,點擊GET。可以成功得到我們之前設置的值。我們可以清楚的看到這幾次請求Host與SessionId都沒有改變,說明Session已經成功黏貼到了node1.localdomain節點。
?
但是這種方式并不是一個完善的解決方案,因為一個節點崩潰,所有的會話數據都會丟失。好在我們之前配置的JBoss集群支持Session復制,也就是說當一個Session被創建時服務器會自動同步到其他節點。關于Session復制的配置可以到
/usr/local/jboss-4.0.5.GA/server/all/deploy/tc5-cluster.sar/META-INF/jboss-service.xml 文件中設置。這里就不多說了。
?
我們可以試驗一把,我們先把節點node1.localdomain停掉,然后在點GET獲取UserName
?
如上圖所示,由于node1.localdomain節點已經停掉,負載均衡器把我們的請求自動分配到了可用節點node2.localdomain上,但是我們從node2上獲得的SessionId還是原來的,UserName的值可以正常獲取。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
