Apache Httpd負載均衡Tomcat并實現Session Sticky和Session Cluster
前言
上篇文章我們介紹如何構建一個
LANMT
平臺并搭建一個jspxcms
, 這次我們介紹使用apache httpd
負載均衡Tomcat
并實現Session Sticky
和Session Cluster
實驗拓撲
實驗步驟
安裝配置tomcat
我們首先配置
Tomcat
, 安裝過程這里不做敘述, 不明白的可以看我上篇博客: tomcat基礎進階
安裝Tomcat
,node2,3
都要操作
[root@node1 ~]# [root@node1 ~]# wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.33/bin/apache-tomcat-8.0.33.tar.gz
[root@node1 ~]# tar xf apache-tomcat-8.0.33.tar.gz -C /usr/local/
[root@node1 ~]# cd /usr/local ; ln -sv apache-tomcat-8.0.33 tomcat ; cd ~
[root@node1 ~]# wget http://download.oracle.com/otn-pub/java/jdk/8u77-b03/jdk-8u77-linux-x64.rpm #如果下載出錯, 使用瀏覽器下載
[root@node1 ~]# rpm -ivh jdk-8u77-linux-x64.rpm #安裝JDK
[root@node1 ~]# vim /etc/profile.d/java.sh #定義JAVA_HOME
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
[root@node1 ~]# vim /etc/profile.d/tomcat.sh #配置tomcat的環境變量
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
[root@node1 ~]# source /etc/profile.d/tomcat.sh
[root@node1 ~]# source /etc/profile.d/java.sh
配置虛擬主機
[root@node2 ~]# vim /usr/local/tomcat/conf/server.xml
#設置默認虛擬主機為web1.anyisalin.com #node3的jvmRoute設置為TomcatB
<Engine name="Catalina" defaultHost="web1.anyisalin.com" jvmRoute="TomcatA">
#添加虛擬主機
<Host name="web1.anyisalin.com" appBase="/data/webapps/" unpackWARS="true" autoDeploy="true">
<Context path="" docBase="/data/webapps" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="web1_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
[root@node2 ~]# mkdir -PV /data/webapps/{WEB-INF,META-INF,classes,lib} #創建目錄
node2
創建網頁文件
[root@node2 ~]# cd /data/webapps/
[root@node2 ~]# vim index.jsp #創建網頁文件
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
[root@node2 webapps]# catalina.sh start #啟動tomcat
node3
創建網頁文件
[root@node3 ~]# cd /data/webapps/
[root@node3 ~]# vim index.jsp #創建網頁文件
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
[root@node3 webapps]# catalina.sh start #啟動tomcat
訪問測試
安裝配置Apache Httpd并測試
安裝httpd
在node1
[root@node1 ~]# yum install httpd -y
配置httpd
mod_Proxy_balancer
模塊文檔
[root@node1 ~]# cd /etc/httpd/conf.d/
[root@node1 conf.d]# vim virt.conf
<Proxy balancer://lbcluster>
BalancerMember ajp://172.16.1.3:8009 loadfactor=1 route=TomcatA
BalancerMember ajp://172.16.1.4:8009 loadfactor=1 route=TomcatB
</Proxy>
<VirtualHost *:80>
ServerName www.anyisalin.com
ProxyVia On
ProxyRequests Off
ProxyPassReverse / balancer://lbcluster/
ProxyPass / balancer://lbcluster/
</VirtualHost>
[root@node1 conf.d]# service httpd start #啟動httpd
測試負載均衡效果
實現session sticky
如果
tomcat
運行著一個動態站點, 那么上面這種byrequest
的負載均衡調度算法就有很大問題了, 可能剛登錄站點再刷新又回到沒有登錄的狀態了, 所以我們就要實現session sticky
, 其實session sticky
就是我們之前lvs
的sh算法, 和nginx
的ip_hash
實現的效果
編輯httpd
配置文件
[root@node1 ~]# vim /etc/httpd/conf.d/virt.conf
## 主要添加兩段參數
##Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
##ProxySet stickysession=ROUTEID
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #新添加的
<Proxy balancer://lbcluster>
BalancerMember ajp://172.16.1.3:8009 loadfactor=1 route=TomcatA
BalancerMember ajp://172.16.1.4:8009 loadfactor=1 route=TomcatB
ProxySet stickysession=ROUTEID #新添加的
</Proxy>
<VirtualHost *:80>
ServerName www.anyisalin.com
ProxyVia On
ProxyRequests Off
ProxyPassReverse / balancer://lbcluster/
ProxyPass / balancer://lbcluster/
</VirtualHost>
[root@node1 conf.d]# service httpd restart #重啟httpd
測試session sticky
效果
如下圖, 我們成功的將session綁定在了TomcatA(Node2)
主機上
實現Session Cluster
我們使用
session sticky
會有很多問題, 如果某臺主機宕機了, 那么用戶的session就丟失了, 所以我們還可以通過session cluster
保存用戶會話
什么是Session Cluster
正常情況下
session
信息是保存在用戶所訪問的服務器上,服務器宕機, 用戶的session
就丟失了, 但是我們可以通過session cluster
的方式來實現將用戶的session
信息保存在后端所有的服務器上, 這樣來, 無論用戶在訪問哪一臺服務器,session
都不會丟失
四種常見的session manager
StandardManager
PersistentManager: 可以將
session
信息保存在持久存儲中DeltaManager: 將
session
信息通過多播的形式共享到其他節點BackupManager: 將
session
信息共享到特定的一個節點上
注意: 我們要刪掉剛才對session sticky
的配置
編輯tomcat
作配置文件
[root@node2 conf]# vim server.xml
下列內容放在<Host />內
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
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.0.1.7"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
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=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<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.ClusterSessionListener"/>
</Cluster>
配置WEB-INF
中的web.xml
文件
[root@node2 conf]# cd /data/webapps/
[root@node2 webapps]# cp /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml WEB-INF/ #拷貝一份模板
[root@node2 webapps]# vim WEB-INF/web.xml
#添加下面這一行,在</web-app>內
<distributable/>
##注意: 這里是node3
[root@node3 webapps]# scp node2.anyisalin.com:/usr/local/tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml #復制node2配置文件
[root@node3 webapps]# scp node2.anyisalin.com:/data/webapps/WEB-INF/web.xml /data/webapps/WEB-INF/
[root@node2 webapps]# catalina.sh stop #重啟tomcat
[root@node2 webapps]# catalina.sh start
[root@node3 webapps]# catalina.sh stop #重啟tomcat
[root@node3 webapps]# catalina.sh start
session cluster
測試
如下圖, 現在我們即使使用byrequests
算法也不會丟失sesssion
總結
我們本文實現了
tomcat
的負載均衡和session
保持的各種方法, 但是還是有很大問題, 我們試想在用戶并發高的場景下, 多臺tomcat
服務器一直在多播, 很可能造成網絡擁塞, 所以我們還有一種解決方案session server
, 使用單臺服務器保存用戶的session
信息, 我們會在下篇文章向大家介紹!作者水平很低, 如果有錯誤及時指出, 如果你覺得本文寫的好請點一波贊~(≧▽≦)/~
作者: AnyISaIln QQ: 1449472454
感謝: MageEdu
原創文章,作者:Net18-AnyISalIn,如若轉載,請注明出處:http://www.www58058.com/15225
你好,session cluster 做實驗時,有遇到過session ID 還是會一直變化的問題嗎? 已經把stickysession注釋 更改為lbmethod=byrequests