高性能Web服务之Httpd负载均衡Tomcat实现Session Sticky及Session Cluster

Httpd负载均衡Tomcat实现Session Sticky及Session Cluster架构如下所示:

实现过程如下:

配置tomcat服务(tomcat1\tomcat2)

(1)安装JDK

# rpm -ivh jdk-7u9-linux-x64.rpm 
--安装JDK后生成的文件
# cd /usr/java/ ; ll
total 4
lrwxrwxrwx  1 root root   16 Sep 27 09:09 default -> /usr/java/latest
drwxr-xr-x 10 root root 4096 Sep 27 09:09 jdk1.7.0_09
lrwxrwxrwx  1 root root   21 Sep 27 09:09 latest -> /usr/java/jdk1.7.0_09

--配置JDK环境变量
# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.7.0_09
export PATH=$PATH:$JAVA_HOME/bin
--执行使环境变量生效
# . /etc/profile.d/java.sh
--测试如下:
# java -version
java version "1.7.0_45"        --jdk版本
OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

(2)安装tomcat

--解压tomcat包至/usr/local下
# tar xf apache-tomcat-7.0.72.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv apache-tomcat-7.0.72 tomcat
--配置tomcat环境变量
# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
# . /etc/profile.d/tomcat.sh
--测试如下:
# catalina.sh version
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.7.0_09
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.67
Server built:   Dec 7 2015 13:07:11 UTC
Server number:  7.0.72.0
OS Name:        Linux
OS Version:     2.6.32-431.el6.x86_64
Architecture:   amd64
JVM Version:    1.7.0_09-b05
JVM Vendor:     Oracle Corporation

--为tomcat提供srv启动脚本
# vim /etc/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
# 
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
# JAVA_OPTS=‘-Xms64m -Xmx128m‘
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME

case $1 in
start)
  $CATALINA_HOME/bin/catalina.sh start;;
stop)
  $CATALINA_HOME/bin/catalina.sh stop;;
restart)
  $CATALINA_HOME/bin/catalina.sh stop
  sleep 2
  $CATALINA_HOME/bin/catalina.sh start;;
*)
  echo "Usage: `basename $0` {start|stop|restart}"
  exit 1
  ;;
esac

# chmod +x /etc/init.d/tomcat
# chkconfig --add tomcat
# service tomcat start

--检查tomacat默认监听端口如下所示:
# ss -tunlp | grep java
tcp    LISTEN     0      100                   :::8080                 :::*      users:(("java",19525,42))
tcp    LISTEN     0      1       ::ffff:127.0.0.1:8005                 :::*      users:(("java",19525,47))
tcp    LISTEN     0      100                   :::8009                 :::*      users:(("java",19525,43))

(3)配置虚拟主机如下所示(两台tomcat都要配置):

# vim /usr/local/tomcat/conf/server.xml 
#设置默认虚拟主机为www.samlee.com #第二台tomcatserver的jvmRoute设置为TomcatB
<Engine name="Catalina" defaultHost="www.samlee.com" jvmRoute="TomcatA">
#添加虚拟主机:
<Host name="www.samlee.com" appBase="/web/webapps/" unpackWARS="true" autoDeploy="true">
  <Context path="" docBase="/web/webapps" reloadable="true" />
   <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs"
      prefix="samlee_access_log." suffix=".txt"
      pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

#创建虚拟主机目录:
# mkdir -pv /web/webapps/{WEB-INF,META-INF,classes,lib}

(4)创建网页文件(两台tomcat都要配置):

tomcatA:
# vim /web/webapps/index.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA.samlee.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("samlee.com","samlee.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

tomcatB:
# vim /web/webapps/index.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="blue">TomcatB.samlee.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("samlee.com","samlee.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

重启tomcat服务部署:

# service tomcat stop
# service tomcat start

访问测试如下:

配置httpd 实现负载均衡反向代理tomcat

配置文件如下所示:

# vim /etc/httpd/conf.d/proxy.conf
<Proxy balancer://lbcluster>
  BalancerMember ajp://192.168.56.11:8009 loadfactor=1 route=TomcatA
  BalancerMember ajp://192.168.56.12:8009 loadfactor=1 route=TomcatB
