1. 前言
該篇中測試的機器發生了變更,在第一篇中設置的Apache DocumentRoot "d:/deployment"修改為了DocumentRoot d:/cluster 。這個不影響實際操作,just換了台電腦。
在第一篇中講了apache整合tomcat的,該篇中將闡述tomcat的集群.
2. 集群的概念
集群分類
■ 縱向集群 :VERTICAL CLUSTER 多個tomcat部署在同一台服務機上,CPU資源需要搶占,只能對內存進行拓展
■ 橫向集群 : HORIZONTAL CLUSTER tomcat和服務機一一對應,即一台服務器上部署一個tomcat。(可做大規模集群)
核心概念
■ 負載均衡 :LOAD BALANCE 依據每個節點對應的權重大小分配需要處理的數據
■ 高可用性 : HIGH AVAILABLE 實際運行中只有一台服務器在工作,當其掛掉后其他服務器頂上
Tomcat 官網給出的結構圖 :
通過負載均衡,任務TASK分配給集群節點.
3. 集群
3.1 配置Apache
修改Apache httpd.conf 文件 ,去掉第一篇中文件末尾追加的內容,在其后面追加如下內容:
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so JKWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log <VirtualHost *> DocumentRoot d:/cluster <Directory "d:/cluster/JMIE"> AllowOverride None Order allow,deny Allow from all </Directory> ServerAdmin ufida-hf:80 ServerName ufida-hf:80 DirectoryIndex index.html index.htm index.jsp index.action ErrorLog logs/error_log.txt CustomLog logs/access_log.txt common JkMount /*WEB-INF cluster JkMount /servlet/* cluster JkMount /*.jsp cluster JkMount /*.do cluster JkMount /*.json cluster JkMount /*.action cluster </VirtualHost>
備注:這里發布的包名稱為JMIE
在第一篇中使用的是 apj13 而這里使用的是cluster,那么這個cluster是哪里來的呢? 很顯然是在worders.properties中進行配置,其內容如下:
worker.list = cluster #node1 worker.node1.port = 8009 worker.node1.host = localhost worker.node1.type = ajp13 worker.node1.lbfactor = 1 #node2 worker.node2.port = 9009 worker.node2.host = localhost worker.node2.type = ajp13 worker.node2.lbfactor = 1 #cluster worker.cluster.type = lb worker.cluster.balance_workers = node1,node2
worker.lbcontroller.sticky_session=0
worker.controller.sticky_session_force=false
worker.connection_pool_size=3000 worker.connection_pool_minsize=40 worker.connection_pool_timeout=10000
worker.node1.host = localhost
worker.節點名稱.host 表示的為節點對應的主機名 ,這里為縱向集群,都是在本地配置,如果需要橫向集群直接修改對應的host即可。
worker.cluster.type = lb
表示集群方式為負載均衡,其中worder.節點名稱.lbfactor 表示節點對應的權重,權重越到處理的TASK越多,這里為1:1 即平均分配
worker.lbcontroller.sticky_session=0
worker.controller.sticky_session_force=false
保證session可在各節點進行復制,即關閉一台服務器后,我們登錄系統的session會被轉移到另外一台服務器上,客戶端仍能正常操作。
worker.cluster.balance_workers = node1,node2
表示兩個節點tomcat對應名稱為node1,node2 。
3.2 配置TOMCAT
由上可以需要兩個tomcat ,解壓兩個tomcat
修改tomcat node1 中的conf/server.xml文件
<Server port="8005" shutdown="SHUTDOWN">
節點2 在修改為8006
<Connector port="8080" protocol="HTTP/1.1" redirectPort="8443" />
節點2 修改為
<Connector port="9090" protocol="HTTP/1.1" redirectPort="9443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
節點2 修改為
<Connector port="9009" protocol="AJP/1.3" redirectPort="9443" />
以上為設置tomcat在節點的名稱,節點2修改為node2 ,隨后在其下方加入:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> <Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" mapSendOptions="6"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" bind="127.0.0.1" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4001" selectorTimeout="100" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" timeout="60000"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
節點2修改為4001 。
通過下圖
可知道,為了集群,需要在應用中的web.xml末尾追加一個<distributable/>元素 。
3.3 Tomcat調優
通過以上的操作,集群環境已經成功搭建了,為了讓tomcat能跑的更high,下面來對tomcat進行調優 。
3.3.1 優化啟動參數
在tomcat的bin目錄下修改catalina.bat 文件,在該文件頭上追加如下信息
set JAVA_OPTS=-server -Xms1000M -Xmx1000M
其中 server 表示tomcat 允許在生產環境
-Xms 和 -Xmx 表示最小、最大JVM內存(如果是win32的系統會受到系統內存的限制) 兩者設置為一樣,可通過如下命令來測試其合適的值
java -Xmx1200m -version
該值需要手動設置 .
tomcat的啟動參數還有很多,詳細可自行查看官方文檔:http://tomcat.apache.org/tomcat-7.0-doc/index.html
3.3.2 TOMCAT本身優化
將
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
替換為:
<!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
解釋如下:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
URIEncoding="UTF-8" 設置編碼
minSpareThreads="25" 最大線程數
maxSpareThreads="75" 最小線程數 enableLookups="false" 關閉DNS查詢
disableUploadTimeout="true"
connectionTimeout="20000" acceptCount="300" 線程數達到maxThreads后,后續請求會被放入一個等待隊列
maxThreads="300" 最大並發數
maxProcessors="1000"
minProcessors="5" useURIValidationHack="false" 減少對url的不必要的檢查 compression="on" 打開壓縮功能
compressionMinSize="2048" 啟用壓縮的輸出內容大小 默認為2KB compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 壓縮類型 />
同樣的道理也可以去修改8080端口,這里集群我們只需要用到8009端口,將節點2同樣優化后可啟動兩個Tomcat
3.4 測試集群
將工程分別拷貝到兩個TOMCAT中的webapps目錄下
重啟apache ,后啟動兩個tomcat
輸入 http://192.168.1.5/JMIE 訪問
關閉正在運行的tomcat后可發現扔可繼續操作.
該篇結束