實現 Tomcat 的負載均衡

 

一、首先新建 Tomcat 節點  node3

1. 安裝JDK
      # rpm -ivh jdk-7u5-linux-i586.rpm
         
   定義兩個環境變量:       
       # vi /etc/profile                                                

  1. JAVA_HOME=/usr/java/jdk1.7.0_05 
  2. PATH=$PATH:$JAVA_HOME/bin 
  3. export JAVA_HOME PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC    

   
  退出後再重新登錄:
     # printenv                    查看環境變量

  1. ..... 
  2. PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.7.0_05/bin:/root/bin 
  3. JAVA_HOME=/usr/java/jdk1.7.0_05 
  4.  ..... 

  
2. 安裝 Tomcat

  1. # tar xf apache-tomcat-7.0.29.tar.gz -C /usr/local/ 
  2. # cd /usr/local/ 
  3. # ln -sv apache-tomcat-7.0.29/  tomcat 
  4.           create symbolic link `tomcat' to `apache-tomcat-7.0.29/' 

3.修改conf/server.xml

1). 添加 jvmRoute
        <Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat_B">


2). 配置Tomcat的虛擬主機

  1. # vi /usr/local/tomat/conf/server.xml 
  2.  
  3.     <Host name="tomcat.yue.com" appBase="/www" unpackWARs="true" autoDeploy="true"
  4.                 <Context path="" docBase="/www/tomcat" reloadable="true"/> 
  5.  
  6.                 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"                   
  7.                         prefix="tomcat_access_" suffix=".log" 
  8.                         pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 
  9.         </Host> 
   

       
