對於Web應用的叢集學習我是從Tomcat5.5開始的,下面是我的實際操作過程和一些體會。
第一部分 環境介紹
負載平衡
×××××××××××××××××
作業系統:windows xp
IP地址 :192.168.1.200
Apache:apache_2.2.13-win32-x86-openssl-0.9.8k.msi
mod_jk:mod_jk-1.2.28-httpd-2.2.3.so(for windows)
叢集環境Tomcat1
×××××××××××××××××
作業系統:SUSE Linuxe server 10
IP地址 :192.168.1.114
Tomcat :apache-tomcat-5.5.28
叢集環境Tomcat2
×××××××××××××××××
作業系統:SUSE Linuxe server 10
IP地址 :192.168.1.113
Tomcat :apache-tomcat-5.5.28
第二部分 負載平衡配置
第一步:安裝apache,安裝目錄為C:/Apache2.2。
第二步:將mod_jk-1.2.28-httpd-2.2.3.so檔案複製到目錄%apache_home%/modules目錄下
第三步:修改設定檔%apache_home%/conf/httpd.conf
在檔案%apache_home%/conf/httpd.conf的最末尾增加如下行:include conf/mod_jk.conf
#zhangzk<br />include conf/mod_jk.conf
第四步:在目錄%apache_home%/conf下面建立檔案mod_jk.conf
#載入mod_jk Module<br />LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so<br />#<br />#指定 workers.properties檔案路徑<br />JkWorkersFile conf/workers.properties<br />#<br />#指定哪些請求交給tomcat處理<br />#"controller"為在workers.propertise裡指定的負載分配控制器名<br />JkMount /*.jsp controller
第五步:在目錄%apache_home%/conf下建立檔案workers.properties
#server<br />worker.list = controller </p><p>#========tomcat1========<br />worker.tomcat1.port=8009<br />worker.tomcat1.host=192.168.1.114<br />worker.tomcat1.type=ajp13<br />worker.tomcat1.lbfactor = 1 </p><p>#========tomcat2========<br />worker.tomcat2.port=8009<br />worker.tomcat2.host=192.168.1.113<br />worker.tomcat2.type=ajp13<br />worker.tomcat2.lbfactor = 1 </p><p>#========controller,負載平衡控制器========<br />worker.controller.type=lb<br />worker.controller.balanced_workers=tomcat1,tomcat2<br />worker.controller.sticky_session=1
至此負載平衡伺服器已經配置完畢啦。
分別啟動tomcat1和tomcat2已經apache就可以實現對於*.jsp的請求進行1:1分發到tomcat1和tomcat2上。
第三部分 tomcat叢集配置
第一步:將%tomcat_home%/conf/server.xml檔案中的叢集配置節點的注釋去掉
即將該檔案中如下部分
<!--<br /> <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br /> managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br /> expireSessionsOnShutdown="false"<br /> useDirtyFlag="true"<br /> notifyListenersOnReplication="true"><br /> ......<br /> </Cluster><br /> -->
修改為如下形式(......表示中間有程式碼片段沒有展示出來)
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br /> managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br /> expireSessionsOnShutdown="false"<br /> useDirtyFlag="true"<br /> notifyListenersOnReplication="true"><br /> ......<br /> </Cluster>
上述變更在叢集環境tomcat1和tomcat2上都需要同樣的處理。
第二步:將%tomcat_home%/conf/server.xml檔案中的如下代碼作出變更
>>>叢集環境Tomcat1
<Engine name="Catalina" defaultHost="localhost">
修改為
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">
>>> 叢集環境Tomcat2
<Engine name="Catalina" defaultHost="localhost">
修改為
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat2">
第三步:
在需要部署到Tomcat中的web應用程式的WEB-INFO/web.xml中增加如下代碼
<distributable/>
經過上述3大步驟Tomcat的叢集配置就完成啦。
在WEB應用程式中當對session.setAttribute(arg1,arg2)方法進行操作的時候,就可以完成Session的複製了。
第4部分 注意事項
在普通的Web應用程式中如下程式碼片段即可完成Session中屬性的變更
Object o = request.getSession(true).getAttribute(LOGIN_USER_INFO_KEY);<br />UserInfo ui = (UserInfo) o;<br />ui.setAccessPageCount(ui.getAccessPageCount() + 1);<br />
但是在叢集部署環境下該處理是不能完成Session複製的,必須用如下程式碼片段才可以
Object o = request.getSession(true).getAttribute(LOGIN_USER_INFO_KEY);<br />UserInfo ui = (UserInfo) o;<br />ui.setAccessPageCount(ui.getAccessPageCount() + 1);<br />request.getSession().setAttribute(LOGIN_USER_INFO_KEY, ui);