一、首先新建 Tomcat 節點 node3
1. 安裝JDK
# rpm -ivh jdk-7u5-linux-i586.rpm
定義兩個環境變量:
# vi /etc/profile
- JAVA_HOME=/usr/java/jdk1.7.0_05
- PATH=$PATH:$JAVA_HOME/bin
- export JAVA_HOME PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
退出後再重新登錄:
# printenv 查看環境變量
- .....
- 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
- JAVA_HOME=/usr/java/jdk1.7.0_05
- .....
2. 安裝 Tomcat
- # tar xf apache-tomcat-7.0.29.tar.gz -C /usr/local/
- # cd /usr/local/
- # ln -sv apache-tomcat-7.0.29/ tomcat
- 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的虛擬主機
- # vi /usr/local/tomat/conf/server.xml
- <Host name="tomcat.yue.com" appBase="/www" unpackWARs="true" autoDeploy="true">
- <Context path="" docBase="/www/tomcat" reloadable="true"/>
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="tomcat_access_" suffix=".log"
- pattern="%h %l %u %t "%r" %s %b" />
- </Host>
3). 創建虛擬主機的相關目錄和文件
- # mkdir -pv /www/tomcat/WEB-INF/{lib,classes}
- # tree /www/
- /www/
- `-- tomcat
- `-- WEB-INF
- |-- classes
- `-- lib
- # cp /usr/local/tomcat/conf/web.xml /www/tomcat/WEB-INF/
4). 提供主頁面
# vi /www/tomcat/index.jsp 內容如下:
- <%@ page language="java" %>
- <html>
- <head><title>TomcatB</title></head>
- <body>
- <h1><font color="blue">TomcatB </font></h1>
- <table align="centre" border="1">
- <tr>
- <td>Session ID</td>
- <td><%= session.getId() %></td>
- </tr>
- <tr>
- <td>Created on</td>
- <td><%= session.getCreationTime() %></td>
- </tr>
- </table>
- </body>
- </html>
5)啓動Tomcat,並測試
二、以mod-jk的方式實現負載均衡
配置前端的Apache
1 .修改/etc/httpd/extra/httpd-jk.conf
- [root@node1 httpd]# vi extra/httpd-jk.conf
- # Load the mod_jk
- LoadModule jk_module modules/mod_jk.so
- JkWorkersFile /etc/httpd/extra/workers.properties
- JkLogFile logs/mod_jk.log
- JkLogLevel debug
- JkMount /* lbcluster-1
- JkMount /jk-status/ stat1
2. 編輯/etc/httpd/extra/workers.properties
- [root@node1 httpd]# vi extra/workers.properties
- worker.list=lbcluster-1,stat1
- worker.Tomcat_A.port=8009
- worker.Tomcat_A.host=192.168.1.12
- worker.Tomcat_A.type=ajp13
- worker.Tomcat_A.lbfactor=1
- worker.Tomcat_B.port=8009
- worker.Tomcat_B.host=192.168.1.13
- worker.Tomcat_B.type=ajp13
- worker.Tomcat_B.lbfactor=1
- worker.lbcluster-1.type = lb
- worker.lbcluster-1.sticky_session = 0 0: 表示不綁定會話 1:表示綁定會話
- worker.lbcluster-1.balance_workers = Tomcat_A,Tomcat_B
- worker.stat1.type = status
3. 編輯httpd.conf
- # Virtual hosts
- #Include /etc/httpd/extra/httpd-vhosts.conf
- Include /etc/httpd/extra/httpd-jk.conf 確保啓用了 httpd-jk.conf 的配置
4. 重啓Apacher 測試一下
5. 若此時我們停掉node3 上的Tomcat,看是否可以自動檢測到後端的健康狀況
三、 以mod_proxy 的方式實現負載均衡
可以使用http連接器,也可以使用ajp連接,注意端口不一樣
1. 編輯extra/httpd-vhosts.conf
- [root@node1 httpd]# vi extra/httpd-vhosts.conf
- ProxyVia Off
- ProxyRequests Off
- ProxyPreserveHost On
- <VirtualHost *:80>
- ServerName tomcat.yue.com
- ProxyPass / balancer://lbcluster-1/ stickysession=jsessionid nofailover=On
- ProxyPa***everse / balancer://lbcluster-1
- <proxy balancer://lbcluster-1>
- BalancerMember http://192.168.1.12:8080 loadfactor=10 route=Tomcat_A 使用的是http 連接器
- BalancerMember http://192.168.1.13:8080 loadfactor=10 route=Tomcat_B
- </proxy>
- </VirtualHost>
2. 編輯Apache的配置文件
# vi /etc/httpd/httpd.conf
- Include /etc/httpd/extra/httpd-vhosts.conf 確保啓用的是 httpd-vhosts.conf 的配置
- #Include /etc/httpd/extra/httpd-jk.conf
四、實現Tomcat基於內存複製的集羣
1. 編輯兩個Tomcat的配置文件(注意 主機ip不能相同)
# vi conf/server.xml
以下內容定義在Engine容器中,則表示對所有主機均啓動用集羣功能。如果定義在某Host中,則表示僅對此主機啓用集羣功能。
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 集羣的類爲SimpleTcpCluster,也是Tomcat中唯一的一種
- channelSendOptions="8"> 心跳信息傳輸的頻道
- <Manager className="org.apache.catalina.ha.session.DeltaManager"
- expireSessionsOnShutdown="false"
- notifyListenersOnReplication="true"/>
- <Channel className="org.apache.catalina.tribes.group.GroupChannel"> 定義一個獨立的集羣,區別集羣和其它節點,使用哪個
- <Membership className="org.apache.catalina.tribes.membership.McastService" 基於多波通信的方式
- address="228.50.10.1" bind="192.168.1.12" port="45564" 同一集羣中多波地址要一樣;多波地址、通過哪個地址所在的網卡發送信息、通過哪個端口
- frequency="500" dropTime="3000"/> 多長時間收不到對方的響應信息,就認爲其故障
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 接收器
- address="192.168.1.12" port="4000" autoBind="100" 端口、自動綁定
- selectorTimeout="5000" maxThreads="6"/>
- <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 發送器
- <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 定義如何向外發送信息
- </Sender>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> 過濾器,定義節點間互相傳遞信息的時候要傳遞哪些信息,傳遞信息的時候是否要認證
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
- </Channel>
- <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
- filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
- <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> JvmRoute
- <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" 可以實現分佈式程序佈署的
- tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/"
- watchDir="/tmp/war-listen/" watchEnabled="false"/>
- <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> 監聽器,基於事件的,當某種類型的事件發生時能夠觸發某種動作的
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
1.1>. 編輯 web.xml
- # vi /www/tomcat/WEB-INF/web.xml 添加如下內容:
- <distributable/>
2. 通過 mod_proxy 模塊工作
2.1> 編輯http.conf
- # Virtual hosts
- Include /etc/httpd/extra/httpd-vhosts.conf 確保啓用的是 httpd-vhosts.cnf 的配置
- #Include /etc/httpd/extra/httpd-jk.conf
2.2> 編輯 extra/httpd-vhosts.conf
- ProxyRequests Off
- ProxyPreserveHost On
- <VirtualHost *:80>
- ServerName tomcat.yue.com
- ProxyPass / balancer://lbcluster-1/ stickysession=jsessionid nofailover=On
- ProxyPa***everse / balancer://lbcluster-1
- <proxy balancer://lbcluster-1>
- BalancerMember http://192.168.1.12:8080 loadfactor=10 route=Tomcat_A
- BalancerMember http://192.168.1.13:8080 loadfactor=10 route=Tomcat_B
- </proxy>
- </VirtualHost>
2.3> 重啓Apache,測試一下效果:
3. 通過mod-jk 模塊工作
3.1> 編輯 extra/httpd-jk.conf
- [root@node1 httpd]# vi extra/httpd-jk.conf
- # Load the mod_jk
- LoadModule jk_module modules/mod_jk.so
- JkWorkersFile /etc/httpd/extra/workers.properties
- JkLogFile logs/mod_jk.log
- JkLogLevel debug
- JkMount /* lbcluster-1
- JkMount /jk-status/ stat1
3.2> 編輯 extra/workers.properties
- [root@node1 httpd]# vi extra/workers.properties
- worker.list=lbcluster-1,stat1
- worker.Tomcat_A.port=8009
- worker.Tomcat_A.host=192.168.1.12
- worker.Tomcat_A.type=ajp13
- worker.Tomcat_A.lbfactor=1
- worker.Tomcat_B.port=8009
- worker.Tomcat_B.host=192.168.1.13
- worker.Tomcat_B.type=ajp13
- worker.Tomcat_B.lbfactor=1
- worker.lbcluster-1.type = lb
- worker.lbcluster-1.sticky_session = 0
- worker.lbcluster-1.balance_workers = Tomcat_A,Tomcat_B
- worker.stat1.type = status
3.3> 編輯 httpd.conf
- # Virtual hosts
- #Include /etc/httpd/extra/httpd-vhosts.conf
- 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
- ProxyVia Off
- ProxyRequests Off
- ProxyPreserveHost On
- <VirtualHost *:80>
- ServerName tomcat.yue.com
- # ProxyPass / balancer://lbcluster-1/ stickysession=jsessionid nofailover=On jsessionid -->java 程序 psessionid -->php 程序
- ProxyPa***everse / balancer://lbcluster-1
- <proxy balancer://lbcluster-1>
- ProxySet lbmethod=bytraffic 負載均衡的調度算法,apache做代理的時候有三種
- BalancerMember http://192.168.1.12:8080 loadfactor=10 route=Tomcat_A
- BalancerMember http://192.168.1.13:8080 loadfactor=10 route=Tomcat_B
- </proxy>
- ProxyPass /lb-manager ! 表示不做代理
- ProxyPass /status !
- ProxyStatus full
- <Location /lb-manager>
- SetHandler balancer-manager 額外的處理器
- Require all granted
- </Location>
- <Location /status>
- SetHandler server-status
- Require all granted
- </Location>
- </VirtualHost>
4.2> 編輯httpd.conf 將extra/httpd-proxy.conf 文件包含進去
Include /etc/httpd/extra/httpd-proxy.conf 確保啓用的是httpd-proxy.conf 的配置- # Include /etc/httpd/extra/httpd-vhosts.conf
- # Include /etc/httpd/extra/httpd-jk.conf
4.3> 重啓Apache,測試一下效果
4.4> 查看一下相關的狀態信息
後記: 一定要注意 三臺機器的時間必須要同步,否則就可能會出現一些問題
如:只顯示Apache 工作了,但跳轉不到後端Tomcat的虛擬主機上
由於本人能力有限,若本文中有不足或錯誤之處還請各位看官多多指教!