</Proxy>

<VirtualHost *:80>
  ServerName www.samlee.com
  ProxyVia on
  ProxyRequests off
  ProxyPassReverse / balancer://lbcluster/
  ProxyPass / balancer://lbcluster/
</VirtualHost>

重启httpd服务访问测试如下所示:

# service httpd restart

测试如下:

以上我们可以看到反向代理及负载均衡已经生效。

配置httpd 实现session sticky会话绑定

如果tomcat运行着一个动态站点, 那么上面这种byrequest的负载均衡调度算法就有很大问题了, 可能刚登录站点再刷新又回到没有登录的状态了, 所以我们就要实现session sticky, 其实session sticky就是我们之前lvs的sh算法, 和nginx的ip_hash实现的效果

配置文件如下所示:

# vim /etc/httpd/conf.d/proxy.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://lbcluster>
  BalancerMember ajp://192.168.56.11:8009 loadfactor=1 route=TomcatA
  BalancerMember ajp://192.168.56.12:8009 loadfactor=1 route=TomcatB
  ProxySet stickysession=ROUTEID
</Proxy>

<VirtualHost *:80>
  ServerName www.samlee.com
  ProxyVia on
  ProxyRequests off
  ProxyPassReverse / balancer://lbcluster/
  ProxyPass / balancer://lbcluster/
</VirtualHost>

重启httpd服务访问测试如下所示:

# service httpd restart

测试如下:

如上图所示,显示已经成功将session会话绑定在tomcatA主机上了。

配置tomcat实现session cluster 会话信息共享复制:

*使用session sticky会有很多问题, 如果某台主机宕机了, 那么用户的session就丢失了, 所以我们还可以通过session cluster保存用户会话.

**什么是Session Cluster?? 正常情况下session信息是保存在用户所访问的服务器上,服务器宕机, 用户的session就丢失了, 但是我们可以通过session cluster的方式来实现将用户的session信息保存在后端所有的服务器上, 这样来, 无论用户在访问哪一台服务器,session都不会丢失.

四种常见的session manager

**StandardManager
**PersistentManager: 可以将session信息保存在持久存储中
**DeltaManager: 将session信息通过多播的形式共享到其他节点
**BackupManager: 将session信息共享到特定的一个节点上

在配置tomcat前,先将httpd配置的session sticky取消:

构建DeltaManager集群步骤:
    1、在各节点的server.xml的engine或host容器添加如上内容;注意修改MemberShip组件中的多播地址address="228.0.0.4",建议修改Receiver中的address为本机能够传递心跳信息的地址;
    2、在各节点为使用组播地址添加组播路由,格式:
        route add -net $MCAST_ADDRESS netmask 255.255.255.255 dev eth0
    3、在相应应用程序的web.xml中添加<distributable\>;

编辑配置tomcat配置文件如下所示(两台tomcat主机都要配置):

下列内容放在<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="192.168.56.12"   --这里修改该本机IP地址
                  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.JvmRouteSessionIDBinderListener"/>
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>

配置WEB-INF中的web.xml文件如下:

# cp /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml /web/webapps/WEB-INF/
# vim /web/webapps/WEB-INF/web.xml 
#添加下面这一行,在</web-app>内
<distributable/>

--复制配置文件web.xml至tomcatA主机上
# scp /web/webapps/WEB-INF/web.xml [email protected]:/web/webapps/WEB-INF/
--复制配置文件server.xml至tomcatA主机上,并按要求修改IP地址及虚拟主机jvmRoute
# scp /usr/local/tomcat/conf/server.xml [email protected]:/usr/local/tomcat/conf/

为各tomcat节点添加组播路由地址(两台tomcat主机都要配置):

route add -net 228.0.1.7 netmask 255.255.255.255 dev eth0

重启tomcat服务

# service tomcat stop
# service tomcat start

访问测试如下所示:

上图我们看到session会话ID访问后一直没有,证明已经配置会话共享成功了。

时间: 2025-01-02 23:34:52

高性能Web服务之Httpd负载均衡Tomcat实现Session Sticky及Session Cluster的相关文章

Apache Httpd负载均衡Tomcat并实现Session Sticky和Session Cluster 大纲