3). 創建虛擬主機的相關目錄和文件

  1. mkdir  -pv  /www/tomcat/WEB-INF/{lib,classes} 
  2.  
  3. # tree /www/ 
  4.  
  5. /www/ 
  6. `-- tomcat 
  7.     `-- WEB-INF 
  8.         |-- classes 
  9.         `-- lib 
  10.  
  11.         
  12. # cp /usr/local/tomcat/conf/web.xml  /www/tomcat/WEB-INF/  

4). 提供主頁面

   # vi /www/tomcat/index.jsp            內容如下:

  1. <%@ page language="java" %> 
  2. <html> 
  3.   <head><title>TomcatB</title></head> 
  4.   <body> 
  5.     <h1><font color="blue">TomcatB </font></h1> 
  6.     <table align="centre" border="1"
  7.       <tr> 
  8.         <td>Session ID</td> 
  9.         <td><%= session.getId() %></td> 
  10.       </tr> 
  11.       <tr> 
  12.         <td>Created on</td> 
  13.         <td><%= session.getCreationTime() %></td> 
  14.      </tr> 
  15.     </table> 
  16.   </body> 
  17. </html> 

5)啓動Tomcat,並測試

二、以mod-jk的方式實現負載均衡

配置前端的Apache

1 .修改/etc/httpd/extra/httpd-jk.conf

  1. [root@node1 httpd]# vi extra/httpd-jk.conf 
  2.  
  3. # Load the mod_jk 
  4. LoadModule  jk_module  modules/mod_jk.so 
  5. JkWorkersFile  /etc/httpd/extra/workers.properties 
  6. JkLogFile  logs/mod_jk.log 
  7. JkLogLevel  debug 
  8. JkMount  /*     lbcluster-1 
  9. JkMount  /jk-status/  stat1 

2.  編輯/etc/httpd/extra/workers.properties

  1. [root@node1 httpd]# vi extra/workers.properties 
  2.  
  3. worker.list=lbcluster-1,stat1 
  4.  
  5. worker.Tomcat_A.port=8009 
  6. worker.Tomcat_A.host=192.168.1.12 
  7. worker.Tomcat_A.type=ajp13 
  8. worker.Tomcat_A.lbfactor=1 
  9.  
  10. worker.Tomcat_B.port=8009 
  11. worker.Tomcat_B.host=192.168.1.13 
  12. worker.Tomcat_B.type=ajp13 
  13. worker.Tomcat_B.lbfactor=1 
  14.  
  15. worker.lbcluster-1.type = lb 
  16. worker.lbcluster-1.sticky_session = 0              0: 表示不綁定會話   1:表示綁定會話 
  17. worker.lbcluster-1.balance_workers = Tomcat_A,Tomcat_B 
  18. worker.stat1.type = status 

3. 編輯httpd.conf

  1. # Virtual hosts 
  2. #Include /etc/httpd/extra/httpd-vhosts.conf 
  3. Include /etc/httpd/extra/httpd-jk.conf  確保啓用了 httpd-jk.conf 的配置

 

4. 重啓Apacher 測試一下

5. 若此時我們停掉node3 上的Tomcat,看是否可以自動檢測到後端的健康狀況

 

三、 以mod_proxy 的方式實現負載均衡

 

    可以使用http連接器,也可以使用ajp連接,注意端口不一樣

1. 編輯extra/httpd-vhosts.conf

  1. [root@node1 httpd]# vi extra/httpd-vhosts.conf
  2.  
  3.  
  4. ProxyVia            Off 
  5. ProxyRequests       Off 
  6. ProxyPreserveHost   On 
  7.  
  8. <VirtualHost *:80> 
  9.         ServerName tomcat.yue.com 
  10.         ProxyPass /  balancer://lbcluster-1/ stickysession=jsessionid  nofailover=On 
  11.         ProxyPa***everse /  balancer://lbcluster-1 
  12.  
  13.    <proxy balancer://lbcluster-1> 
  14.         BalancerMember http://192.168.1.12:8080 loadfactor=10 route=Tomcat_A  使用的是http 連接器
  15.         BalancerMember http://192.168.1.13:8080 loadfactor=10 route=Tomcat_B 
  16.    </proxy> 
  17.  
  18. </VirtualHost> 

2. 編輯Apache的配置文件
    # vi /etc/httpd/httpd.conf

  1. Include /etc/httpd/extra/httpd-vhosts.conf                確保啓用的是 httpd-vhosts.conf 的配置
  2. #Include /etc/httpd/extra/httpd-jk.conf 

 

 

四、實現Tomcat基於內存複製的集羣

1. 編輯兩個Tomcat的配置文件(注意 主機ip不能相同

     # vi conf/server.xml
   
以下內容定義在Engine容器中,則表示對所有主機均啓動用集羣功能。如果定義在某Host中,則表示僅對此主機啓用集羣功能。

  1.  
  2. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"            集羣的類爲SimpleTcpCluster,也是Tomcat中唯一的一種 
  3.                    channelSendOptions="8">                                  心跳信息傳輸的頻道  
  4.      <Manager className="org.apache.catalina.ha.session.DeltaManager" 
  5.                     expireSessionsOnShutdown="false" 
  6.                     notifyListenersOnReplication="true"/> 
  7.        <Channel className="org.apache.catalina.tribes.group.GroupChannel">          定義一個獨立的集羣,區別集羣和其它節點,使用哪個 
  8.           <Membership className="org.apache.catalina.tribes.membership.McastService"      基於多波通信的方式 
  9.                    address="228.50.10.1"   bind="192.168.1.12"   port="45564"               同一集羣中多波地址要一樣;多波地址通過哪個地址所在的網卡發送信息通過哪個端口 
  10.                    frequency="500"  dropTime="3000"/>                                       多長時間收不到對方的響應信息,就認爲其故障 
  11.              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"         接收器 
  12.                                 address="192.168.1.12"   port="4000"  autoBind="100"            端口、自動綁定 
  13.                                 selectorTimeout="5000"   maxThreads="6"/> 
  14.              <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">       發送器 
  15.                 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>   定義如何向外發送信息 
  16.              </Sender> 
  17.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>      過濾器,定義節點間互相傳遞信息的時候要傳遞哪些信息,傳遞信息的時候是否要認證 
  18.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> 
  19.      </Channel> 
  20.      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
  21.                         filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/> 
  22.      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>        JvmRoute 
  23.      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"            可以實現分佈式程序佈署的 
  24.                      tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" 
  25.                     watchDir="/tmp/war-listen/"  watchEnabled="false"/> 
  26.       <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>  監聽器,基於事件的,當某種類型的事件發生時能夠觸發某種動作的 
  27.       <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> 
  28. </Cluster> 

1.1>.  編輯 web.xml

  1. vi  /www/tomcat/WEB-INF/web.xml  添加如下內容: 
  2.             <distributable/> 

 

2. 通過 mod_proxy 模塊工作

2.1> 編輯http.conf

  1. # Virtual hosts 
  2. Include /etc/httpd/extra/httpd-vhosts.conf  確保啓用的是 httpd-vhosts.cnf 的配置
  3. #Include /etc/httpd/extra/httpd-jk.conf 

2.2> 編輯 extra/httpd-vhosts.conf

  1. ProxyRequests       Off 
  2. ProxyPreserveHost   On 
  3.  
  4. <VirtualHost *:80> 
  5.         ServerName tomcat.yue.com 
  6.         ProxyPass /  balancer://lbcluster-1/ stickysession=jsessionid  nofailover=On 
  7.         ProxyPa***everse /  balancer://lbcluster-1 
  8.  
  9.    <proxy balancer://lbcluster-1> 
  10.         BalancerMember http://192.168.1.12:8080 loadfactor=10 route=Tomcat_A 
  11.         BalancerMember http://192.168.1.13:8080 loadfactor=10 route=Tomcat_B 
  12.    </proxy> 
  13.  
  14. </VirtualHost> 

2.3> 重啓Apache,測試一下效果:

 

3. 通過mod-jk 模塊工作

3.1> 編輯 extra/httpd-jk.conf

  1. [root@node1 httpd]# vi extra/httpd-jk.conf  
  2.  
  3. # Load the mod_jk 
  4. LoadModule  jk_module  modules/mod_jk.so 
  5. JkWorkersFile  /etc/httpd/extra/workers.properties 
  6. JkLogFile  logs/mod_jk.log 
  7. JkLogLevel  debug 
  8. JkMount  /*     lbcluster-1 
  9. JkMount  /jk-status/  stat1 

3.2> 編輯 extra/workers.properties

  1. [root@node1 httpd]# vi extra/workers.properties  
  2.  
  3. worker.list=lbcluster-1,stat1 
  4.  
  5. worker.Tomcat_A.port=8009 
  6. worker.Tomcat_A.host=192.168.1.12 
  7. worker.Tomcat_A.type=ajp13 
  8. worker.Tomcat_A.lbfactor=1 
  9.  
  10. worker.Tomcat_B.port=8009
  11. worker.Tomcat_B.host=192.168.1.13 
  12. worker.Tomcat_B.type=ajp13 
  13. worker.Tomcat_B.lbfactor=1 
  14.  
  15. worker.lbcluster-1.type = lb 
  16. worker.lbcluster-1.sticky_session = 0 
  17. worker.lbcluster-1.balance_workers = Tomcat_A,Tomcat_B 
  18. worker.stat1.type = status 

3.3> 編輯 httpd.conf

  1. # Virtual hosts 
  2. #Include /etc/httpd/extra/httpd-vhosts.conf 
  3. Include /etc/httpd/extra/httpd-jk.conf  確保啓用的是httpd-jk.conf 的配置

3.4> 測試一下,看看效果如何

 

4. 另外我們也可以將 extra/httpd-vhosts.conf 文件中內容單獨定義在一文件中,如extra/httpd-proxy.conf

4.1> 編輯  extra/httpd-proxy.conf

  1. ProxyVia            Off 
  2. ProxyRequests       Off 
  3. ProxyPreserveHost   On 
  4.  
  5. <VirtualHost *:80> 
  6.         ServerName tomcat.yue.com 
  7. #       ProxyPass /  balancer://lbcluster-1/ stickysession=jsessionid  nofailover=On                jsessionid  -->java 程序   psessionid -->php 程序 
  8.         ProxyPa***everse /  balancer://lbcluster-1 
  9.  
  10.    <proxy balancer://lbcluster-1> 
  11.         ProxySet lbmethod=bytraffic                        負載均衡的調度算法,apache做代理的時候有三種 
  12.         BalancerMember http://192.168.1.12:8080 loadfactor=10 route=Tomcat_A 
  13.         BalancerMember http://192.168.1.13:8080 loadfactor=10 route=Tomcat_B 
  14.    </proxy> 
  15.  
  16.  
  17. ProxyPass /lb-manager !                          表示不做代理                                                      
  18. ProxyPass /status ! 
  19. ProxyStatus full 
  20.  
  21. <Location /lb-manager> 
  22.     SetHandler balancer-manager                 額外的處理器 
  23.     Require all granted 
  24. </Location> 
  25.  
  26. <Location /status> 
  27.     SetHandler server-status 
  28.     Require all granted 
  29. </Location> 
  30.  
  31. </VirtualHost> 

 4.2>  編輯httpd.conf  將extra/httpd-proxy.conf  文件包含進去

  1.     Include /etc/httpd/extra/httpd-proxy.conf    確保啓用的是httpd-proxy.conf 的配置
    
  2. # Include /etc/httpd/extra/httpd-vhosts.conf          
  3.  # Include /etc/httpd/extra/httpd-jk.conf 

  4.3> 重啓Apache,測試一下效果

  4.4> 查看一下相關的狀態信息

 後記: 一定要注意 三臺機器的時間必須要同步,否則就可能會出現一些問題

如:只顯示Apache 工作了,但跳轉不到後端Tomcat的虛擬主機上

 

 

由於本人能力有限,若本文中有不足或錯誤之處還請各位看官多多指教!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章