Apache Httpd负载均衡Tomcat并实现Session Sticky和Session Cluster
大纲
前言
- 实验拓扑
- 实验步骤
- 安装配置tomcat
- 安装配置Apache Httpd并测试
- 实现session sticky
- 实现Session Cluster
- 总结
前言
上篇文章我们介绍如何构建一个
LANMT
平台并搭建一个jspxcms
, 这次我们介绍使用apache httpd
负载均衡Tomcat
并实现Session Sticky
和Session Cluster
实验拓扑
实验步骤
安装配置tomcat
我们首先配置
Tomcat
, 安装过程这里不做叙述, 不明白的可以看我上篇博客: tomcat基础进阶
安装Tomcat
,node2,3
都要操作
[[email protected] ~]# [[email protected] ~]# wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.33/bin/apache-tomcat-8.0.33.tar.gz [[email protected] ~]# tar xf apache-tomcat-8.0.33.tar.gz -C /usr/local/ [[email protected] ~]# cd /usr/local ; ln -sv apache-tomcat-8.0.33 tomcat ; cd ~ [[email protected] ~]# wget http://download.oracle.com/otn-pub/java/jdk/8u77-b03/jdk-8u77-linux-x64.rpm #如果下载出错, 使用浏览器下载 [[email protected] ~]# rpm -ivh jdk-8u77-linux-x64.rpm #安装JDK [[email protected] ~]# vim /etc/profile.d/java.sh #定义JAVA_HOME export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH [[email protected] ~]# vim /etc/profile.d/tomcat.sh #配置tomcat的环境变量 export CATALINA_BASE=/usr/local/tomcat export PATH=$CATALINA_BASE/bin:$PATH [[email protected] ~]# source /etc/profile.d/tomcat.sh [[email protected] ~]# source /etc/profile.d/java.sh
配置虚拟主机
[[email protected] ~]# 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> [[email protected] ~]# mkdir -PV /data/webapps/{WEB-INF,META-INF,classes,lib} #创建目录
node2
创建网页文件
[[email protected] ~]# cd /data/webapps/ [[email protected] ~]# 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> [[email protected] webapps]# catalina.sh start #启动tomcat
node3
创建网页文件
[[email protected] ~]# cd /data/webapps/ [[email protected] ~]# 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> [[email protected] webapps]# catalina.sh start #启动tomcat
访问测试
安装配置Apache Httpd并测试
安装httpd
在node1
[[email protected] ~]# yum install httpd -y
配置httpd
mod_Proxy_balancer
模块文档
[[email protected] ~]# cd /etc/httpd/conf.d/ [[email protected] 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> [[email protected] conf.d]# service httpd start #启动httpd
测试负载均衡效果
实现session sticky
如果
tomcat
运行着一个动态站点, 那么上面这种byrequest
的负载均衡调度算法就有很大问题了, 可能刚登录站点再刷新又回到没有登录的状态了, 所以我们就要实现session sticky
, 其实session sticky
就是我们之前lvs
的sh算法, 和nginx
的ip_hash
实现的效果
编辑httpd
配置文件
[[email protected] ~]# 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> [[email protected] 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
作配置文件
[[email protected] 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
文件
[[email protected] conf]# cd /data/webapps/ [[email protected] webapps]# cp /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml WEB-INF/ #拷贝一份模板 [[email protected] webapps]# vim WEB-INF/web.xml #添加下面这一行,在</web-app>内 <distributable/> ##注意: 这里是node3 [[email protected] webapps]# scp node2.anyisalin.com:/usr/local/tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml #复制node2配置文件 [[email protected] webapps]# scp node2.anyisalin.com:/data/webapps/WEB-INF/web.xml /data/webapps/WEB-INF/ [[email protected] webapps]# catalina.sh stop #重启tomcat [[email protected] webapps]# catalina.sh start [[email protected] webapps]# catalina.sh stop #重启tomcat [[email protected] webapps]# catalina.sh start
session cluster
测试
如下图, 现在我们即使使用byrequests
算法也不会丢失sesssion
总结
我们本文实现了
tomcat
的负载均衡和session
保持的各种方法, 但是还是有很大问题, 我们试想在用户并发高的场景下, 多台tomcat
服务器一直在多播, 很可能造成网络拥塞, 所以我们还有一种解决方案session server
, 使用单台服务器保存用户的session
信息, 我们会在下篇文章向大家介绍!作者水平很低, 如果有错误及时指出, 如果你觉得本文写的好请点一波赞~(≧▽≦)/~
作者: AnyISaIln QQ: 1449472454
感谢: MageEdu