Apache Httpd负载均衡Tomcat并实现Session Sticky和Session Cluster 大纲 前言 实验拓扑 实验步骤 安装配置tomcat 安装配置Apache Httpd并测试 实现session sticky 实现Session Cluster 总结 前言 上篇文章我们介绍如何构建一个LANMT平台并搭建一个jspxcms, 这次我们介绍使用apache httpd负载均衡Tomcat并实现Session Sticky和Session Cluster 实验拓扑 实验

haproxy、nginx以及httpd负载均衡tomcat主机,seesion保持问题

**实验环境** CentOS 7 haproxy(nginx):172.16.61.4(node4) httpd+tomcat:172.16.61.7(node7) 172.16.61.8(node8) 一.使用nginx做负载均衡 **配置tomcat以及httpd** <Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat8">   #在node8节点添加

高性能Web服务之Httpd+Tomcat实现负债均衡反向代理实现

httpd作为前端的反向代理,那有两种选择,一是利用"proxy_module"这个代理框架下的"proxy_http_module"与"proxy_ajp_module"这两个代理模块,这两个代理模块是独自工作的,二是利用"mod_jk"模块实现httpd的反向代理至后端tomcat. 下面通过以下架构部署httpd+tomcat实现方向代理: 反向代理系统架构规划如下: 服务器角色 服务器IP httpd eth0:172

nginx提供web服务和实现负载均衡

##############nginx直接作为web服务站点###########背景:一台服务器建立两个web服务站点1)mkdir  /web1  /web2  ##建立二根个目录cd /web1vim index.htmlwww.web1.org    ##随便写东西 cd /web2vim index.html  www.web2.org    ##随便写东西和第一个不一样就行2)vim  /usr/local/nginx/conf/nginx.conf  ##添加以下参数 server

Tomcat(五):nginx/httpd + tomcat及负载均衡tomcat

*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-template_comment, .diff .hljs-header, .hljs-javadoc { color: #998; font-style: italic; } .hljs-keyword, .css .rule .hljs-keyword, .h

apache基于mod_jk模块实现代理及负载均衡Tomcat Cluster

一.基于mod_jk模块实现apache代理tomcat 上篇博文已经学习了nginx代理和负载均衡tomcat及apache基于mod_proxy模块代理tomcat; 现在来学习下apache基于mod_jk模块实现代理及负载均衡Tomcat Cluster 1.基于httpd代理tomcat时可以使用httpd的两个模块 1)mod_jk:第三方模块 mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议

Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP)

Web服务和应用是目前信息技术领域的热门技术.如何使用Docker来运行常见的Web服务器(包括Apache.Nginx.Tomcat等),以及一些常用应用(LAMP.CMS等).包括具体的镜像构建方法与使用步骤. 两种创建镜像的过程.其中一些操作比较简单的镜像使用Dockerfile来创建,而像Weblogic这样复杂的应用,则使用commit方式来创建. Apache Apache是一个高稳定性的.商业级别的开源Web服务器.目前Apache已经是世界使用排名第一的Web服务器软件.由于其良

WEB 集群与负载均衡(一)基本概念-上

Web集群是由多个同时运行同一个web应用的服务器组成,在外界看来就像一个服务器一样,这多台服务器共同来为客户提供更高性能的服务.集群更标准的定义是:一组相互独立的服务器在网络中表现为单一的系统,并以单一系统的模式加以管理,此单一系统为客户工作站提供高可靠性的服务.    而负载均衡的任务就是负责多个服务器之间(集群内)实现合理的任务分配,使这些服务器(集群)不会出现因某一台超负荷.而其他的服务器却没有充分发挥处理能力的情况.负载均衡有两个方面的含义:首先,把大量的并发访问或数据流量分担到多台节

Web基础架构:负载均衡和LVS

在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库.缓存等等). 一.负载均衡的作用 负载均衡设备的任务就是作为应用服务器流量的入口,首先挑选最合适的一台服务器,然后将客户端的请求转发给这台服务器处理,实现客户端到真实服务端 的透明转发.最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器作为计算资源.存储资源,由某台管理服务器封装成一个服务对外提供,客户端 不需