標籤:負載平衡 apache jboss 叢集 執行個體
最近需要使用JBoss設定項目的負載平衡(最好能有多執行個體保證並發量),經過1整天的搜尋和實踐,最終終於成功,在此記錄下來,以便他人和自己日後參考。
系統內容:
Windows Server 2003
軟體環境:
JDK 7 (Update 55)
VC9 (http://www.microsoft.com/download/en/details.aspx?id=5582)
Apache httpd 2.2.29 (http://www.apachelounge.com/download/additional/)
JBoss-5.1.0.GA (http://jbossas.jboss.org/downloads)
注意:盡量使用規定版本的程式,尤其是JBoss(版本差異太大),否則可能會出現未知的錯誤
一、安裝JDK及環境變數配置(略)
二、解壓httpd伺服器(進行初始化即可)
注意:該httpd解壓後,需要手動修改conf/httpd.conf設定檔中的部分內容(如:ServerName、DocumentRoot等)
三、解壓JBoss伺服器(暫時不配置)
四、配置httpd伺服器
1、下載mod_jk.so模組(http://tomcat.apache.org/download-connectors.cgi),使用對應httpd伺服器的版本檔案,本人這裡使用的是mod_jk-1.2.31-httpd-2.2.3.so(http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/)
2、為httpd伺服器添加mod_jk模組,將mod_jk-1.2.31-httpd-2.2.3.so改名為mod_jk.so,放入modules檔案夾下即可
3、在conf檔案夾下添加檔案mod_jk.conf(主要是載入剛剛的mod_jk模組,並做配置):
# Load mod_jk module# Specify the filename of the mod_jk libLoadModule jk_module modules/mod_jk.so# Where to find workers.propertiesJkWorkersFile conf/workers.properties# Where to put jk logsJkLogFile logs/mod_jk.log# Set the jk log level [debug/error/info]JkLogLevel info# Select the log formatJkLogStampFormat "[%a %b %d %H:%M:%S %Y]"# JkOptions indicates to send SSK KEY SIZEJkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories# JkRequestLogFormatJkRequestLogFormat "%w %V %T"# Mount your applicationsJkMount /application/* loadbalancer# You can use external file for mount points.# It will be checked for updates each 60 seconds.# The format of the file is: /url=worker# /examples/*=loadbalancerJkMountFile conf/uriworkermap.properties# Add shared memory.# This directive is present with 1.2.10 and# later versions of mod_jk, and is needed for# for load balancing to work properlyJkShmFile logs/jk.shm# Add jkstatus for managing runtime data<Location /jkstatus/>JkMount statusOrder deny,allowDeny from allAllow from 127.0.0.1</Location>
4、修改conf/httpd.conf,在最下方加入如下配置(意思即為引用mod_jk.conf設定檔案):
#JBoss confInclude conf/mod_jk.conf
5、在conf檔案夾下增加uriworkermap.properties(負載平衡的訪問路徑配置,在mod_jk.conf提及):
/*=loadbalancer
6、在conf檔案夾下增加workers.properties(負載平衡的伺服器節點配置,在mod_jk.conf提及):
注意:worker.node1.port和worker.node2.port是伺服器的ajp連接埠,這裡兩個節點的連接埠相隔100,是因為後邊在JBoss設定中,多執行個體的連接埠位移量設定了100。
# Define list of workers that will be used for mapping requestsworker.list=loadbalancer,status# Load-balancing behaviourworker.loadbalancer.type=lbworker.loadbalancer.balance_workers=node1,node2worker.loadbalancer.sticky_session=1# Status worker for managing load balancerworker.status.type=status# Node1worker.node1.port=8009worker.node1.host=127.0.0.1worker.node1.type=ajp13worker.node1.lbfactor=1worker.node1.cachesize=10# Node2worker.node2.port=8109worker.node2.host=127.0.0.1worker.node2.type=ajp13worker.node2.lbfactor=1worker.node2.cachesize=10
五、配置多執行個體的JBoss伺服器
由於是多執行個體(多進程,不同連接埠),所以我們需要使用兩份一樣的部署應用,我們先將JBoss解壓後的server/all檔案夾複製兩份,分別為server/node1檔案夾和server/node2檔案夾。
兩個檔案夾即為兩個執行個體啟動的部署應用,現在開始詳細的配置:
1、node1與node2類似的配置:
(1)修改server/node1(node2)/deploy/jbossweb.sar/server.xml設定檔:
A、兩個${jboss.bind.address}均替換為${0.0.0.0}(出於安全性考慮,JBoss會綁定伺服器IP,設定為0.0.0.0將解除這一綁定的限制)
B、將node1中<Engine name="jboss.web" defaultHost="localhost">修改為<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">,node2做對應修改(表示不同的節點,節點名稱需要和httpd伺服器配置workers.properties檔案中的節點名稱一致)
(2)修改server/node1(node2)/deploy/messaging/messaging-service.xml設定檔:
A、將node1中<attribute name="ServerPeerID">${jboss.messaging.ServerPeerID:0}</attribute>的數值0修改為1,node2中對應位置修改為2(該數字表示叢集時的id,不可重複)
(3)修改server/node1(node2)/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml檔案:
A、將如下四段解除配置,並修改false為true,修改結果(用於session同步):
<property name="useJK">true</property><property name="useSessionPassivation">true</property><property name="passivationMaxIdleTime">-1</property> <property name="passivationMinIdleTime">-1</property>
(4)修改server/node1(node2)/conf/bootstrap/profile.xml設定檔(在parameter標籤處加入class="java.io.File",避免啟動時報錯):
<bean name="AttachmentStore" class="org.jboss.system.server.profileservice.repository.AbstractAttachmentStore"><constructor><parameter class="java.io.File"><inject bean="BootstrapProfileFactory" property="attachmentStoreRoot" /></parameter></constructor>...</bean>
2、node2的不同配置:
(1)修改server/node2/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml設定檔:
A、JBoss啟動的連接埠設定位移量,由0修改為100(這裡就是httpd伺服器中ajp連接埠間隔100的原因):
<bean name="PortsDefaultBindings" class="org.jboss.services.binding.impl.ServiceBindingSet"> <constructor> ... <parameter>100</parameter> ... </constructor></bean>
六、項目中session同步說明:
1、上述的JBoss已經提及了session的同步,並修改了war-deployers-jboss-beans.xml的配置;
2、修改項目自身的配置(以server/node1(node2)/deploy/ROOT.war為例)
(1)修改WEB-INF/web.xml檔案,加入<distributable />(一定要注意順序,順序錯誤啟動會報錯的)
<web-app> <display-name>Welcome to JBoss</display-name> <description> Welcome to JBoss </description> <distributable /> <servlet> <servlet-name>Status Servlet</servlet-name> <servlet-class>org.jboss.web.tomcat.service.StatusServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Status Servlet</servlet-name> <url-pattern>/status</url-pattern> </servlet-mapping></web-app>
(2)在WEB-INF檔案夾下添加jboss-web.xml設定檔(JBoss的特殊配置,同web.xml一同載入)
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 5.0//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd"><jboss-web> <context-root>/</context-root> <replication-config> <replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger> <replication-granularity>SESSION</replication-granularity> <replication-field-batch-mode>True</replication-field-batch-mode> </replication-config></jboss-web>
七、測試
1、分別在server/node1(node2)/deploy/ROOT.war下添加test檔案夾,放入測試jsp(附件有下載);
2、啟動Apache httpd伺服器(通過命令或製作Windows服務均可);
3、啟動兩個JBoss執行個體:
(1)在JBoss的bin檔案夾下,添加兩個bat批處理(啟動設定好的node1和node2兩個JBoss執行個體):
run-node1.bat,檔案內容(右鍵用記事本編輯即可):
run.bat -c node1
run-node2.bat,檔案內容(右鍵用記事本編輯即可):
run.bat -c node2
(2)依次雙擊即可啟動兩個JBoss執行個體(啟動較慢,需等待node1啟動後再啟動node2)
4、訪問測試頁面:
(1)啟動瀏覽器1,訪問http://localhost/test/index.jsp,如下:
(2)啟動瀏覽器2,訪問http://localhost/test/index.jsp,如下:
說明:通過sessionid即可看出進行了負載平衡
八、附註
1、由於每個瀏覽器每次的訪問只有一個session,而且每個瀏覽器每次session會話中,並未發現節點的變化,所以session的同步並未測試;
2、上述中提及的很多配置都沒有詳細的說明(如conf設定和一個設定檔),如需要詳細解釋,請自行搜尋。
附件:test.zip
Apache+JBoss配置多執行個體+負載平衡(mod_jk實現)